python--爬虫--fiddler抓取python的请求进行分析
在编写爬虫或调试API接口时,我们经常需要查看程序发出去的HTTP请求具体是什么样子的。虽然浏览器开发者工具可以轻松捕获网页的请求,但当我们的请求是由Python脚本发起的,尤其是urllib、requests等库构造的请求时,这些工具就无能为力了。
Fiddler正是解决这个问题的利器。本文将手把手教你如何配置Fiddler,让它能抓取和分析Python程序发出的HTTP/HTTPS请求,并提供可直接运行的代码示例。
一、准备工作:Fiddler设置
1. 开启远程连接
首先,需要让Fiddler监听来自非本机的连接(如果你的Python程序和Fiddler在同一台机器,可以跳过此步,直接使用127.0.0.1)。
打开Fiddler -> Tools -> Options -> Connections选项卡,勾选 Allow remote computers to connect。Fiddler会提示重启,确认即可。此时,Fiddler的代理地址就是你的局域网IP,端口默认为8888。
2. 安装HTTPS证书(关键步骤)
要抓取Python程序发起的 HTTPS 请求,必须在运行Python程序的机器上安装并信任Fiddler的根证书。
在运行Python脚本的机器上,打开浏览器,访问 http://你的Fiddler机器IP:8888,点击页面中的 FiddlerRoot certificate 链接下载证书。下载后,双击安装,务必选择“安装到受信任的根证书颁发机构”。
小贴士:如果抓取HTTPS时出现
Tunnel to ...:443而看不到具体内容,多半是证书安装出了问题。
二、Python代码配置代理
方法一:使用 urllib.request(Python 3)
下面以你提供的代码为例,展示如何为 urllib.request 配置HTTPS代理。注意,代理协议的key要写https。
import urllib.request
import urllib.parse
import json
import time
def fetch_raw_post_meitu(link, data):
# 1. 配置代理:指向Fiddler所在机器的IP和端口
proxy_support = urllib.request.ProxyHandler({'https': '192.168.11.195:8888'})
opener = urllib.request.build_opener(proxy_support)
# 全局生效,之后所有urllib.request.urlopen都会走代理
urllib.request.install_opener(opener)
# 构造请求头
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = {
'User-Agent': user_agent,
"Content-Type": "application/json; charset=UTF-8"
}
# 打印参数方便调试
print({'data': json.dumps(data)})
print({'headers': json.dumps(headers)})
# 将data编码为URL参数格式 (application/x-www-form-urlencoded)
params = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(link, data=params, headers=headers)
# 发送请求
response = urllib.request.urlopen(req, timeout=6)
the_page = response.read()
content = the_page.decode("utf8")
time.sleep(1)
return content
关键点解析:
ProxyHandler({'https': 'IP:8888'}):指定代理。如果你的请求是http://开头,则将https改为http。urllib.request.install_opener(opener):将代理设置安装到全局,之后所有urlopen调用都会自动使用该代理。
方法二:使用 requests 库(推荐)
如果你更习惯使用简洁的requests库,设置代理会更方便:
import requests
proxies = {
"http": "http://192.168.11.195:8888",
"https": "http://192.168.11.195:8888", # 注意,Fiddler的https代理也使用http协议连接
}
# 针对单个请求设置代理
response = requests.get("https://httpbin.org/get", proxies=proxies)
# 或者为Session全局设置
session = requests.Session()
session.proxies = proxies
response = session.get("https://httpbin.org/get")
注意:Fiddler的HTTPS代理连接方式仍然是HTTP,所以
proxies中https对应的值是http://IP:8888。
方法三:环境变量方式(通用)
对于很多HTTP库,设置系统环境变量HTTP_PROXY和HTTPS_PROXY是一种通用做法。在运行Python脚本前,在终端执行:
export HTTP_PROXY="http://192.168.11.195:8888"
export HTTPS_PROXY="http://192.168.11.195:8888"
python your_script.py
三、在Fiddler中分析请求
配置好代理并运行Python脚本后,所有HTTP/HTTPS流量就会出现在Fiddler的会话列表中。你可以:
- 查看请求详情:点击某个会话,在右侧
Inspectors面板查看Headers、Cookies、Raw等。 - 对比代码:检查
User-Agent、Content-Type等头部信息是否与代码中设置的一致。 - 断点调试:在Fiddler底部命令行输入
bpu可设置断点,修改请求或响应内容,这对测试API边界条件非常有用。 - 过滤流量:使用右侧
Filters选项卡,只显示来自特定进程或包含特定域名的请求,避免杂乱。
四、常见问题与解决
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
Fiddler只显示Tunnel to ...:443,无具体内容 |
未安装或未信任Fiddler根证书 | 在运行Python的机器上重新下载安装证书,并确保证书被导入“受信任的根证书颁发机构” |
出现407 Proxy Authentication Required |
代理需要认证,但Fiddler默认不需要 | 检查Fiddler的Tools -> Options -> Gateway是否配置了上游代理;或检查Python代码代理URL格式 |
| 无法连接到代理,连接超时 | IP或端口错误;防火墙拦截 | 确认Fiddler的Allow remote computers to connect已勾选;在运行Python的机器上ping一下Fiddler机器的IP,并telnet IP 8888测试端口连通性 |
| 请求被Fiddler拦截后,Python脚本卡死 | Fiddler开启了“断点”模式 | 在Fiddler工具栏点击 Breakpoints 按钮取消断点,或点击 Go 按钮放行请求 |
五、总结
通过将Fiddler设置为中间代理,我们可以像调试浏览器请求一样,清晰地观察和分析Python程序构造的每一个HTTP/HTTPS请求。这不仅有助于验证爬虫代码的正确性,更是排查API调用问题、学习他人接口设计的有力手段。
文中提供的urllib.request和requests两种代理配置方式,基本覆盖了绝大多数Python爬虫或API调用场景。下次当你编写的请求“莫名其妙”失败时,不妨打开Fiddler,看看程序到底“说”了些什么。
更多推荐


所有评论(0)