爬虫系列总目录
本章节介绍爬虫中使用的基础库用于选择,过滤页面信息。包括requests,bs4等。
第二章 爬虫基础库-requests/bs4
第二章 基础库-requests/bs4/CSS使用
一、requests库
requests是一个很实用的Python HTTP客户端库。Python标准库中urllib可以满足我们平时的很多需求,但是urllib的API使用起来并不太友好,在urllib的基础上完成了requests库。
英文文档API:https://docs.python-requests.org/en/master/
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
1.1 使用
python">import requests
# 最简单的反爬虫技巧: 添加请求头headers
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/"
"537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
# requests.request('get', url='https://www.baidu.com') 属于urllib3中的请求方式
response = requests.get(url='https://www.baidu.com', headers=headers)
print(response.text) # 返回的是字符串
python">import requests
response = requests.get('https://www.baidu.com/')
print(response.content.decode())
当都没有headers 时, 前面第一种情况会出现中文乱码的情况。
- requests默认自带的Accept-Encoding导致或者百度默认发送的就是压缩之后的网页
- content.read()没有问题是因为requests自带的解压压缩网页的功能
- 当收到一个响应时,Requests 会猜测响应的编码方式,用于在你调用response.text 方法时对响应进行解码。但是有可能会检测不到.
- 推荐使用response.content.decode()
二、BeautifulSoup4 介绍
Beautiful Soup 是一个HTML/XML的解析器,主要的功能是解析和提取 HTML/XML 数据。
- Beautiful Soup 解析时会载入整个文档,解析全部,因此时间和内存开销都会大很多
- BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxml 的 XML解析器。
- Beautiful Soup 3 目前已经停止开发,现在推荐使用Beautiful Soup 4。使用 pip 安装即可
2.1 基本使用
python">from bs4 import BeautifulSoup
with open('布局.html', 'rb') as f:
html = f.read()
# 如果要是用lxml解析器需要安装对应的lxml框架 pip install lxml
soup = BeautifulSoup(html, 'lxml')
print(soup.prettify())
"""
解析器
lxml 推荐使用, 速度快,文档容错能力强(C编写),推荐使用
html.parser
优势:Python内置,执行速度适中,文档容错能力强
劣势:Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
html5lib
优势:最好的容错性,已浏览器的方式解析文档,生成Html5格式的文档
劣势:速度慢,不依赖外部扩展
"""
2.2 bs4的3种对象
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag: 是HTML中的一个个标签,比如head、 title、p等这些HTML标签包裹的内容就是Tag。
- NavigableString : 获取到标签内容以后,可以通过使用string获取其内部的文字。
- BeautifulSoup: BeautifulSoup对象,即上面的soup表示的是一个文档内容。很多时候可以把它当作 Tag 对象,是一个特殊的Tag。 type 为 <class ‘str’> , print 为 [document]。
三、 CSS选择器
3.1 查找方式:标签名、类名、id、属性及其组合使用
下述select获取到的都是列表形式的结果,可以使用遍历获取其中的每一个,然后使用get_text()来获取其中的内容。
- 属性查找, 属性需要使用[]中括号括起来,另外标签和属性是属于同一级别,中间不可加空格
python"># 如果要是用lxml解析器需要安装对应的lxml框架 pip install lxml
soup = BeautifulSoup(html, 'lxml')
# 通过标签名查找
print(soup.select('title'))
# select css选择器会将所有的满足条件的内容进行输出
print(soup.select('td'))
# 通过类名查找
print(soup.select('.box3'))
# 通过id名查找
print(soup.select('#pp'))
# 组合查找
# 查找div标签中class为box3的内容
print(soup.select('div .box3'))
# 查找div标签中id为t的内容
print(soup.select('div #t'))
# 查找div下的所有div
print(soup.select('div>div'))
# 通过属性查找
# 查找div中class类名为box3的
print(soup.select('div[class=box3]'))
# 查找img中src为abc.png的标签
print(soup.select('img[src="abc.png"]'))
# 属性查找中也可进行组合使用
print(soup.select('div img[src="abc.png"]'))
四、了解urllibs
没有headers 会无法获取数据。
python">import urllib3
# 设置headers
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/"
"537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
}
# 创建PoolManager实例生成请求
http = urllib3.PoolManager()
# 添加请求头请求
res = http.request('get', 'https://www.baidu.com', headers=headers)
print(res.data.decode())