当前位置:   article > 正文

【python爬虫]】BeautifulSoup4库清晰简明入门(含爬虫实战)_beautifulsoup爬虫流程

beautifulsoup爬虫流程

爬虫流程与BeautifulSoup4简介

1. 爬虫流程

解析内容
获取响应
发送请求
保存数据

发起请求: 通过HTTP库向目标站点发起请求,等待目标站点服务器响应。
获取响应: 若服务器正常响应,会返回一个Response,该Response即为获取得页面内容,Response可以是HTML、JSON字符串、二进制数据等数据类型。
解析内容: 利用正则表达式、网页解析库对HTML进行解析;将json数据转为JSON对象进行解析;保存我们需要得二进制数据(图片、视频)。
保存数据: 可将爬取并解析后的内容保存为文本,或存至数据库等。

针对以上四个流程有相应的python库可以实现:

  • Requests库:实现发起请求,获取响应
  • BeautifulSoup库:内容解析

关于Requests可详见往期教程:
【python爬虫】Requests库清晰简明的入门
更多爬虫知识基础可见:
【爬虫学习预备】HTML清晰简明的基础入门
【爬虫学习预备】HTTP基础知识——通过浏览器开发者模式学习

2. BeautifulSoup 简介

中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
在这里插入图片描述
BeautifulSoup是一个可以从HTMLXML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。

  • BeautifulSoup能够通过转换器实现惯用的文档导航、查找、修改文档的方式。
  • BeautifulSoup是一个基于re开发的解析库,可以提供一些强大的解析功能
  • 使用BeautifulSoup能够提高提取数据的效率与爬虫开发效率。

一、安装

pip install bs4 #(Windows cmd命令行中)
  • 1

出现超时timeout问题,解决方案:

  1. 设置超时参数,增加pip等待时间
pip --default- timeout =100
  • 1
  1. 指定某个镜像网站
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bs4
  • 1

二、 使用与对象

1. 快速使用

将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.

from bs4 import BeautifulSoup

soup = BeautifulSoup(open("index.html"))#传入文档对象

soup = BeautifulSoup("<html>data</html>") #传入字符串
  • 1
  • 2
  • 3
  • 4
  • 5

首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码

BeautifulSoup(“Sacré bleu!”)
<html><head></head><body>Sacré bleu!</body></html>

然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档.

2. BeautifulSoup对象

BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有数据对象可以归纳为以下四类

文档树对象描述
Tag(标签)访问方式:soup.tag
属性: tag.name(标签名)
tag.attrs(标签属性)
Navigable String(可遍历字符串)访问方式:soup.tag.string
BeautifulSoup (文档全部内容)表示文档的全部内容,一个特殊Tag对象
属性:soup.name(标签名)
soup.attrs(标签属性)
Comment 标签内字符串的注释一个特殊类型的 NavigableString
对象访问方式:soup.tag.string

教程参考 https://blog.csdn.net/qq_21933615/article/details/81171951

三、实战——解析豆瓣读书 Top250

1. 解析文档

  1. 通过 from bs4 import BeautifulSoup 语句导入 BeautifulSoup

  2. 然后使用 BeautifulSoup(res.text, lxmlr’) 语句将网页源代码的字符串形式解析成了 BeautifulSoup 对象

  3. 解析成了 BeautifulSoup 对象可以较为方便的提取我们需要的信息

import io
import sys
import requests
from bs4 import BeautifulSoup
###运行出现乱码时可以修改编码方式
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
###
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, 'lxml')
print(soup)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

结果
在这里插入图片描述

说明:

  • python 打印信息时会有限制 我们将打印的编码改成gb18030

  • headers表示我们的请求网页的头,对于没有headers的请求可能会被服务器判定为爬虫而拒绝提供服务

2. 提取信息

find()方法和find_all()方法:

  • find() 返回符合条件的首个数据
  • find_all() 返回符合条件的所有数据

FIND :传入 HTML 标签名称

print(soup.find('a'))
#<a class="nav-login" href="https://accounts.douban.com/passport/login?source=book" rel="nofollow">登录/注册</a>
print(soup.find_all('a'))
#返回一个列表 包含了所有的<a>标签
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

FIND:使用其他定位

# 定位div开头 同时id为'doubanapp-tip的标签
soup.find('div', id='doubanapp-tip')
# 定位a抬头 同时class为rating_nums的标签
soup.find_all('span', class_='rating_nums')
#class是python中定义类的关键字,因此用class_表示HTML中的class
  • 1
  • 2
  • 3
  • 4
  • 5

HTML定位方法:https://www.cnblogs.com/bosslv/p/8992410.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/140387
推荐阅读
相关标签
  

闽ICP备14008679号