在编写爬虫或调试API接口时,我们经常需要查看程序发出去的HTTP请求具体是什么样子的。虽然浏览器开发者工具可以轻松捕获网页的请求,但当我们的请求是由Python脚本发起的,尤其是urllibrequests等库构造的请求时,这些工具就无能为力了。

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,所以proxieshttps对应的值是http://IP:8888

方法三:环境变量方式(通用)

对于很多HTTP库,设置系统环境变量HTTP_PROXYHTTPS_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的会话列表中。你可以:

  1. 查看请求详情:点击某个会话,在右侧 Inspectors 面板查看 HeadersCookiesRaw 等。
  2. 对比代码:检查User-AgentContent-Type等头部信息是否与代码中设置的一致。
  3. 断点调试:在Fiddler底部命令行输入 bpu 可设置断点,修改请求或响应内容,这对测试API边界条件非常有用。
  4. 过滤流量:使用右侧 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.requestrequests两种代理配置方式,基本覆盖了绝大多数Python爬虫或API调用场景。下次当你编写的请求“莫名其妙”失败时,不妨打开Fiddler,看看程序到底“说”了些什么。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐