Python 爬虫之requests 模块的应用
requests 是用 python 语言编写的一个开源的HTTP库,可以通过 requests 库编写 python 代码发送网络请求,其简单易用,是编写爬虫程序时必知必会的一个模块。
requests 模块的作用
发送网络请求,获取响应数据。
中文文档: https://docs.python-requests.org/zh_CN/latest/index.html
requests 模块的安装
安装命令如下:
pip install requests 或者 pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
具体安装运行如下图所示:
查看安装好的 requests 模块的信息
pip show requests
具体运行如下图所示:
requests 模块的基本使用
知识点:
- 掌握 requests 发送 GET 请求
- 掌握 response 对象的基本属性
- 掌握 response.text 和 response.content 的区别
- 掌握 requests 发送自定义请求头的方式
- 掌握 requests 发送带参数的get请求
1. requests 发送 GET 请求
使用 requests 模块发送 GET 请求的语法是: requests.get(url), 调用完该方法之后会返回一个 response 响应对象。
需求:通过 requests 向百度首页发送请求,获取百度首页的数据。
# 1. 导入request模块 import requests # 2. 准备目标url地址 url = 'https://www.baidu.com' # 3. 向目标url地址发送get请求 response = requests.get(url) # 4. 打印响应内容 print(response.text)
运行代码结果如下:
2. response 响应对象
观察上边代码运行结果发现,有好多乱码;这是因为编解码使用的字符集不同早造成的;我们尝试使用下边的办法来解决中文乱码问题。
代码如下:
# 1. 导入request模块 import requests # 2. 准备目标url地址 url = 'https://www.baidu.com' # 3. 向目标url地址发送get请求 response = requests.get(url) # 4. 打印响应内容 # print(response.text) print(response.content.decode()) # 原始响应内容,类型bytes:没有进行解码响应内容 # 注意:爬虫程序默认不会自动保存cookie,爬虫程序请求时默认也不会自动携带cookie
运行代码结果如下:
2.1 response.content 和 response.text 的区别
response.content
- 返回类型: bytes
- 解码类型: 没有指定,原始响应内容,没有进行解码
- 指定编码方式: response.content.decode('指定编码字符集')
- 注意: response.content.decode() 默认使用 utf-8 编码方式
response.text
- 返回类型: str
- 解码类型: requests 模块自动根据 HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
- response.text = response.content.decode('推测出的编码字符集')
获取网页源码的方式:
- response.content.decode()
- response.content.decode('gbk')
- response.text
以上三种方法从前往后尝试,能够100%的解决所有网页解码的问题, 推荐优先使用: response.content.decode()
2.2 response 响应对象其他属性和方法
- response.url : 响应的url地址,有时候响应的 url 地址和请求的 url 地址不一样。
- response.status_code : 获取响应状态码。
- response.request.headers : 获取响应对应的请求头信息。
- response.headers : 获取响应头信息。
- response.request._cookies : 响应对应请求携带的cookie,返回cookieJar类型。
- response.cookies : 响应时设置的 cookie,返回cookieJar类型。
- response.json() : 自动将 json 字符串类型的响应内容转换为 python 对象(dict or list)。
示例代码如下:
# 1. 导入request模块 import requests # 2. 准备目标url地址 url = 'https://www.baidu.com' # 3. 向目标url地址发送get请求 response = requests.get(url) # 4. 打印响应内容 print(response.url) # 打印响应的url print(response.status_code) # 打印响应的状态码 print(response.request.headers) # 打印响应对象的请求头 print(response.headers) # 打印响应头 print(response.request._cookies) # 打印请求携带的cookies print(response.cookies) # 打印响应设置的cookies
示例代码运行结果如下:
2.3 练习-保存网络图片
需求: 将图片https://i-blog.csdnimg.cn/direct/d145c8acdfac46f0bf9ab2c9316c22e0.png 保存到本地。
思考:
- 以什么方式打开文件。
- 保存什么格式的内容。
分析:
- 图片的url地址: https://i-blog.csdnimg.cn/direct/d145c8acdfac46f0bf9ab2c9316c22e0.png
- 利用 requests 模块发送请求,获取到图片的响应。
- 以二进制的方式打开文件,并将 response 响应的二进制内容写入到文件。
完整代码如下:
# 1. 导入request模块 import requests # 2. 准备目标url地址 url = 'https://i-blog.csdnimg.cn/direct/d145c8acdfac46f0bf9ab2c9316c22e0.png' # 3. 向目标url地址发送get请求 response = requests.get(url) # 4. 打开文件,将数据写入到文件中 with open('itcast.png', 'wb') as f: # 写入响应内容的二进制数据 f.write(response.content)
代码运行结果如下:
图片已保存在同一目录下。
2.4 练习-保存多张网络图片
需求: 将网页中的图片保存到本地。
地址:https://www.tupianzj.com/meinv/20210219/224797.html
思考:
- 以什么方式打开文件。
- 保存什么格式的内容。
分析:
- ① 先请求 https://www.tupianzj.com/meinv/20210219/224797.html,获取响应内容
- ② 从上一步的响应内容中提取所有图片的地址
- ③ 遍历每一个图片地址,向每个图片地址发送请求,并将响应的内容保存成图片文件
完整代码如下:
import re import requests # 思路 # ① 先请求 https://www.tupianzj.com/meinv/20210219/224797.html,获取响应内容 # ② 从上一步的响应内容中提取所有图片的地址 # ③ 遍历每一个图片地址,向每个图片地址发送请求,并将响应的内容保存成图片文件 # ① 先请求 https://www.tupianzj.com/meinv/20210219/224797.html,获取响应内容 url = 'https://www.tupianzj.com/meinv/20210219/224797.html' # 发送请求 response = requests.get(url) # 获取响应的内容 html_str = response.content.decode('') HTML1 = response.text print(html_str) print(HTML1) # ② 从上一步的响应内容中提取所有图片的地址 image_url_list = re.findall('