博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Learn python the eighth day
阅读量:4659 次
发布时间:2019-06-09

本文共 16185 字,大约阅读时间需要 53 分钟。

1 BeautifulSoup 解析库 2 MongoDB 存储库 3 requests-html请求库 ''' # pip3 install beautiful  安装bs4 # pip3 install lxml    下载lmxl解析器
1 html_doc = """ 2 The Dormouse's story 3  4 

$37

5 6

Once upon a time there were three little sisters; and their names were 7 Elsie, 8 Lacie and 9 Tillie;10 and they lived at the bottom of a well.

11 12

...

13 """14 15 # 从bs4中导入BeautifulSoup416 from bs4 import BeautifulSoup17 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 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) #$3722 23 # 5 嵌套选择24 print(soup.html.head)25 26 27 # 628 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 # 735 print(soup.p.parent) # 获取p标签的父亲节点36 37 # 返回的是生成器对象38 print(soup.p.parents) # 获取p标签的所有祖先节点39 print(list(soup.p.parents))40 41 # 842 # 找下一个兄弟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 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 # attrs17 # 查找第一个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 # text26 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 re39 # name40 p_tag = soup.find(name=re.compile('p'))41 print(p_tag)42 43 # 列表过滤器44 import re45 # name46 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 tag60 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"}).text24 print(down_num)25 26 import re27 # 大小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 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集合中 '''
1 import requests  2 from bs4 import BeautifulSoup  3 from pymongo import MongoClient  4 # 连接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 def get_page(url): 13     response = requests.get(url) 14     return response 15  16  17 # 2、开始解析 18 # 解析详情页 19 def parse_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"}).text 27 except Exception: 28 # 若有异常,设置为None 29 name = None 30 # print(name) 31 32 # 好评率 33 try: 34 love = soup.find(name='span', attrs={
"class": "love"}).text 35 36 except Exception: 37 love = None 38 # print(love) 39 40 # 评论数 41 try: 42 commit_num = soup.find(name='a', attrs={
"class": "comment-open"}).text 43 except Exception: 44 commit_num = None 45 # print(commit_num) 46 47 # 小编点评 48 try: 49 commit_content = soup.find(name='div', attrs={
"class": "con"}).text 50 except Exception: 51 commit_content = None 52 # print(commit_content) 53 54 # app下载链接 55 56 try: 57 download_url = soup.find(name='a', attrs={
"class": "normal-dl-btn"}).attrs['href'] 58 except Exception: 59 # 若有异常,设置为None 60 download_url = None 61 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 and download_url : 78 detail_data = { 79 'name': name, 80 'love': love, 81 'commit_num': commit_num, 82 'commit_content': commit_content, 83 'download_url': download_url 84 } 85 86 # 若love没有值,则设置为 没人点赞,很惨 87 if not love: 88 detail_data = { 89 'name': name, 90 'love': "没人点赞,很惨", 91 'commit_num': commit_num, 92 'commit_content': commit_content, 93 'download_url': download_url 94 } 95 # 若download_url没有值,则设置为 没有安装包 96 if not download_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 def parse_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 in app_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 import re133 # 大小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 def main():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

 

转载于:https://www.cnblogs.com/feiyufei/p/11061685.html

你可能感兴趣的文章
开源控Meteor的个人资料
查看>>
kafka在zookeeper中的存储结构
查看>>
linux上FTP服务器搭建
查看>>
.net 使用AgsXMPP与openfire连接,实现跨平台信息流通。
查看>>
DP动态规划【专辑@AbandonZHANG】
查看>>
Android TextureView简易教程
查看>>
fatal: the remote end hung up unexpectedly
查看>>
Delphi-操作剪贴板
查看>>
hdu 1029
查看>>
Docker 容器的网络连接 & 容器互联
查看>>
吾爱专题脱壳练习----压缩壳练习之三
查看>>
LeetCode -- Palindrome Linked List
查看>>
栈应用——逆波兰式表达式的值
查看>>
vscode 快速生成html
查看>>
HTML5 全屏化操作功能
查看>>
返本求源——DOM元素的特性与属性
查看>>
4、C#进阶:MD5加密、进程、线程、GDI+、XML、委托
查看>>
部署DLL webservices 若干费脑点
查看>>
zabbix监控报错zabbix server is not running解决方法
查看>>
python面向对象实例
查看>>