如何查看Scrapy发送请求的精确字节内容?
如何查看Scrapy发送的原始请求字节内容用于调试
要排查这类请求头顺序或细微格式差异导致的反爬问题,直接查看Scrapy发送的原始请求字节是最有效的方法,以下是两种可行方案:
方案1:自定义下载中间件捕获请求字节
通过编写Scrapy下载中间件,在请求发送前手动构建并输出完整的HTTP请求字节流,步骤如下:
- 在你的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
- 在项目的
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
相关产品推荐
相关产品推荐

