前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python3 爬虫学习:爬取豆瓣读书Top250(二)

python3 爬虫学习:爬取豆瓣读书Top250(二)

作者头像
python鱼霸霸
发布2020-05-04 21:10:43
1.4K0
发布2020-05-04 21:10:43
举报

上节我们讲到requests只是获取了网页数据,我们需要进一步,获取我们需要的并且能看懂的数据,这里需要用到新的库BeautifulSoup,他是一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。

BeautifulSoup的简单介绍
代码语言:javascript
复制
pip install beautifulsoup4

BeautifulSoup可以很方便的从网页中抓取我们需要的数据,我们先来导入一下BeautifulSoup

代码语言:javascript
复制
from bs4 import BeautifulSoup        #从bs4中导入BeautifulSoup
创建BeautifulSoup对象
代码语言:javascript
复制
bs = BeautifulSoup(res.text , 'html.parser')     

我们在创建BeautifulSoup对象时需要传入两个参数,一个参数是需要被解析的html文本(<html>...</html>),也就是网站的源代码(res.text)。另一个参数是html的解析器:html.parser ,它是 Python 中内置的解析器,它的特点就是简单方便。

接下来我们接上上一节的内容来继续写代码。

代码语言:javascript
复制
import requests        #导入requests库

from bs4 import BeautifulSoup        #从bs4中导入BeautifulSoup

headers = {              #将用户代理数据放入请求头当中,伪装成浏览器
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"
}

url ="https://book.douban.com/top250"          #将url地址存入变量中

res = requests.get(url, headers = headers)          #获取响应数据存入变量res

bs = BeautifulSoup(res.text , 'html.parser')          #创建BeautifulSoup对象
BeautifulSoup的find() 方法和 find_all() 方法

接下来,我们来学习BeautifulSoup的常用方法:find()方法和find_all()方法

  • find()方法:用于返回符合查找条件的第一个数据
  • find_all()方法:用于返回符合查找条件的全部数据

假如有这样一个百度页面,我们使用两种方法分别获得数据

代码语言:javascript
复制
<div class="content">
  <h1>这是一个示例</h1>
  <div class="">
    <a href="https://www.baidu.com">百度首页</a>
    <div class="item">
      <a href="https://www.baidu.com/image">百度图片</a>
    </div>
    <div class="item">
      <a href="https://www.baidu.com/map">百度地图</a>
    </div>
    <div class="item">
      <a href="https://www.baidu.com/tieba">百度贴吧</a>
    </div>
  </div>
</div>
代码语言:javascript
复制
bs = BeautifulSoup(res.text, 'html.parser')

print(bs.find('a'))

# 输出:<a href="https://www.baidu.com">百度首页</a>

print(bs.find_all('a'))

# 输出:[
<a href="https://www.baidu.com">百度首页</a>,
<a href="https://www.baidu.com/image">百度图片</a>,
<a href="https://www.baidu.com/map">百度地图</a>,
<a href="https://www.baidu.com/tieba">百度贴吧</a>
]

从上面对比可以看出,find()输出了第一个<a>标签,而find_all()则输出了由所有<a>标签组成的列表

除了直接传入标签名作为参数之外,这两个方法还支持传入标签的属性,进行数据的提取,我们再来看个示例:

  • 我们想要提取书本名字,可以这样写
  • 打开豆瓣top250页面,右键选择书本名称,点击检查
代码语言:javascript
复制
#查找属性为class = 'pl2' 的 div 标签
items = bs.find('div' , class_ = 'pl2') 

#输出:
<div class="pl2">
<a href="https://book.douban.com/subject/1007305/" onclick="&quot;moreurl(this,{i:'0'})&quot;" title="红楼梦">红楼梦
</a></div>

#查找所有属性为class = 'pl2' 的 div 标签
items = bs.find_all('div' , class_ = 'pl2') 

因为在python语言中,class被用来定义,所以我们在查找html标签里用到的class 需要加一个下划线:class_

Tag对象和Tag属性

BeautifulSouphtml中的标签封装为Tag对象,和BeautifulSoup对象一样,Tag对象也有find()find_all()方法。

我们需要的内容在<a>标签里面,那我们可以这样来写:

代码语言:javascript
复制
#查找所有属性为class = 'pl2' 的 div 标签
items = bs.find_all('div' , class_ = 'pl2') 

for i in items:
  # 查找 class_='pl2' 的 div 标签中的 a 标签
  print(i.find('a'))

但是我们其实只想要书名和链接而已,其他我们都不需要,那么我们再来改写一下:

代码语言:javascript
复制
#查找所有属性为class = 'pl2' 的 div 标签
items = bs.find_all('div' , class_ = 'pl2') 

for i in items:
  #查找 class_='pl2' 的 div 标签中的 a 标签
  tag = i.find('a')
  #获取a标签的文本内容用tag.text,但是这里还可以这样写:获取a标签的title属性的值
  name = tag['title']

  #获取a标签的href属性的值
  link = tag['href']

  #字符串格式化,使用\n换行
  print('书名:{}\n链接:{}' .format(name , link))

输出结果

从上面的例子可以看到,我们通过和字典取值类似的方式,将html属性名作为,得到了对应属性的值,这里是以title属性为例,其他的html属性也同样适用。(tag.text用来获取标签文本内容,tag['属性名']用于获取标签属性的值)

接下来,咱们用同样的方法获取书本作者和出版社等信息:

代码语言:javascript
复制
#查找所有属性为class = 'pl' 的 p 标签
authors = bs.find_all('p' , class_ = 'pl') 

for j in authors:

  print(j.text)

输出结果

接下来,咱们用同样的方法获取一句话介绍:

代码语言:javascript
复制
#查找所有属性为class = 'pl' 的 p 标签
abstract = bs.find_all('span' , class_ = 'inq') 

for k in abstract:

  print(k.text)

输出结果

虽然我们把需要的信息全都抓取了出来,但是代码好像不够简洁,那我们是否可以再优化一下呢?

答案当然是可以的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BeautifulSoup的简单介绍
  • 创建BeautifulSoup对象
  • BeautifulSoup的find() 方法和 find_all() 方法
  • Tag对象和Tag属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档