Learn python the seventh day

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))
View Code
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))
View Code
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)
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 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()
View Code
# 提取豌豆荚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()
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 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)
View Code
'''
作业:

基于豌豆荚爬取剩下的简介截图图片地址、网友评论

把豌豆荚爬取的数据插入mongoDB中
- 创建一个wandoujia库
- 把主页的数据存放一个名为index集合中
- 把详情页的数据存放一个名为detail集合中
'''

猜你喜欢

转载自www.cnblogs.com/feiyufei/p/11061685.html