目录
什么是 requests
requests 是一个用于发送 HTTP 请求的 Python 库,使得与 Web 服务和 API 进行交互变得非常简单。它提供了人性化的 API 接口,封装了复杂的 HTTP 操作,使开发者可以更容易地发送 HTTP/1.1 请求,包括 GET、POST、PUT、DELETE 等方法,并处理响应。
requests 特点
- 简单易用:提供了简单的函数调用和灵活的接口设计。
- 自动编码处理:自动处理 URL 编码和字符编码。
- 持久会话:可以使用会话对象保持会话,自动处理 Cookie。
- 文件上传:支持多部分编码文件上传。
- 响应内容自动解码:自动根据响应内容的编码进行解码。
- 支持 SSL:支持 HTTPS 请求。
官方文档
requests 模块安装
pip install requests
requests 的使用
发送无参数的 get 请求
示例:
import requests
url = 'https://www.baidu.com'
# 向 url 发送 get 请求
response = requests.get(url)
# 获取响应结果 bytes类型
content = response.content
# 打印相应结果
print(content.decode('utf-8'))
response 响应对象的常用属性和方法
- requests.status_code:HTTP 响应状态码,例如 200(成功)、404(未找到)。
- response.headers:响应头的字典。
- response.encoding:响应内容的编码类型,默认从响应头的 Content-Type 中推断。
- response.text:解码后的响应内容(字符串类型,根据 response.encoding 编码属性进行响应,大概率是乱码)。
- response.content:原始的响应内容(二进制数据),使用decode('utf-8'),进行结果,可以得到正确的中文。
- response.json():将响应内容解析为 JSON 对象(如果内容是 JSON 格式)。
- response.url:最终请求的 URL(考虑重定向后的 URL)。
- response.history:重定向的响应列表(如果有)。
- response.elapsed:请求处理的时间(一个 timedelta 对象)。
- response.cookies:响应中的 Cookies。
- response.reason:HTTP 状态码的原因短语(例如 "OK")。
- response.raise_for_status():如果响应状态码是 4xx 或 5xx,抛出 HTTPError 异常。
- response.apparent_encoding:响应内容的推断编码。
- response.raw:原始的底层 urllib3 HTTPResponse 对象。
- response.iter_content(chunk_size=1024, decode_unicode=False):以块的形式迭代响应内容,适用于大文件下载。
for chunk in response.iter_content(chunk_size=1024): # 处理块数据
- response.iter_lines(chunk_size=512, decode_unicode=None, delimiter=None):以行的形式迭代响应内容,适用于逐行读取。
for line in response.iter_lines(): # 处理行数据
- response.close():关闭响应连接。
示例:
import requests
url = 'https://www.baidu.com'
# 向 url 发送 get 请求
response = requests.get(url)
print(response.status_code) # 200
print(response.reason) # OK
print(response.headers) # {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Tue, 23 Jul 2024 01:35:34 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:24:17 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
print(response.encoding) # ISO-8859-1
print(response.apparent_encoding) # utf-8
print(response.url) # https://www.baidu.com/
cookies = response.cookies
print(cookies) # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
# 解析 cookies
# 获取所有cookie 的名称
print(cookies.keys())
# 获取所有cookie 的值
print(cookies.values())
# 获取所有cookie 的名称和值
print(cookies.items())
# 获取指定cookie 名称的值
print(cookies.get('cookie_name'))
# 设置 cookie
cookies.set('cookie_name', 'cookie_value')
# 解析 JSON 响应内容
# data = response.json()
# print(data)
发送带请求头的请求
import requests
url = 'https://www.baidu.com'
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/25',
'Token': 'xxxxxx'
}
# 向 url 发送请求
response = requests.get(url, headers=headers)
发送有参数的 get 请求
方式一:参数跟在url后面
import requests
# 带参数的 url
url = 'https://www.baidu.com/s?wd=python'
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/25'
}
# 向 url 发送请求
response = requests.get(url, headers=headers)
# 把响应内容写到文件中
with open('baidu.html', 'wb') as file:
file.write(response.content)
方式二:参数写在请求体中
import requests
# 不带参数的 url
url = 'https://www.baidu.com/s?'
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/25'
}
# 请求参数
params = {
'wd': 'python'
}
# 向 url 发送请求
response = requests.get(url, headers=headers, params=params)
# 把响应内容写到文件中
with open('baidu.html', 'wb') as file:
file.write(response.content)
发送无参数的 post 请求
import requests
url = 'http://example.com/xxx'
# 向 url 发送请求
response = requests.post(url)
print(response.content.decode('utf-8'))
发送有参数的 post 请求
import requests
url = 'http://example.com/xxx'
# 请求参数
data = {
'name': 'Tom',
'age': 18
}
# 向 url 发送请求
response = requests.post(url, data=data)
print(response.content.decode('utf-8'))
发送json参数的 post 请求
import requests
import json
url = 'http://example.com/xxx'
# 请求头
headers = {'content-type': 'application/json'}
# 请求参数
data = {
'name': 'Tom',
'age': 18
}
# 向 url 发送请求
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.json())
使用 cookies 保持状态
示例:以github为例,保持登录状态
import requests
url = 'https://github.com/TheAlgorithms/Python'
# 请求头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/25',
# 方式一:在请求头上带cookie
# "cookie": "_octo=GH1.1.1465102456.1721701588; preferred_color_mode=light; tz=Asia%2FShanghai; _device_id=b749a4ec556beaa7356ffd13ca2c2361; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; _gh_sess=UeoKdJWTVwEyqPAABtHBvc3pm%2BUnzmEvn7naD4xHLKvEjam3fCXesv%2BQurWmhQ0V4MmPojA2JY%2Fd0Kstyv1f1fo3eyMyDHU2MDctSVNY%2B%2Bb5Zbq5fXx6DBhizpGdxSKgbtMm%2FgylGTg1Lgaq4CJdZ3xx22ZdXXQmBCOPjiHW7qcb4CqcdJQdZYHt1y2yil0OlKqjBEGbFzJzpJCtt2zti2lw%2BnKAAmZNVVH3W2E7qqNWrIhutygpw%2Bnwo%2FbqeUy16a6yekLZE3Mbxb2m4aVxOWfs82t2y4wak3wLZO7fMVQhp1Z3cVOGppTB1Ji1s19i4xc6NDLO5--6028PWpmgkuowBd--uYclGOCEL6BWbsAiVhKArA%3D%3D"
}
# 方式二:使用 get的cookies参数
temp = "_octo=GH1.1.1465102456.1721701588; preferred_color_mode=light; tz=Asia%2FShanghai; _device_id=b749a4ec556beaa7356ffd13ca2c2361; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; _gh_sess=UeoKdJWTVwEyqPAABtHBvc3pm%2BUnzmEvn7naD4xHLKvEjam3fCXesv%2BQurWmhQ0V4MmPojA2JY%2Fd0Kstyv1f1fo3eyMyDHU2MDctSVNY%2B%2Bb5Zbq5fXx6DBhizpGdxSKgbtMm%2FgylGTg1Lgaq4CJdZ3xx22ZdXXQmBCOPjiHW7qcb4CqcdJQdZYHt1y2yil0OlKqjBEGbFzJzpJCtt2zti2lw%2BnKAAmZNVVH3W2E7qqNWrIhutygpw%2Bnwo%2FbqeUy16a6yekLZE3Mbxb2m4aVxOWfs82t2y4wak3wLZO7fMVQhp1Z3cVOGppTB1Ji1s19i4xc6NDLO5--6028PWpmgkuowBd--uYclGOCEL6BWbsAiVhKArA%3D%3D"
cookies = {data.split('=')[0]: data.split('=')[-1] for data in temp.split('; ')}
response = requests.get(url, headers=headers, cookies=cookies)
with open("github.html", "wb") as f:
f.write(response.content)
使用 session 保持状态
import requests
url1 = 'https://xxx.com/login'
url2 = 'https:///xxx.com/index'
# 创建一个 Session 对象
session = requests.Session()
# 配置默认的 headers
session.headers.update({'User-Agent': 'Mozilla/5.0 ('})
# 配置请求超时时间,单位秒
session.timeout = 5
# 配置代理ip
proxies = {
'http': 'http://11.11.110.xxx:8080'
}
# 使用代理的
session.proxies.update(proxies)
# 发送一个请求
response = session.post(url1, data={'username': 'Tom', 'password': '123456'})
print(response.json())
# 发送另一个请求,自动使用相同的 headers 和持久的连接
response = session.get(url2)
print(response.json())
# 关闭
session.close()
response.close()
设置请求超时时间
import requests
url = 'https://www.baidu.com'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 SLBrowser/9.0.3.5211 SLBChan/25',
}
# timeout:请求响应超时时间,单位秒
response = requests.get(url, timeout=10, headers=headers)
verify 参数
verify
参数用于控制是否验证服务器的 SSL/TLS 证书。当verify
设置为True
或未设置时,requests
库会验证服务器的 SSL/TLS 证书,确保其是由受信任的证书颁发机构(CA)签发的。requests
使用内置的受信任 CA 列表来进行验证。
例如verify=False时,就不会给我们类似下图的页面,会让我们直接访问原网站。
示例:
import requests
url = 'https://www.baidu.com'
response = requests.get(url, verify=False)
print(response.content.decode('utf-8'))
proxies 代理
proxies是什么
proxies是
requests
库中的一个参数,用于配置 HTTP 和 HTTPS 请求通过代理服务器发送。这在需要通过特定服务器进行请求、隐藏真实 IP 地址或访问被防火墙阻挡的资源时非常有用。
proxies代理的使用
示例:
import requests
# url
url = 'https://www.baidu.com'
# 使用代理
proxies = {
'http': 'http://11.11.110.xxx:8080',
# 如果这个代理服务器支持https代理的话
# 'https': 'https://11.11.110.xxx:8080',
# 如果这个代理服务器支持socks代理的话
# 'socks5': 'socks5://user:password@socks-proxy.example.com:1080',
}
# 使用代理,请求url地址
# proxies={'http': proxies['http']} 尝试使用http代理
# proxies={'http': proxies['http'], 'https': proxies['https']} 尝试使用https代理
response = requests.get(url, proxies=proxies)
print(response.content.decode('utf-8'))