python爬虫分析数据_Python爬虫入门 处理数据
BeautifulSoup
处理数据我们需要用到一个强大的第三方库——BeautifulSoup
处理数据分为两步:解析数据 和 提取数据,解析数据指将网页源代码解析成 Python 能“读懂”的格式,而提取数据则是指将网页源代码中无关数据过滤掉,只提取出我们所需要的数据。
解析数据
我们以豆瓣读书 Top250 为例,它的网址是:sjihttps://book.douban.com/top250。
我们来看看如何将其网页源代码解析成 BeautifulSoup 对象:
import requests
from bs4 import BeautifulSoup
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
res = requests.get('https://book.douban.com/top250', headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
我们通过 from bs4 import BeautifulSoup 语句导入 BeautifulSoup,然后使用 BeautifulSoup(res.text, 'html.parser') 语句将网页源代码的字符串形式解析成了 BeautifulSoup 对象。
创建 BeautifulSoup 对象时需要传入两个参数,第一个参数是要解析的 HTML 文本,即网站源代码的字符串形式(res.text)。第二个参数是解析 HTML 的解析器,html.parser 是 Python 中内置的解析器,较为简单方便。
res.text 的类型是字符串,而 soup 的类型是 BeautifulSoup 对象,它俩是完全不同的东西。相比字符串,BeautifulSoup 对象 里有很多强大的方法和属性。通过这些方法和属性,我们就能方便快捷地提取出我们所需要的数据。
提取数据
find() 方法和 find_all() 方法
find():找到符合条件的首个数据
find_all():找到符合条件的所有数据
登录/注册
豆瓣读书 Top 250
豆瓣电影
追风筝的人
解忧杂货店
小王子
注意对比两个输出结果的差异:
soup = BeautifulSoup(res.text, 'html.parser')
print(soup.find('a'))
# 输出:登录/注册
print(soup.find_all('a'))
# 输出:[
# 登录/注册,
# 豆瓣电影,
# 追风筝的人,
# 解忧杂货店,
# 小王子
# ]
上面代码中使用 find() 和 find_all() 方法分别提取了 a 标签 的内容。可以看到,find() 方法返回了第一个 a 标签,而 find_all() 方法则返回了所有的 a 标签。
它俩的用法基本一样,都是传入 HTML 标签名称,返回符合该 HTML 标签的数据。区别是 find() 方法只返回第一个符合条件的标签,而 find_all() 方法返回所有符合条件的标签列表。我想你从它俩的名字中便能领会到这个区别。
除了传入 HTML 标签名称 外,这两个方法还支持传入 HTML 属性 进行筛选,返回符合条件的数据。举个例子:
# 查找 id='doubanapp-tip' 的 div 标签
soup.find('div', id='doubanapp-tip')
# 查找所有 class='rating_nums' 的 span 标签
soup.find_all('span', class_='rating_nums')
Tips:因为 class 是 Python 中定义类的关键字,因此用 class_ 表示 HTML 中的 class。
Tag 对象
BeautifulSoup 将 HTML 中的元素封装成了 Tag 对象。和 BeautifulSoup 对象 一样,Tag 对象 里也有 find() 和 find_all() 方法。因此,我们可以不断地调用这两个方法,一层一层地找到我们需要的数据。我们还是以前面的 HTML 代码为例提取其中的书名:
登录/注册
豆瓣读书 Top 250
豆瓣电影
追风筝的人
解忧杂货店
小王子
我们可以看到,书名在 a 标签 中。但如果直接使用 soup.find_all('a') 的话,第二行的“登录/注册”和第五行的“豆瓣电影”也会被获取到,因此我们需要将这些无效数据过滤掉。
我们分析一下不难发现,书名在 class="item" 的 div 标签 里的 a 标签 内。我们只要先找到所有 class="item" 的 div 标签,然后再找到其中的 a 标签 即可,因此我们可以像下面这样来获取书名的数据:
# 找到所有 class_='item' 的 div 标签
items = soup.find_all('div', class_='item')
for i in items:
# 找到 class_='item' 的 div 标签中的 a 标签
print(i.find('a'))
# 输出:
# 追风筝的人
# 解忧杂货店
# 小王子
这样,我们就找到了所有书名的数据。此时返回的还是 Tag 对象。如果我们只想要书名和对应的链接呢?这就用到了 Tag 对象 的 text 属性和 HTML 属性名取值。
items = soup.find_all('div', class_='item')
for i in items:
tag = i.find('a')
# 获取 text 属性
name = tag.text
# 获取 href 属性值
link = tag['href']
print(name, link)
# 输出:
# 追风筝的人 https://book.douban.com/subject/1770782/
# 解忧杂货店 https://book.douban.com/subject/25862578/
# 小王子 https://book.douban.com/subject/1084336/
我们通过 Tag 对象 的 text 属性拿到了 a 标签里的文字内容,即 追风筝的人 等。然后我们通过和字典取值一样的方式,将 HTML 属性名 作为键,得到了对应属性的值。这里是以 href 属性为例,其他的 HTML 属性也同样可以。
我们来总结一下 Tag 对象 的常用属性和方法:
tag.find:返回符合条件的首个数据
tag.find_all:返回符合条件的所有数据
tag.text:获取标签的文本内容
tag['属性名']:获取HTML标签属性的值
我们通过多次调用 find() 或 find_all() 方法一层层地找到了我们需要的数据。你可能会问,有没有什么方法可以直接就找到我们需要的数据,而不用多次查找吗?
答案是肯定的,需要用到 CSS 选择器
from bs4 import BeautifulSoup
html = '''
小王子
追风筝的人
'''
soup = BeautifulSoup(html, 'html.parser')
print(soup.select('.item.book'))
# 输出:[]
print(soup.select('.item .book'))
# 输出:[
小王子
,
追风筝的人
]
print(soup.select('.item > .book'))
# 输出:[
小王子
]
BeautifulSoup 对象 有一个 select() 方法,我们将 CSS 选择器 传进去即可直接找到我们需要的元素。上面查找在 class="item" 的 div 标签里的a标签的代码就可以这样写:
items = soup.select('div.item a')
for i in items:
name = i.text
link = i['href']
print(name, link)
# 输出:
# 追风筝的人 https://book.douban.com/subject/1770782/
# 解忧杂货店 https://book.douban.com/subject/25862578/
# 小王子 https://book.douban.com/subject/1084336/
编程练习
讲解中的例子是简化过后的豆瓣读书网页源代码,接下来我们实战一下。
打开 https://book.douban.com/top250,分析它的网页源代码,用我们学过的知识点提取出书名和对应的链接。
import requests
from bs4 import BeautifulSoup
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
res = requests.get('https://book.douban.com/top250', headers=headers)
soup = BeautifulSoup(res.text, 'html.parser')
items = soup.find_all('div', class_='pl2')
for i in items:
tag = i.find('a')
name = tag['title']
link = tag['href']
print(name, link)
先,使用 requests 获取了网页源代码,然后将网页源代码的字符串形式通过 BeautifulSoup 解析成了 BeautifulSoup 对象,接着我们通过 BeautifulSoup 对象 的 find() 和 find_all() 方法查找我们需要的数据。
当我们需要的数据无法一次查找到时,我们需要多次调用 find() 和 find_all() 方法来一层层查找。找到需要的数据后,就可以调用 tag.text 或 tag['属性名'] 提取到我们需要的部分了。
我们通过 ''.join(tag.text.split()) 将内容按空格符(包括空格、换行符等)分隔再拼接,这样就去除了所有的空格符。
python爬虫分析数据_Python爬虫入门 处理数据相关推荐
- python唐诗分析综合_Python爬虫抓取唐诗宋词
一 说明 Python语言的爬虫开发相对于其他编程语言是极其高校的,在上一篇文章 爬虫抓取博客园前10页标题带有Python关键字(不区分大小写) 的文章中,我们介绍了使用requests做爬虫开发, ...
- python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)
前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...
- python爬取去哪网数据_Python爬虫入门:使用Python爬取网络数据
1 网络爬虫 引用百度百科的定义:网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本. 简单的说,就是有一个程序可以自动去访问网页. 2 Python爬虫 如何实现爬虫? 简单的讲,一共 ...
- python爬虫天气数据_python爬虫:天气数据的分析
就在前几天还是二十多度的舒适温度,今天一下子就变成了个位数,小编已经感受到冬天寒风的无情了.之前对获取天气都是数据上的搜集,做成了一个数据表后,对温度变化的感知并不直观.那么,我们能不能用python ...
- python爬虫和医学数据_Python爬虫入门教程 24-100 微医挂号网医生数据抓取
1. 微医挂号网医生数据写在前面 今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的 ...
- python爬虫自学路线_python 爬虫学习路线:从入门到进阶
大家好,我是凉拌 今天给大家详解一下我的爬虫学习路线. 对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情.比如有的人则认为先要掌握网页的知识,遂开始 HTML\CSS,结果入了前端的坑,浪费了 ...
- python爬虫知识大全_Python爬虫入门有哪些基础知识点
1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...
- python爬虫文献综述_Python爬虫入门(1):综述
首先爬虫是什么?网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本. 根据我的经验,要学习Python爬虫, ...
- python爬虫文献综述_Python爬虫入门一之综述
大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大家一共分享学习经验. Pyth ...
- python爬虫电影信息_Python爬虫入门 | 爬取豆瓣电影信息
这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...
最新文章
- php mysql设置null,MySQL和PHP – 插入NULL而不是空string
- VTK:可视化之Glyph3DImage
- linux手动注入网络数据_Linux网络 - 数据包的接收过程
- dlgdata.cpp错误提示 解决方案
- STM32那点事(2)_时钟树(下)
- transform()
- .Net Core报“‘GB2312‘ is not a supported encoding name. For information on defining a custom encod”的错误
- python判断整数是否对称_刷题系列 - Python判断是否镜像对称二叉树
- 注册测绘师 案例分析
- JAVA面试宝典2018-2019
- matlab算方差std,MATLAB 方差函数 var std
- 认识心理学上的自我界限(学习记录)
- 交互设计、信息图、信息可视化、数据可视化技术资源汇总——设计师的领域,设计师说了算
- 拼多多开店有哪些优势?
- 【组合数学】通俗解释 Burnside引理和Polya定理
- 遍历$.each()和$().each()用法
- DNS篇之DNS协议详解
- java小项目家庭记账程序
- Prism.Wpf框架中WindowStartupLocation的问题
- e换电受邀参加上海电动自行车集中充电设备展示推荐会
热门文章
- Docker Compose学习之docker-compose.yml编写规则 及 实战案例
- webstrom 开发工具简介
- 【Java】我的第一个 JAVA 程序:Hello,world!
- react 生命挂钩_角生命周期挂钩:ngOnChanges,ngOnInit等
- 状态模式 有限状态机_有限状态机解释
- 游戏窗口组合键消息失败_5失败的投资组合,以后我在这里
- ntko web firefox跨浏览器插件_Firefox火狐浏览器插件全部失效解决方法
- Python玩转各种多媒体,视频、音频到图片
- 牛逼了,用Python攻破wifi密码
- Flask框架——ORM数据库