1 BeautifulSoup 解析库
2 MongoDB 存储库
3 requests-html请求库
'''
# pip3 install beautiful 安装bs4
# pip3 install lxml 下载lmxl解析器
1 html_doc = """ 2 <html><head><title>The Dormouse's story</title></head> 3 <body> 4 <p class="sister"><b>$37</b></p> 5 6 <p class="story" id="p">Once upon a time there were three little sisters; and their names were 7 <a href="http://example.com/elsie" class="sister" >Elsie</a>, 8 <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and 9 <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; 10 and they lived at the bottom of a well.</p> 11 12 <p class="story">...</p> 13 """ 14 15 # 从bs4中导入BeautifulSoup4 16 from bs4 import BeautifulSoup 17 soup=BeautifulSoup(html_doc,'lxml') 18 19 # 调用BeautifulSoup实例化得到一个soup对象 20 # 参数一 : 解析文本 21 # 参数二 : 22 # 参数三 : 解析器(html.parser,lxml......) 23 print(soup) 24 print('*' * 100) 25 print(type(soup))
bs4之遍历文档树
'''
遍历文档树: 1 直接使用
2 获取标签的名称
3 获取标签的属性
4 获取标签的内容
5 嵌套选择
6 子节点、子孙节点
7 父节点、祖先节点
8 兄弟节点
'''
1 html_doc = """ 2 <html><head><title>The Dormouse's story</title></head><body><p class="sister"><b>$37</b></p><p class="story" id="p">Once upon a timethere were three little sisters; and their names were<b>tank</b><a href="http://example.com/elsie" class="sister" >Elsie</a>,<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;and they lived at the bottom of a well.<hr></hr></p><p class="story">...</p> 3 """ 4 from bs4 import BeautifulSoup 5 soup=BeautifulSoup(html_doc,'lxml') 6 7 # 1 直接使用 8 9 print(soup.p) # 查找第一个p标签 10 print(soup.a) # 查找第一个a标签 11 12 # 2 获取标签的名称 13 print(soup.head.name) # 获取head标签的名称 14 15 # 3 获取标签的属性 16 print(soup.a.attrs) # 获取a标签中所有属性 17 print(soup.a.attrs['href']) # 获取a标签中的href属性 18 19 20 # 4 获取标签的内容 21 print(soup.html.text) #$37 22 23 # 5 嵌套选择 24 print(soup.html.head) 25 26 27 # 6 28 print(soup.body.children) # body所有子节点,返回的是迭代器对象 29 print(list.(soup.body.children)) # 强转成列表类型 30 print(soup.body.descendants) # 子孙节点 31 print(list(soup.body.descendants)) 32 33 34 # 7 35 print(soup.p.parent) # 获取p标签的父亲节点 36 37 # 返回的是生成器对象 38 print(soup.p.parents) # 获取p标签的所有祖先节点 39 print(list(soup.p.parents)) 40 41 # 8 42 # 找下一个兄弟 43 print(soup.p.next_sibling) 44 # 找下面所有的兄弟,返回的是生成器类型 45 print(soup.p.next_siblings) 46 print(list(soup.p.next_siblings)) 47 48 # 找上一个兄弟 49 print(soup.previous_sibling) 50 # 找到a节点上面面所有的兄弟节点 51 print(soup.previous_siblings) 52 print(list(soup.a.previous_siblings))
bs4之搜索文档树
'''
搜索文档树: find() # 找一个
find_all() # 找多个
标签查找与属性查找:
标签: name # 属性匹配
attrs #属性查找匹配
text # 文本匹配
字符串过滤器 : 字符串全局匹配
正则过滤器 : re模块匹配
列表过滤器 : 列表内的数据匹配
bool过滤器 : True匹配
方法过滤器 : 用于一些要的属性以及不需要的属性查找。
属性: class_
id
'''
1 html_doc = """<html><head><title>The Dormouse's story</title></head><body><p class="sister"><b>$37</b></p><p class="story" id="p">Once upon a time there were three little sisters; and their names were<b>tank</b><a href="http://example.com/elsie" class="sister" >Elsie</a>,<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;and they lived at the bottom of a well.<hr></hr></p><p class="story">...</p>""" 2 3 4 from bs4 import BeautifulSoup 5 soup = BeautifulSoup(html_doc, 'lxml') 6 7 # 字符串过滤器 8 # name 9 p_tag = soup.find(name='p') 10 print(p_tag) # 根据文本p查找某个标签 11 # 找到所有标签名为p的节点 12 tag_s1 = soup.find_all(name='p') 13 print(tag_s1) 14 15 16 # attrs 17 # 查找第一个class为sister的节点 18 p = soup.find(attrs={"class": "sister"}) 19 print(p) 20 # 查找所有class为sister的节点 21 tag_s2 = soup.find_all(attrs={"class": "sister"}) 22 print(tag_s2) 23 24 25 # text 26 text = soup.find(text="$37") 27 print(text) 28 29 30 # 配合使用: 31 # 找到一个id为link2、文本为Lacie的a标签 32 a_tag = soup.find(name="a", attrs={"id": "link2"}, text="Lacie") 33 print(a_tag) 34 35 36 37 # 正则过滤器 38 import re 39 # name 40 p_tag = soup.find(name=re.compile('p')) 41 print(p_tag) 42 43 # 列表过滤器 44 import re 45 # name 46 tags = soup.find_all(name=['p', 'a', re.compile('html')]) 47 print(tags) 48 49 # - bool过滤器 50 # True匹配 51 # 找到有id的p标签 52 p = soup.find(name='p', attrs={"id": True}) 53 print(p) 54 55 # 方法过滤器 56 # 匹配标签名为a、属性有id没有class的标签 57 def have_id_class(tag): 58 if tag.name == 'a' and tag.has_attr('id') and tag.has_attr('class'): 59 return tag 60 61 tag = soup.find(name=have_id_class) 62 print(tag)
# 爬取豌豆荚app数据(提取游戏主页)
'''
主页:
图标地址、下载次数、大小、详情页地址
详情页:
游戏名、图标名、好评率、评论数、小编点评、简介、网友评论、1-5张截图链接地址、下载地址
https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page=1&ctoken=FRsWKgWBqMBZLdxLaK4iem9B
https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page=2&ctoken=FRsWKgWBqMBZLdxLaK4iem9B
https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page=3&ctoken=FRsWKgWBqMBZLdxLaK4iem9B
32
'''
1 import requests 2 from bs4 import BeautifulSoup 3 # 1、发送请求 4 def get_page(url): 5 response = requests.get(url) 6 return response 7 8 # 2、开始解析 9 # 解析主页 10 def parse_index(data): 11 soup = BeautifulSoup(data, 'lxml') 12 13 # 获取所有app的li标签 14 app_list = soup.find_all(name='li', attrs={"class": "card"}) 15 for app in app_list: 16 # print('tank *' * 1000) 17 # print(app) 18 # 图标地址 19 img = app.find(name='img').attrs['data-original'] 20 print(img) 21 22 # 下载次数 23 down_num = app.find(name='span', attrs={"class": "install-count"}).text 24 print(down_num) 25 26 import re 27 # 大小 28 size = soup.find(name='span', text=re.compile("\d+MB")).text 29 print(size) 30 31 # 详情页地址 32 detail_url = soup.find(name='a', attrs={"class": "detail-check-btn"}).attrs['href'] 33 print(detail_url) 34 35 36 def main(): 37 for line in range(1, 33): 38 url = f"https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page={line}&ctoken=FRsWKgWBqMBZLdxLaK4iem9B" 39 40 # 1、往app接口发送请求 41 response = get_page(url) 42 # print(response.text) 43 print('*' * 1000) 44 # 反序列化为字典 45 data = response.json() 46 # 获取接口中app标签数据 47 app_li = data['data']['content'] 48 # print(app_li) 49 # 2、解析app标签数据 50 parse_index(app_li) 51 52 53 if __name__ == '__main__': 54 main()
# 提取豌豆荚app数据(提取游戏详情页)
1 import requests 2 from bs4 import BeautifulSoup 3 # 1、发送请求 4 def get_page(url): 5 response = requests.get(url) 6 return response 7 8 # 2、开始解析 9 # 解析详情页 10 def parse_detail(text): 11 soup = BeautifulSoup(text, 'lxml') 12 # print(soup) 13 14 # app名称 15 name = soup.find(name="span", attrs={"class": "title"}).text 16 # print(name) 17 18 # 好评率 19 love = soup.find(name='span', attrs={"class": "love"}).text 20 # print(love) 21 22 # 评论数 23 commit_num = soup.find(name='a', attrs={"class": "comment-open"}).text 24 # print(commit_num) 25 26 # 小编点评 27 commit_content = soup.find(name='div', attrs={"class": "con"}).text 28 # print(commit_content) 29 30 # app下载链接 31 download_url = soup.find(name='a', attrs={"class": "normal-dl-btn"}).attrs['href'] 32 # print(download_url) 33 34 print( 35 f''' 36 ============= tank ============== 37 app名称:{name} 38 好评率: {love} 39 评论数: {commit_num} 40 小编点评: {commit_content} 41 app下载链接: {download_url} 42 ============= end ============== 43 ''' 44 ) 45 46 47 48 # 解析主页 49 def parse_index(data): 50 soup = BeautifulSoup(data, 'lxml') 51 52 # 获取所有app的li标签 53 app_list = soup.find_all(name='li', attrs={"class": "card"}) 54 for app in app_list: 55 # print(app) 56 # print('tank' * 1000) 57 # print('tank *' * 1000) 58 # print(app) 59 # 图标地址 60 # 获取第一个img标签中的data-original属性 61 img = app.find(name='img').attrs['data-original'] 62 print(img) 63 64 # 下载次数 65 # 获取class为install-count的span标签中的文本 66 down_num = app.find(name='span', attrs={"class": "install-count"}).text 67 print(down_num) 68 69 import re 70 # 大小 71 # 根据文本正则获取到文本中包含 数字 + MB(\d+代表数字)的span标签中的文本 72 size = soup.find(name='span', text=re.compile("\d+MB")).text 73 print(size) 74 75 # 详情页地址 76 # 获取class为detail-check-btn的a标签中的href属性 77 # detail_url = soup.find(name='a', attrs={"class": "name"}).attrs['href'] 78 # print(detail_url) 79 80 # 详情页地址 81 detail_url = app.find(name='a').attrs['href'] 82 print(detail_url) 83 84 # 3、往app详情页发送请求 85 response = get_page(detail_url) 86 87 # 4、解析app详情页 88 parse_detail(response.text) 89 90 91 def main(): 92 for line in range(1, 33): 93 url = f"https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page={line}&ctoken=FRsWKgWBqMBZLdxLaK4iem9B" 94 95 # 1、往app接口发送请求 96 response = get_page(url) 97 # print(response.text) 98 print('*' * 1000) 99 # 反序列化为字典 100 data = response.json() 101 102 # 获取接口中app标签数据 103 app_li = data['data']['content'] 104 # print(app_li) 105 # 2、解析app标签数据 106 parse_index(app_li) 107 108 109 if __name__ == '__main__': 110 main()
1、BeautifulSoup 解析库
2、MongoDB 存储库
3、requests-html 请求库
BeautifulSoup
1、什么bs4,为什么要使用bs4?
是一个基于re开发的解析库,可以提供一些强大的解析功能。
提高提取数据的效率与爬虫开发效率。
2、安装与使用
pip3 install beautifulsoup4 # 安装bs4
pip3 install lxml # 下载lxml解析器
MongoDB 非关系型数据库
一 安装与使用
1、下载安装
https://www.mongodb.com/download-center/community
2、在C盘创建一个data/db文件夹
- 数据的存放路径
3、mongod启动服务
进入终端,输入mongod启动mongoDB服务。
4、mongo进入mongoDB客户端
打开一个新的终端,输入mongo进入客户端
二 数据库操作
数据库操作:
切换库:
SQL:
use admin; 有则切换,无则报错。
MongoDB:
use tank; 有则切换,无则创建,并切换tank库中。
查数据库:
SQL:
show databases;
MongoDB:
show dbs;
显示的数据库若无数据,则不显示。
删除库:
SQL:
drop database
MongoDB:
db.dropDatabase()
集合操作: MySQL中叫做表。
创建集合:
SQL:
create table f1, f2...
MongoDB:
# 在当前库中通过.来创建集合
db.student
插入数据:
插入多条数据: db.student.insert([{"name1":"cc"},{"name2"]})
插入一条: db.student.insert({"name":"cc"})
查数据:
查找student集合中的所有数据: db.student.find({})
查一条 查找name为cc的记录: db.student.find({"name":"cc"})
三 python链接MongoDB
1、下载第三方模块pymongo
pip3 install pymongo
2、链接mongoDB客户端
client = MongoClient('localhost', 27017)
##pymongo简单使用
1 from pymongo import MongoClient 2 # 1 链接mongoDB客户端 3 # 2 参数一: mongoDB的ip地址 4 # 参数二: mongoDB的端口号 默认:27017 5 6 client=MongoClient('localhost', 27017) 7 #print(client) 8 9 # 2 进入cc_db库,没有则创建 10 print(client['cc_db']) 11 12 # 3 创建集合 13 # print(client['cc_db']['people']) 14 15 # 4 给cc_db库插入数据 16 # # 1) 插入一条 insert_one() 17 # data1={ 18 # 'name':'cc', 19 # 'age':17, 20 # 'sex':'female' 21 # 22 # } 23 # client['cc_db']['people'].insert(data1) 24 25 # 2) 插入多条 insert_many() 26 data1={ 27 'name':'cc', 28 'age':17, 29 'sex':'female' 30 31 } 32 data2={ 33 'name':'cc1', 34 'age':18, 35 'sex':'female' 36 37 } 38 data3={ 39 'name':'cc2', 40 'age':20, 41 'sex':'female' 42 43 } 44 client['cc_db']['people'].insert_many() 45 # 5 查数据 46 # 查看所有数据 47 data_s=client['cc_db']['people'].find() 48 print(data_s) # 49 # 需要循环打印所有数据 50 for data in data_s: 51 print(data) 52 53 # # 查看一条数据 54 # data = client['cc_db']['people'].find_one() 55 # print(data)
'''
作业:
基于豌豆荚爬取剩下的简介截图图片地址、网友评论
把豌豆荚爬取的数据插入mongoDB中
- 创建一个wandoujia库
- 把主页的数据存放一个名为index集合中
- 把详情页的数据存放一个名为detail集合中
'''