1 BeautifulSoup 解析库
2 MongoDB 存储库
3 requests-html请求库
'''
# pip3 install beautiful 安装bs4
# pip3 install lxml 下载lmxl解析器
1 html_doc = """
2
The Dormouse's story3 4$37
56
Once upon a time there were three little sisters; and their names were7 Elsie,8 Lacie and9 Tillie;10 and they lived at the bottom of a well.
1112
...
13 """14
15 #从bs4中导入BeautifulSoup4
16 from bs4 importBeautifulSoup17 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))
View Code
bs4之遍历文档树
'''
遍历文档树: 1 直接使用
2 获取标签的名称
3 获取标签的属性
4 获取标签的内容
5 嵌套选择
6 子节点、子孙节点
7 父节点、祖先节点
8 兄弟节点
'''
1 html_doc = """
2
The Dormouse's story$37
Once upon a timethere were three little sisters; and their names weretankElsie,Lacie andTillie;and they lived at the bottom of a well.
...
3 """4 from bs4 importBeautifulSoup5 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))
View Code
bs4之搜索文档树
'''
搜索文档树: find() # 找一个
find_all() # 找多个
标签查找与属性查找:
标签: name # 属性匹配
attrs #属性查找匹配
text # 文本匹配
字符串过滤器 : 字符串全局匹配
正则过滤器 : re模块匹配
列表过滤器 : 列表内的数据匹配
bool过滤器 : True匹配
方法过滤器 : 用于一些要的属性以及不需要的属性查找。
属性: class_
id
'''
1 html_doc = """
The Dormouse's story$37
Once upon a time there were three little sisters; and their names weretankElsie,Lacie andTillie;and they lived at the bottom of a well.
...
"""2
3
4 from bs4 importBeautifulSoup5 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 importre39 #name
40 p_tag = soup.find(name=re.compile('p'))41 print(p_tag)42
43 #列表过滤器
44 importre45 #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 defhave_id_class(tag):58 if tag.name == 'a' and tag.has_attr('id') and tag.has_attr('class'):59 returntag60
61 tag = soup.find(name=have_id_class)62 print(tag)
View Code
# 爬取豌豆荚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 importrequests2 from bs4 importBeautifulSoup3 #1、发送请求
4 defget_page(url):5 response =requests.get(url)6 returnresponse7
8 #2、开始解析
9 #解析主页
10 defparse_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 inapp_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"}).text24 print(down_num)25
26 importre27 #大小
28 size = soup.find(name='span', text=re.compile("\d+MB")).text29 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 defmain():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()
View Code
# 提取豌豆荚app数据(提取游戏详情页)
1 importrequests2 from bs4 importBeautifulSoup3 #1、发送请求
4 defget_page(url):5 response =requests.get(url)6 returnresponse7
8 #2、开始解析
9 #解析详情页
10 defparse_detail(text):11 soup = BeautifulSoup(text, 'lxml')12 #print(soup)
13
14 #app名称
15 name = soup.find(name="span", attrs={"class": "title"}).text16 #print(name)
17
18 #好评率
19 love = soup.find(name='span', attrs={"class": "love"}).text20 #print(love)
21
22 #评论数
23 commit_num = soup.find(name='a', attrs={"class": "comment-open"}).text24 #print(commit_num)
25
26 #小编点评
27 commit_content = soup.find(name='div', attrs={"class": "con"}).text28 #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 defparse_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 inapp_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"}).text67 print(down_num)68
69 importre70 #大小
71 #根据文本正则获取到文本中包含 数字 + MB(\d+代表数字)的span标签中的文本
72 size = soup.find(name='span', text=re.compile("\d+MB")).text73 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 defmain():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()
View Code
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 importMongoClient2 #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 indata_s:51 print(data)52
53 ## 查看一条数据
54 #data = client['cc_db']['people'].find_one()
55 #print(data)
View Code
'''
作业:
基于豌豆荚爬取剩下的简介截图图片地址、网友评论
把豌豆荚爬取的数据插入mongoDB中
- 创建一个wandoujia库
- 把主页的数据存放一个名为index集合中
- 把详情页的数据存放一个名为detail集合中
'''
1 importrequests2 from bs4 importBeautifulSoup3 from pymongo importMongoClient4 #连接MongoDB客户端
5 client = MongoClient('localhost', 27017)6 #创建或选择wandoujia库,index集合
7 index_col = client['wandoujia']['index']8 #创建或选择wandoujia库,detail集合
9 detail_col = client['wandoujia']['detail']10
11 #1、发送请求
12 defget_page(url):13 response =requests.get(url)14 returnresponse15
16
17 #2、开始解析
18 #解析详情页
19 defparse_detail(text):20
21 soup = BeautifulSoup(text, 'lxml')22 #print(soup)
23
24 #app名称
25 try:26 name = soup.find(name="span", attrs={"class": "title"}).text27 exceptException:28 #若有异常,设置为None
29 name =None30 #print(name)
31
32 #好评率
33 try:34 love = soup.find(name='span', attrs={"class": "love"}).text35
36 exceptException:37 love =None38 #print(love)
39
40 #评论数
41 try:42 commit_num = soup.find(name='a', attrs={"class": "comment-open"}).text43 exceptException:44 commit_num =None45 #print(commit_num)
46
47 #小编点评
48 try:49 commit_content = soup.find(name='div', attrs={"class": "con"}).text50 exceptException:51 commit_content =None52 #print(commit_content)
53
54 #app下载链接
55
56 try:57 download_url = soup.find(name='a', attrs={"class": "normal-dl-btn"}).attrs['href']58 exceptException:59 #若有异常,设置为None
60 download_url =None61
62 #print(download_url)
63
64 print(65 f'''
66 ============= tank ==============67 app名称:{name}68 好评率: {love}69 评论数: {commit_num}70 小编点评: {commit_content}71 app下载链接: {download_url}72 ============= end ==============73 '''
74 )75
76 #判断所有数据都存在,正常赋值
77 if name and love and commit_num and commit_content anddownload_url :78 detail_data ={79 'name': name,80 'love': love,81 'commit_num': commit_num,82 'commit_content': commit_content,83 'download_url': download_url84 }85
86 #若love没有值,则设置为 没人点赞,很惨
87 if notlove:88 detail_data ={89 'name': name,90 'love': "没人点赞,很惨",91 'commit_num': commit_num,92 'commit_content': commit_content,93 'download_url': download_url94 }95 #若download_url没有值,则设置为 没有安装包
96 if notdownload_url:97 detail_data ={98 'name': name,99 'love': love,100 'commit_num': commit_num,101 'commit_content': commit_content,102 'download_url': '没有安装包'
103 }104
105
106
107 #插入详情页数据
108 detail_col.insert(detail_data)109 print(f'{name}app数据插入成功!')110
111 #解析主页
112 defparse_index(data):113 soup = BeautifulSoup(data, 'lxml')114
115 #获取所有app的li标签
116 app_list = soup.find_all(name='li', attrs={"class": "card"})117 for app inapp_list:118 #print(app)
119 #print('tank' * 1000)
120 #print('tank *' * 1000)
121 #print(app)
122 #图标地址
123 #获取第一个img标签中的data-original属性
124 img = app.find(name='img').attrs['data-original']125 #print(img)
126
127 #下载次数
128 #获取class为install-count的span标签中的文本
129 down_num = app.find(name='span', attrs={"class": "install-count"}).text130 #print(down_num)
131
132 importre133 #大小
134 #根据文本正则获取到文本中包含 数字 + MB(\d+代表数字)的span标签中的文本
135 size = soup.find(name='span', text=re.compile("\d+MB")).text136 #print(size)
137
138 #详情页地址
139 #获取class为detail-check-btn的a标签中的href属性
140 #detail_url = soup.find(name='a', attrs={"class": "name"}).attrs['href']
141 #print(detail_url)
142
143 #详情页地址
144 detail_url = app.find(name='a').attrs['href']145 #print(detail_url)
146
147 #拼接数据
148 index_data ={149 'img': img,150 'down_num': down_num,151 'size': size,152 'detail_url': detail_url153 }154
155 #插入数据
156 index_col.insert(index_data)157 print('主页数据插入成功!')158
159 #3、往app详情页发送请求
160 response =get_page(detail_url)161
162 #4、解析app详情页
163 parse_detail(response.text)164
165
166 defmain():167 for line in range(1, 33):168 url = f"https://www.wandoujia.com/wdjweb/api/category/more?catId=6001&subCatId=0&page={line}&ctoken=FRsWKgWBqMBZLdxLaK4iem9B"
169
170 #1、往app接口发送请求
171 response =get_page(url)172 #print(response.text)
173 print('*' * 1000)174 #反序列化为字典
175 data =response.json()176
177 #获取接口中app标签数据
178 app_li = data['data']['content']179 #print(app_li)
180
181 #2、解析app标签数据
182 parse_index(app_li)183
184 #执行完所有函数关闭mongoDB客户端
185 client.close()186
187 if __name__ == '__main__':188 main()
View Code