Python Requests 库网络爬虫指南
Requests 是 Python 的一个实用 HTTP 客户端库,完全满足如今网络爬虫的需求。与 Urllib 对比,Requests 不仅具备 Urllib 的全部功能;在开发使用上,语法简单易懂,符合 Python 优雅、简洁的特性;在兼容性上,完全兼容 Python 2 和 Python 3。
本文详细介绍了 Python Requests 库在网络爬虫中的应用。内容包括 HTTP 的 GET 和 POST 请求方式及其参数处理,Response 对象的常用属性与方法,以及复杂请求场景下的配置技巧,如添加请求头、使用代理 IP、证书验证、超时设置和 Cookies 管理。此外,还涵盖了文件下载与上传的具体实现方案,提供了完整的代码示例和注意事项,帮助开发者快速掌握 Requests 库的核心功能。

Requests 是 Python 的一个实用 HTTP 客户端库,完全满足如今网络爬虫的需求。与 Urllib 对比,Requests 不仅具备 Urllib 的全部功能;在开发使用上,语法简单易懂,符合 Python 优雅、简洁的特性;在兼容性上,完全兼容 Python 2 和 Python 3。
HTTP 的请求方式分为 GET 和 POST。
URL 语法如下:
# 不带参数
url_without_params = "https://www.baidu.com/"
# 带参数
url_with_params = "https://www.baidu.com/s?wd=keyword"
注:如果一个 URL 有多个参数,参数之间用'&'连接。Requests 对于带参数的 URL 请求有两种处理方式:
import requests
# 第一种方式
r = requests.get('https://www.baidu.com/s?wd=keyword')
# 第二种方式
url = 'https://www.baidu.com/s'
params = {'wd': 'keyword'} # params 在 GET 请求中表示设置参数
r = requests.get(url, params=params)
print(r.url)
对于动态变化的参数,我们可以采用 %s 来占位的方式处理:
url_template = 'https://www.baidu.com/s?wd=%s'
search_term = 'keyword'
formatted_url = url_template % search_term
print(formatted_url)
输出结果:
https://www.baidu.com/s?wd=keyword
POST 请求常用来提交表单,表单数据就是 POST 的请求参数。在 Requests 中实现 POST 请求时,需要设置 data 参数,数据格式可以是字典、元组、列表或 JSON。
import requests
import json
# 字典类型
data = {'key1': 'value1', 'key2': 'value2'}
# 元组或列表(这里应该是元组的列表)
tuple_list = (('key1', 'value1'), ('key2', 'value2'))
# JSON
data_json = json.dumps(data)
r = requests.post("https://www.baidu.com/", data=data_json)
print(r.text)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 编程语言的一个子集,但是它是独立于语言的。
JSON 是构建在两种结构之上的:
名称/值 对的形式存储,其中名称是一个字符串,而值可以是字符串、数字、数组、布尔值或另一个 JSON 对象。一个典型的 JSON 对象示例如下:
{
"name": "John Doe",
"age": 30,
"is_student": false,
"hobbies": ["reading", "gaming", "sports"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "CA",
"zip": "12345"
}
}
r.status_code:返回响应状态码(如 200、404、500 等),用于判断请求是否成功。r.reason:返回响应状态码的文本描述(如 OK、Not Found 等)。r.url:返回实际请求的 URL(可能经过重定向后的最终 URL)。r.raw:返回原始响应体,可以通过 r.raw.read() 读取,适合处理二进制数据或流式响应。r.content:以字节方式返回响应体,需要手动解码,适合处理二进制文件(如图片、视频)。r.text:以字符串方式返回响应体,会自动根据响应头的 Content-Type 或 Content-Encoding 解码,适合处理文本内容(如 HTML、JSON)。r.json():将响应体解析为 JSON 对象。r.encoding:返回响应的编码格式(如 utf-8)。r.apparent_encoding:基于响应内容分析得出的编码格式,当 r.encoding 为空或不准确时作为备选。r.headers:以字典形式返回响应头,字典键不区分大小写。r.cookies:返回请求后的 Cookie 对象。r.links:返回响应头中的 Link 字段内容,以字典形式存储。r.history:返回一个包含所有中间跳转响应的列表。r.is_redirect:判断响应是否是重定向(如 301、302 状态码)。r.is_permanent_redirect:判断响应是否是永久重定向(301 状态码)。r.next:返回下一个响应对象(如果存在重定向)。r.elapsed:返回从发送请求到收到响应的总耗时(timedelta 对象)。r.close():关闭响应对象,释放资源。r.iter_content(chunk_size=1, decode_unicode=False):以迭代的方式逐块读取响应内容,适合处理大文件。r.iter_lines(decode_unicode=False, chunk_size=512):以迭代的方式逐行读取响应内容,适合处理文本数据。r.request:返回发送的请求对象(requests.PreparedRequest)。r.raise_for_status():如果响应状态码表示请求失败(非 200 响应),则抛出异常。在进行网络爬虫开发或与 Web API 交互时,我们常常需要对 HTTP 请求进行定制化处理。
通过设置请求头,可以模拟不同的浏览器或客户端行为。
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br"
}
response = requests.get("https://example.com", headers=headers)
print(response.text)
Requests 库支持使用代理 IP,只需设置 proxies 参数即可。
import requests
proxies = {
"http": "http://123.45.67.89:8080",
"https": "https://123.45.67.89:8080"
}
response = requests.get("https://example.com", proxies=proxies)
print(response.text)
默认情况下,Requests 库会对 HTTPS 证书进行验证。
关闭证书验证
import requests
response = requests.get("https://example.com", verify=False)
print(response.text)
使用自定义证书文件
import requests
response = requests.get("https://example.com", verify="/path/to/certificate.pem")
print(response.text)
为了避免程序无限等待,可以通过设置超时时间来限制请求的等待时间。
import requests
try:
response = requests.get("https://example.com", timeout=5)
print(response.text)
except requests.exceptions.Timeout:
print("请求超时")
Cookies 是服务器存储在客户端的一小段文本信息。
从字符串转换 Cookies
import requests
temp_cookies = "cookie1=value1; cookie2=value2"
cookies = {}
for cookie in temp_cookies.split("; "):
key, value = cookie.split("=")
cookies[key] = value
response = requests.get("https://example.com", cookies=cookies)
print(response.text)
使用 RequestsCookieJar 对象
import requests
response = requests.get("https://example.com")
cookies = response.cookies
print(cookies)
response = requests.get("https://example.com", cookies=cookies)
print(response.text)
Cookies 的读写操作
import json
# 写入文件
with open("cookies.json", "w") as f:
json.dump(cookies, f)
# 读取文件
with open("cookies.json", "r") as f:
cookies = json.load(f)
print(cookies)
import requests
url = 'https://www.python.org/static/img/python-logo.png'
r = requests.get(url)
if r.status_code == 200:
with open('python.jpg', 'wb') as f:
f.write(r.content)
print("图片已成功下载并保存为 python.jpg")
else:
print("请求失败,状态码:", r.status_code)
文件上传的逻辑是把数据以字节流的形式上传到服务器上。难点在于服务器接收规则不同。
首先通过抓包工具来分析发布过程中的网络请求信息。

从图得知,该请求方式是 POST,QueryString 是 POST 的请求参数 data,Content-type 是上传文件。
代码实现如下:
url = 'https://weibo.cn/imblog/sendmblog?rl=0&st=bd6702'
cookies = {'xxx': 'xxx'}
files = {
'content': (None, 'Python 爬虫'),
'pic': ('pic', open('test.png', 'rb')), # 注意:实际使用时需确保文件路径正确
'visible': (None, '0')
}
r = requests.post(url, files=files, cookies=cookies)
print(r.status_code)
POST 数据对象是以文件为主的,上传文件时使用 files 参数作为请求参数。files 也是以字典形式传递的,每个 Content-Disposition 为字典的键值对,Content-Disposition 的 name 为字典的键,value 为字典的值。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online