You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看Scrapy发送请求的精确字节内容?

如何查看Scrapy发送的原始请求字节内容用于调试

要排查这类请求头顺序或细微格式差异导致的反爬问题,直接查看Scrapy发送的原始请求字节是最有效的方法,以下是两种可行方案:

方案1:自定义下载中间件捕获请求字节

通过编写Scrapy下载中间件,在请求发送前手动构建并输出完整的HTTP请求字节流,步骤如下:

  1. 在你的Scrapy项目的middlewares.py中添加以下中间件代码:
from scrapy import signals
from scrapy.http import HttpRequest
from scrapy.utils.httpobj import urlparse_cached

class DebugRawRequestMiddleware:
    @classmethod
    def from_crawler(cls, crawler):
        return cls()

    def process_request(self, request, spider):
        if isinstance(request, HttpRequest):
            # 解析URL构建请求行
            parsed_url = urlparse_cached(request)
            method = request.method.encode()
            path = parsed_url.path.encode() or b"/"
            if parsed_url.query:
                path += b"?" + parsed_url.query.encode()
            request_line = b" ".join([method, path, b"HTTP/1.1"]) + b"\r\n"

            # 按请求头的实际顺序构建头字节
            headers_bytes = []
            for key, value in request.headers.items():
                header_key = key.encode()
                header_val = value.encode() if isinstance(value, str) else value
                headers_bytes.append(header_key + b": " + header_val + b"\r\n")
            headers_bytes = b"".join(headers_bytes)

            # 拼接请求体(如果存在)
            body = request.body or b""
            raw_request = request_line + headers_bytes + b"\r\n" + body

            # 输出原始请求(可打印日志或写入文件)
            spider.logger.debug(f"Raw request content:\n{raw_request!r}")
            with open(f"scrapy_request_{spider.name}.bin", "wb") as f:
                f.write(raw_request)
        return None
  1. 在项目的settings.py中启用该中间件:
DOWNLOADER_MIDDLEWARES = {
    # 优先级设为100,确保在其他修改请求的中间件之前执行
    'your_project_name.middlewares.DebugRawRequestMiddleware': 100,
}

运行爬虫后,就能在日志或生成的bin文件中看到Scrapy发送的精确请求字节。

方案2:系统级抓包工具捕获原始流量

如果中间件的方式不够直观,直接用网络抓包工具捕获Scrapy的网络请求,能看到最真实的传输字节:

用tcpdump抓包

执行以下命令捕获80/443端口的流量(对应HTTP/HTTPS):

tcpdump -i any port 80 or port 443 -w scrapy_requests.pcap

启动爬虫后,停止tcpdump,用Wireshark打开生成的scrapy_requests.pcap文件,找到对应请求后查看「Raw Data」字段即可获取完整请求字节。

解密HTTPS流量

如果目标网站是HTTPS,需要先设置SSL密钥日志让Wireshark解密:

# Linux/macOS
export SSLKEYLOGFILE=./ssl_keys.log
# Windows(PowerShell)
$env:SSLKEYLOGFILE = ".\ssl_keys.log"

启动Scrapy爬虫后,在Wireshark中依次点击「Edit → Preferences → Protocols → TLS → (Pre)-Master-Secret log filename」,选择生成的ssl_keys.log,即可解密HTTPS请求内容。

对比调试技巧

同时用curl捕获请求的原始内容,方便和Scrapy的请求做对比:

curl -v --trace-ascii curl_request_trace.txt https://target-domain.com

查看curl_request_trace.txt中的请求部分,和Scrapy的原始字节逐段对比,就能快速找出请求头顺序、隐式添加的字段(比如Scrapy自动添加的Accept-Encoding)等差异。

内容的提问来源于stack exchange,提问作者Sylvain Hubert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 23:30:08