爬虫基础–request库详解
1. requests模块介绍
request库中文文档:https://docs.python-requests.org/zh_CN/latest/user/quickstart.html
requests
是一个非常流行的 Python HTTP 第三方库,它允许你发送各种 HTTP 请求,处理 cookies、会话、连接池、重定向、多种认证方式等,使得处理 HTTP 请求变得非常便捷,是爬虫常用到的网络请求库。
2. 安装requests模块
pip install requests
3.requests模块发送网络请求
get请求方式
import requests
# 目标url
url = 'https://www.baidu.com'
# 向目标url发送get请求
response = requests.get(url)
# 打印响应内容
print(response.text)
post请求方式
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
'cookie': '',
}
url = ""
data_form = {
'action': 'getCategories',
'vin': '',,
}
r = requests.post(url, data=data_form, headers=headers)
print(r.text)
4. response响应对象
-
response.text
- 类型:str
- 解码类型: requests模块自动根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
-
response.content
- 类型:bytes
- 解码类型: 没有指定
import requests
headers = {
‘user-agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36’
}
response = requests.get(‘http://www.jianshu.com’, headers=headers)获取状态码
print(type(response.status_code), response.status_code)
获取头部信息
print(type(response.headers), response.headers)
获取cookies
print(type(response.cookies), response.cookies)
获取请求的url
print(type(response.url), response.url)
5.响应状态码
请求成功
200 (成功) 服务器已成功处理了请求。-
201 (已创建) 请求成功并且服务器创建了新的资源。-
202 (已接受) 服务器已接受请求,但尚未处理。-
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。-
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。-
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。-
206 (部分内容) 服务器成功处理了部分 GET 请求。
请求重定向
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。-
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。-
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。-
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。-
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。-
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。-
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
请求错误
400 (错误请求) 服务器不理解请求的语法。-
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。-
403 (禁止) 服务器拒绝请求。-
404 (未找到) 服务器找不到请求的网页。-
405 (方法禁用) 禁用请求中指定的方法。-
406 (不接受) 无法使用请求的内容特性响应请求的网页。-
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。-
408 (请求超时) 服务器等候请求时发生超时。-
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。-
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。-
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。-
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。-
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。-
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。-
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。-
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。-
417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。
请求服务器错误
500 (服务器内部错误) 服务器遇到错误,无法完成请求。-
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。-
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。-
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。-
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。-
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
6.requests库参数说明
使用 requests
库时,除了必填的 url
参数,你可以选填其他参数来自定义请求:
headers
: 字典,用于自定义HTTP请求头。cookies
: 字典,或RequestsCookieJar
对象,包含 cookies。auth
: 元组,用于HTTP认证的凭据。第一个元素是用户名,第二个元素是密码。params
: 字典,用于将表单数据附加到URL的查询字符串中(GET、POST请求)。data
: 字典或类似字典的对象,用于表单数据的提交。(POST、PUT请求)json
: 字典或类似字典的对象,用于发送JSON数据。(POST、PUT请求)files
: 字典{'表单字段名': ('文件名', 文件对象)}
,用于上传文件。(POST请求)stream
: 布尔值,用于流式下载。默认值False
,为True
逐块读取响应体减少内存使用。timeout
: 浮点数或元组,用于指定请求的超时时间(秒)。默认无限期地等待。verify
: 布尔值,或到CA证书包的路径。默认值True
,为False
不验证服务器SSL证书。cert
: 字符串或元组,用于传递客户端证书文件的路径,或者证书和私钥文件的路径。allow_redirects
: 布尔值,是否允许重定向。默认为True
允许重定向。proxies
: 字典,用于配置代理
(1)请求头headers:
headers = {'User-Agent': 'Mozilla/5.0 (compatible; YourBot/0.1)'}
response = requests.get('http://example.com', headers=headers)
(2)获取cookies
import requests
url = "https://www.baidu.com"
response = requests.get(url)
print(response.cookies)
for key, value in response.cookies.items():
print(key + '=' + value)
(3)设置超时timeout
timeout:浮点数或元组,用于指定请求的超时时间(秒)。默认无限期地等待。-
可使用try...except
块来捕获Timeout
异常,以便在请求超时时进行适当的错误处理。
try:
response = requests.get('http://example.com', timeout=5) # 整数,5秒超时
response = requests.get('http://example.com', timeout=0.5) # 浮点数,0.5秒超时
# timeout是元组时,用于指定连接超时时间和读取超时时间 (timeout_connect,timeout_read) 。
response = requests.get('http://example.com', timeout=(2, 5)) # 元组,2秒连接超时,5秒读取超时
except requests.exceptions.Timeout:
print("请求超时")
(4)认证信息auth
用于HTTP认证的凭据。第一个参数是用户名,第二个参数是密码。requests 库会自动将这些认证信息编码并附加到请求的 HTTP 头中。
⑴ 基本认证(Basic Auth)
# 定义认证信息
username, password = 'user', 'pass'
# 使用基本认证发起 GET 请求
auth = (username, password)
response = requests.get('http://example.com', auth=auth)
⑵ 摘要认证(Digest Auth)
from requests.auth import HTTPDigestAuth
username, password = 'user', 'pass'
# 使用摘要认证发起 GET 请求
auth = HTTPDigestAuth(username, password)
response = requests.get('http://example.com', auth=auth)
⑶ 令牌认证(Token Auth)
# 定义令牌
token = 'your_access_token'
# 定义请求头,包含令牌
headers = {'Authorization': f'Token {token}'}
# 使用令牌认证发起 GET 请求
response = requests.get('http://example.com/protected', headers=headers)
(5)表单参数data
⑴ 使用表单数据发送POST请求
# 定义表单数据
data = {
'key1': 'value1',
'key2': ['value2', 'value3']
}
response_form = requests.post('https://example.com/post', data=data)
⑵ 使用json数据发送POST请求
import json
import requests
headers = {'Content-Type': 'application/json'}
data = {
'key1': 'value1',
'key2': ['value2', 'value3']
}
# 将字典转换为JSON字符串
json_data = json.dumps(data)
response_json = requests.post('https://example.com/post', headers=headers, data=json_data)
⑶ 使用流式上传文件:
with open('file.zip', 'rb') as file:
response = requests.post('https://example.com/post', data=file)