learnpythonthe_Learn python the eighth day

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

5

6

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.

11

12

...

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值