跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

Python Requests 库网络爬虫基础与实战

Python Requests 库是常用的 HTTP 客户端工具,支持 GET 和 POST 请求。涵盖请求参数设置、Response 对象属性(状态码、内容、编码)、复杂请求定制(Headers、代理、证书、超时、Cookies)以及文件下载与上传的实现方法。通过代码示例展示了如何使用 requests 进行网络数据交互及处理常见爬虫场景。

MongoKing发布于 2026/3/16更新于 2026/8/1443 浏览
Python Requests 库网络爬虫基础与实战

请求方式

HTTP 的请求方式分为 GET 和 POST。

GET 请求

url 语法如下:

# 不带参数
url_without_params = "https://www.baidu.com/"
# 带参数
url_with_params = "https://www.baidu.com/s?参数名=参数值"

注:如果一个 URL 有多个参数,参数之间用'&'连接。request 对于带参数的 url 请求有两种处理方式:

import requests
# 第一种方式
r = requests.get('https://www.baidu.com/s?参数名=参数值')
# 第二种方式
url = 'https://www.baidu.com/s'
params = {'参数名': '参数值'}
# 左边 params 在 GET 请求中表示设置参数
r = requests.get(url, params=params)
# 输出生成的 URL
print(r.url)

对于动态变化的参数,我们可以采用%s来占位的方式来处理:

url_template = 'https://www.baidu.com/s?参数名=%s'
search_term = '参数值'
# 使用字符串格式化将搜索词插入到 URL 中
formatted_url = url_template % search_term
print(formatted_url)

这样输出的将会是:https://www.baidu.com/s?参数名=参数值。

POST 请求

POST 请求常用来提交表单,表单数据就是 POST 的请求参数。在 requests 中实现 POST 请求时,需要设置 data 参数,数据格式可以是字典、元组、列表或 JSON。不同格式各有优势。

# 字典类型
data = {'key1': 'value1', 'key2': 'value2'}
# 元组或列表
# 这里应该是元组的列表,而不是元组中包含元组
tuple_list = (('key1', 'value1'), ('key2', 'value2'))
# JSON
import json
# 将字典转换为 JSON
data_json = json.dumps(data)
# 发送 POST 请求
import requests
r = requests.post("https://www.baidu.com/", data=data_json)
print(r.text)

什么是 JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 编程语言的一个子集,但是它是独立于语言的,许多不同的编程语言都支持生成和解析 JSON 数据,使其成为理想的数据交换语言。

JSON 是构建在两种结构之上的:

  1. 键值对:数据以 名称/值 对的形式存储,其中名称(或称为键)是一个字符串,而值可以是字符串、数字、数组、布尔值或另一个 JSON 对象。
  2. 数组:数据以有序的列表形式存储,列表中的每个元素可以是字符串、数字、数组、布尔值或另一个 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"
  }
}

在这个例子中,name、age、is_student、hobbies和address是键,而它们对应的值分别是字符串、数字、布尔值、字符串数组和另一个 JSON 对象。

JSON 因其简洁和易于解析的特性,在 Web 开发中被广泛用于客户端和服务器之间的数据交换。例如,当一个 Web 应用从服务器请求数据时,服务器通常会以 JSON 格式返回数据,然后 Web 应用可以使用 JavaScript 轻松地解析这些数据并更新用户界面。

requests.Response 对象的属性和方法

1. 基本响应信息

  • r.status_code
    • 作用:返回响应状态码(如 200、404、500 等)。
    • 使用场景:判断请求是否成功。
  • r.reason
    • 作用:返回响应状态码的文本描述(如 OK、Not Found 等)。
    • 使用场景:提供更详细的响应状态描述。
  • r.url
    • 作用:返回实际请求的 URL(可能经过重定向后的最终 URL)。
    • 使用场景:确认请求的最终地址。

2. 响应内容

  • r.raw
    • 作用:返回原始响应体,可以通过 r.raw.read() 读取。
    • 使用场景:处理二进制数据或流式响应。
  • r.content
    • 作用:以字节方式返回响应体,需要手动解码。
    • 使用场景:处理二进制文件(如图片、视频)。
  • r.text
    • 作用:以字符串方式返回响应体,会自动根据响应头的 Content-Type 或 Content-Encoding 解码。
    • 使用场景:处理文本内容(如 HTML、JSON)。
  • r.json()
    • 作用:将响应体解析为 JSON 对象。
    • 使用场景:处理 JSON 格式的响应数据。
  • r.encoding
    • 作用:返回响应的编码格式(如 utf-8)。
    • 使用场景:确认或修改响应的编码。
  • r.apparent_encoding
    • 作用:基于响应内容分析得出的编码格式(可能与 r.encoding 不同)。
    • 使用场景:当 r.encoding 为空或不准确时,作为备选编码。

3. 响应头和 Cookie

  • r.headers
    • 作用:以字典形式返回响应头,字典键不区分大小写。
    • 使用场景:获取响应头中的信息(如 Content-Type、Content-Length 等)。
  • r.cookies
    • 作用:返回请求后的 Cookie 对象。
    • 使用场景:获取服务器返回的 Cookie 信息。
  • r.links
    • 作用:返回响应头中的 Link 字段内容,以字典形式存储。
    • 使用场景:处理分页或资源链接。

4. 重定向和跳转

  • r.history
    • 作用:返回一个包含所有中间跳转响应的列表。
    • 使用场景:跟踪请求的跳转路径。
  • r.is_redirect
    • 作用:判断响应是否是重定向(如 301、302 状态码)。
    • 使用场景:控制重定向逻辑。
  • r.is_permanent_redirect
    • 作用:判断响应是否是永久重定向(301 状态码)。
    • 使用场景:处理需要更新 URL 的重定向。
  • r.next
    • 作用:返回下一个响应对象(如果存在重定向)。
    • 使用场景:手动处理重定向时获取下一个响应。

5. 性能和资源管理

  • r.elapsed
    • 作用:返回从发送请求到收到响应的总耗时(timedelta 对象)。
    • 使用场景:用于性能测试或监控请求的响应时间。
  • r.close()
    • 作用:关闭响应对象,释放资源。
    • 使用场景:在使用 r.raw 或处理大文件时,手动关闭响应对象以释放资源。

6. 迭代和流式处理

  • r.iter_content(chunk_size=1, decode_unicode=False)
    • 作用:以迭代的方式逐块读取响应内容,适合处理大文件。
    • 参数:
      • chunk_size:每次读取的块大小(以字节为单位)。
      • decode_unicode:是否将内容解码为 Unicode。
    • 使用场景:下载大文件时逐块写入磁盘,避免占用过多内存。
  • r.iter_lines(decode_unicode=False, chunk_size=512)
    • 作用:以迭代的方式逐行读取响应内容,适合处理文本数据。
    • 参数:
      • decode_unicode:是否将内容解码为 Unicode。
      • chunk_size:每次读取的块大小。
    • 使用场景:处理日志文件或文本数据时逐行读取。

7. 请求信息

  • r.request
    • 作用:返回发送的请求对象(requests.PreparedRequest)。
    • 使用场景:调试或查看发送的请求细节(如请求头、请求体等)。

8. 异常处理

  • r.raise_for_status()
    • 作用:如果响应状态码表示请求失败(非 200 响应),则抛出异常。
    • 使用场景:在需要严格处理请求失败时,自动抛出异常。

提交复杂的请求

在进行网络爬虫开发或与 Web API 交互时,我们常常需要对 HTTP 请求进行定制化处理,以满足各种复杂场景的需求。本文将详细介绍如何使用 Python 的 Requests 库实现复杂网络访问,包括添加请求头、使用代理 IP、证书验证、超时设置以及使用 Cookies 等常用功能。

一、添加请求头

在 HTTP 请求中,请求头(Headers)是客户端向服务器发送额外信息的重要载体,例如指定客户端的类型、语言、接受的数据类型等。通过设置请求头,可以模拟不同的浏览器或客户端行为,从而提高请求的成功率和兼容性。

以下是添加请求头的代码示例:

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"
}
# 发送请求并设置 headers 参数
response = requests.get("https://example.com", headers=headers)
# 打印响应内容
print(response.text)

在上述代码中,我们首先定义了一个名为 headers 的字典,其中包含了常见的请求头字段,如 User-Agent、Accept-Language 和 Accept-Encoding。然后在 requests.get 方法中通过 headers 参数将该字典传递给请求,从而在发送请求时附加了这些自定义的请求头信息。

二、使用代理 IP

在某些情况下,我们可能需要通过代理服务器来发送请求,例如隐藏真实 IP 地址、访问受限地区的内容等。Requests 库支持使用代理 IP,其使用方法与添加请求头类似,只需设置 proxies 参数即可。

以下是使用代理 IP 的代码示例:

import requests
# 定义代理 IP
proxies = {
    "http": "http://123.45.67.89:8080",
    "https": "https://123.45.67.89:8080"
}
# 发送请求并设置 proxies 参数
response = requests.get("https://example.com", proxies=proxies)
# 打印响应内容
print(response.text)

在代码中,proxies 是一个字典,其键分别为 "http" 和 "https",对应的值是代理服务器的地址和端口号。通过设置 proxies 参数,Requests 库会将请求通过指定的代理服务器发送出去。

需要注意的是,在使用代理 IP 时,应确保代理服务器的地址和端口号是有效的,并且代理服务器支持目标网站的访问。此外,代理服务器可能会对请求进行限制或修改,因此在使用过程中需要根据实际情况进行调试和优化。

三、证书验证

在与 HTTPS 网站进行交互时,证书验证是一个重要的安全机制。默认情况下,Requests 库会对 HTTPS 证书进行验证,以确保通信的安全性。然而,在某些开发或测试环境中,我们可能需要关闭证书验证,或者使用自定义的证书文件。

关闭证书验证
import requests
# 发送请求并关闭证书验证
response = requests.get("https://example.com", verify=False)
# 打印响应内容
print(response.text)

在上述代码中,通过将 verify 参数设置为 False,可以关闭对 HTTPS 证书的验证。这在开发过程中用于测试或访问自签名证书的网站时非常有用,但在生产环境中不建议关闭证书验证,因为这会降低通信的安全性。

使用自定义证书文件
import requests
# 发送请求并指定证书文件路径
response = requests.get("https://example.com", verify="/path/to/certificate.pem")
# 打印响应内容
print(response.text)

如果需要使用自定义的证书文件进行验证,可以将 verify 参数的值设置为证书文件的路径。这在访问需要特定证书验证的网站时非常有用,例如企业内部的 HTTPS 服务。

四、超时设置

在网络请求过程中,由于网络延迟、服务器响应缓慢等原因,可能会导致请求长时间没有得到响应。为了避免程序无限等待,可以通过设置超时时间来限制请求的等待时间。

以下是超时设置的代码示例:

import requests
# 发送请求并设置超时时间为 5 秒
try:
    response = requests.get("https://example.com", timeout=5)
    print(response.text)
except requests.exceptions.Timeout:
    print("请求超时")

在代码中,通过设置 timeout 参数的值为 5,表示请求的超时时间为 5 秒。如果在 5 秒内没有收到服务器的响应,Requests 库会抛出一个 Timeout 异常。通过捕获该异常,可以对超时情况进行相应的处理,例如重试请求或提示用户。

需要注意的是,超时时间的设置应根据实际需求进行调整。如果目标网站的响应速度较慢,可以适当增加超时时间;如果对响应速度要求较高,可以适当减少超时时间。

五、使用 Cookies

Cookies 是服务器存储在客户端的一小段文本信息,用于标识用户身份、记录用户偏好等。在使用 Requests 库发送请求时,可以通过设置 cookies 参数来使用 Cookies,从而实现会话管理等功能。

从字符串转换 Cookies
import requests
# 从浏览器获取的 Cookies 字符串
temp_cookies = "cookie1=value1; cookie2=value2"
# 将 Cookies 字符串转换为字典
cookies = {}
for cookie in temp_cookies.split("; "):
    key, value = cookie.split("=")
    cookies[key] = value
# 发送请求并设置 cookies 参数
response = requests.get("https://example.com", cookies=cookies)
# 打印响应内容
print(response.text)

在上述代码中,temp_cookies 是从浏览器的开发者工具中获取的 Cookies 字符串。通过两次分割操作,第一次以 "; " 分割得到列表 A,第二次对列表 A 中的每个元素以 "=" 分割得到字典的键值对,从而将 Cookies 字符串转换为字典格式。然后在 requests.get 方法中通过 cookies 参数将该字典传递给请求,即可在请求中使用这些 Cookies。

使用 RequestsCookieJar 对象
import requests
# 发送请求并获取服务器返回的响应
response = requests.get("https://example.com")
cookies = response.cookies
# 打印 Cookies 信息
print(cookies)
# 再次发送请求并使用获取到的 Cookies
response = requests.get("https://example.com", cookies=cookies)
# 打印响应内容
print(response.text)

在代码中,当程序发送请求时(不设置参数 cookies),Requests 库会自动生成一个 RequestsCookieJar 对象,该对象用于存放服务器返回的 Cookies 信息。通过 response.cookies 可以获取到该对象,然后在后续的请求中通过 cookies 参数将该对象传递给请求,从而实现 Cookies 的传递和使用。

Cookies 的读写操作

如果需要将 Cookies 信息持久化存储,可以使用 http 模块实现 Cookies 的读写操作。此外,还可以将 Cookies 以字典形式写入文件,这种方法相对简单,但安全性较低。以下是将 Cookies 以字典形式写入文件的代码示例:

import json
# 将 Cookies 以字典形式写入文件
with open("cookies.json", "w") as f:
    json.dump(cookies, f)
# 从文件中读取 Cookies
with open("cookies.json", "r") as f:
    cookies = json.load(f)
# 打印读取到的 Cookies
print(cookies)

在代码中,通过 json 模块的 dump 方法将 Cookies 字典写入文件,通过 load 方法从文件中读取 Cookies 字典。这种方法可以方便地将 Cookies 信息保存到本地文件中,以便在后续的程序运行中能够重复使用。

下载与上传文件

文件下载

用 Python 的 requests 库从网络上下载图片并保存到本地的基本示例:

import requests
# 图片的 URL
url = 'https://www.python.org/static/img/python-logo.png'
# 发送 GET 请求
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)

代码解释:

  1. 导入库:import requests:导入 requests 库,用于发送 HTTP 请求。
  2. 设置 URL:url='...'
  3. 发送请求:r = requests.get(url):使用 requests.get() 方法发送 GET 请求到指定的 URL。
  4. 检查响应状态码:if r.status_code == 200::检查响应的状态码是否为 200(表示请求成功)。
  5. 保存文件:with open('python.jpg', 'wb') as f::以二进制写入模式打开一个文件,文件名为 python.jpg。
    • f.write(r.content):将响应内容(图片的二进制数据)写入文件。
  6. 关闭文件:使用 with 语句自动管理文件的打开和关闭,不需要显式调用 f.close()。
  7. 错误处理:如果请求失败(状态码不是 200),打印错误信息。

文件上传

文件上传的逻辑是把数据以字节流的形式上传到服务器上,再由服务器接收内容,文件上传有一定难度,难点在于服务器接收规则不同。

分析请求

首先通过抓包工具来分析发布过程中的网络请求信息:

  1. 访问目标网站并准备抓包。
  2. 使用抓包工具捕获客户端和服务器之间的 HTTP/HTTPS 通信。
  3. 执行发布操作(选择文件、输入内容、点击发布按钮)。
  4. 查看抓取的请求信息,包括请求的 URL、请求方法(如 POST)、请求头、请求体、响应状态码等。

从图得知,该请求方式是 POST,QueryString 是 POST 的请求参数 data,Content-type 是上传文件,三个 Content-Disposition 分别对应发布内容、发布图片和设置分组可见。代码实现如下:

url = 'https://weibo.cn/imblog/sendmblog?rl=0&st=bd6702'
cookies = {'xxx': 'xxx'}
files = {
    'content': (None, 'Python 爬虫'),
    'pic': ('pic', open('test.png', 'rb')), 'image/png',
    'visible': (None, '0')
}
r = requests.post(url, files=files, cookies=cookies)
print(r.status_code)

POST 数据对象是以文件为主的,上传文件时使用 files 参数作为请求参数。Requests 对提交的数据和文件所使用的请求参数做了明确的规定。

参数 files 也是以字典形式传递的,每个 Content-Disposition 为字典的键值对,Content-Disposition 的 name 为字典的键,value 为字典的值。

目录

  1. 请求方式
  2. GET 请求
  3. 不带参数
  4. 带参数
  5. 第一种方式
  6. 第二种方式
  7. 左边 params 在 GET 请求中表示设置参数
  8. 输出生成的 URL
  9. 使用字符串格式化将搜索词插入到 URL 中
  10. POST 请求
  11. 字典类型
  12. 元组或列表
  13. 这里应该是元组的列表,而不是元组中包含元组
  14. JSON
  15. 将字典转换为 JSON
  16. 发送 POST 请求
  17. 什么是 JSON
  18. requests.Response 对象的属性和方法
  19. 1. 基本响应信息
  20. 2. 响应内容
  21. 3. 响应头和 Cookie
  22. 4. 重定向和跳转
  23. 5. 性能和资源管理
  24. 6. 迭代和流式处理
  25. 7. 请求信息
  26. 8. 异常处理
  27. 提交复杂的请求
  28. 一、添加请求头
  29. 定义请求头
  30. 发送请求并设置 headers 参数
  31. 打印响应内容
  32. 二、使用代理 IP
  33. 定义代理 IP
  34. 发送请求并设置 proxies 参数
  35. 打印响应内容
  36. 三、证书验证
  37. 关闭证书验证
  38. 发送请求并关闭证书验证
  39. 打印响应内容
  40. 使用自定义证书文件
  41. 发送请求并指定证书文件路径
  42. 打印响应内容
  43. 四、超时设置
  44. 发送请求并设置超时时间为 5 秒
  45. 五、使用 Cookies
  46. 从字符串转换 Cookies
  47. 从浏览器获取的 Cookies 字符串
  48. 将 Cookies 字符串转换为字典
  49. 发送请求并设置 cookies 参数
  50. 打印响应内容
  51. 使用 RequestsCookieJar 对象
  52. 发送请求并获取服务器返回的响应
  53. 打印 Cookies 信息
  54. 再次发送请求并使用获取到的 Cookies
  55. 打印响应内容
  56. Cookies 的读写操作
  57. 将 Cookies 以字典形式写入文件
  58. 从文件中读取 Cookies
  59. 打印读取到的 Cookies
  60. 下载与上传文件
  61. 文件下载
  62. 图片的 URL
  63. 发送 GET 请求
  64. 检查请求是否成功
  65. 文件上传
  66. 分析请求
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 万能头文件 #include<bits/stdc++.h> 详解
  • Openclaw 结合 Seed2.0 Skills 实现 AI 漫剧自动化生成
  • 深入理解 Claude Code:架构、上下文与工具系统
  • 青海学子 AI 农业创业实践:基于 ViT 的病虫害检测系统
  • Neo4j Desktop 2.0 自定义安装路径指南
  • Cursor 图形化拉取 GitHub 远程代码至本地
  • Spring Boot 集成 MyBatis 实战详解(一)
  • 基于 AutoJS 实现微信朋友圈自动点赞脚本
  • Transformer 分词算法详解
  • 基于 PaddleOCR-VL-WEB 实现多语言快递面单智能解析
  • GitHub 教育认证通过后如何领取 Copilot Pro
  • 汇川 InoRoboLab 机器人软件常规操作要点
  • 卷积神经网络(CNN)进阶:经典架构解析与实战开发
  • ChatGPT-4 与 GPT-3.5 Prompt 差异分析及设计策略
  • Java 响应式编程:Mono 接口深度解析
  • Flutter tflite_web 在鸿蒙 Web 组件下的 AI 推理适配
  • AI 时代:非技术背景者的生产力变革与商业机会
  • 利用 AI 快速构建 7c 原则视频生成工具
  • Spring Boot 日志框架体系与配置实战
  • 关于人工智能与人类边界:一场深度哲学对话

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online