赞
踩
发起请求: 通过HTTP
库向目标站点发起请求,等待目标站点服务器响应。
获取响应: 若服务器正常响应,会返回一个Response
,该Response
即为获取得页面内容,Response
可以是HTML、JSON字符串、二进制数据等数据类型。
解析内容: 利用正则表达式、网页解析库对HTML进行解析;将json数据转为JSON对象进行解析;保存我们需要得二进制数据(图片、视频)。
保存数据: 可将爬取并解析后的内容保存为文本,或存至数据库等。
针对以上四个流程有相应的python库可以实现:
Requests
库:实现发起请求,获取响应BeautifulSoup
库:内容解析关于Requests
可详见往期教程:
【python爬虫】Requests库清晰简明的入门
更多爬虫知识基础可见:
【爬虫学习预备】HTML清晰简明的基础入门
【爬虫学习预备】HTTP基础知识——通过浏览器开发者模式学习
中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
BeautifulSoup是一个可以从HTML
或XML
文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。
BeautifulSoup
能够通过转换器实现惯用的文档导航、查找、修改文档的方式。BeautifulSoup
是一个基于re开发的解析库,可以提供一些强大的解析功能BeautifulSoup
能够提高提取数据的效率与爬虫开发效率。pip install bs4 #(Windows cmd命令行中)
出现超时timeout问题,解决方案:
pip --default- timeout =100
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bs4
将一段文档传入BeautifulSoup 的构造方法,就能得到一个文档的对象, 可以传入一段字符串或一个文件句柄.
from bs4 import BeautifulSoup
soup = BeautifulSoup(open("index.html"))#传入文档对象
soup = BeautifulSoup("<html>data</html>") #传入字符串
首先,文档被转换成Unicode,并且HTML的实例都被转换成Unicode编码
BeautifulSoup(“Sacré bleu!”)
<html><head></head><body>Sacré bleu!</body></html>
然后,Beautiful Soup选择最合适的解析器来解析这段文档,如果手动指定解析器那么Beautiful Soup会选择指定的解析器来解析文档.
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
通过 from bs4 import BeautifulSoup
语句导入 BeautifulSoup
然后使用 BeautifulSoup(res.text, lxmlr’)
语句将网页源代码的字符串形式解析成了 BeautifulSoup 对象
解析成了 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)
结果
说明:
python 打印信息时会有限制 我们将打印的编码改成gb18030
headers表示我们的请求网页的头,对于没有headers的请求可能会被服务器判定为爬虫而拒绝提供服务
find()
方法和find_all()
方法:
find()
返回符合条件的首个数据find_all()
返回符合条件的所有数据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>标签
# 定位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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。