vscode调试爬虫网络请求需协同python调试器与rest client:同步爬虫断点打在requests.get()行并设"console":"integratedterminal";异步需启用"subprocess":true和"justmycode":false;scrapy须用run.py代理入口并配"module":"runpy";rest client复现请求时需严格匹配headers、禁用证书验证并统一user-agent。

VSCode 里调试爬虫的网络请求,不能靠“看代码猜行为”,得让请求真正发出、响应真实可见、中间状态可拦截——这需要两套工具协同:一套用于调试 Python 爬虫本体(断点、变量、调用栈),另一套用于独立验证和观察 HTTP 请求本身(headers、body、重定向、SSL 行为)。两者目标不同,混用会卡在“到底该信哪边”的困境里。
爬虫代码里断点不进 requests.get() 或 aiohttp.ClientSession.get() 怎么办
这不是网络问题,是调试器没挂载到实际执行线程上。常见于异步爬虫或子进程场景。
- 同步
requests爬虫:断点打在response = requests.get(...)这行,F5 启动后必须停住——如果不停,先检查launch.json是否设了"console": "integratedTerminal";没设的话,某些 SSL 错误或重定向会静默失败,控制台也不报错 - 异步
aiohttp或httpx.AsyncClient:VSCode 默认 Python 调试器不支持 asyncio event loop 内部调度。断点会灰掉,或只在async def main()入口停一次,进不去await session.get()。必须改用"type": "python"配置里的"subProcess": true,并确保justMyCode为false(否则跳过库代码,根本进不了 aiohttp 内部) - 用了
multiprocessing拉取页面:子进程完全脱离主调试上下文。别在子进程函数里打点,改用logging.debug()+sys.stderr.write()输出到终端,再配合"console": "integratedTerminal"查看
想确认请求发出去了没、带了哪些 headers、有没有被重定向——别跑 Python 脚本,用 REST Client
直接在 VSCode 里复现爬虫发出的请求,比翻日志快十倍。关键不是“能不能发”,而是“发得和爬虫一模一样”。
- 复制爬虫里的 URL、headers(尤其是
User-Agent、Cookie、Referer)、query 参数,粘贴到.http文件里,格式严格:headers 和 body 之间空一行,Content-Type必须显式写 - 如果爬虫用了动态 token 或时间戳,REST Client 支持
{{now}}变量(需开启rest-client.enableRequestTimestamp设置),或手动写@token = {{jwt_token}}+ 在响应里用### @name login提取Set-Cookie - 遇到 SSL 验证失败(
CERTIFICATE_VERIFY_FAILED),REST Client 默认校验证书;可在设置里关掉:"rest-client.validateCertificates": false,但仅限本地调试
scrapy crawl spider_name 根本进不了断点?你没走对启动入口
Scrapy 不是普通脚本,scrapy 命令行是通过 pkg_resources 动态加载的,VSCode 调试器看不到。直接在 spiders/xxx.py 里打点,等于在给空气设断点。
- 必须建一个
run.py(和scrapy.cfg同级),内容三要素缺一不可:sys.path.append(...)补路径、os.chdir(...)切工作目录、execute(['scrapy', 'crawl', 'spider_name']) -
launch.json里不能用"program": "${file}",必须用"module": "runpy"+"args": ["-m", "run"],否则解释器找不到scrapy模块 - 如果
scrapy list在终端能跑,但在 VSCode 里报No module named 'scrapy',说明Python: Select Interpreter选错了——必须选虚拟环境里的python.exe,不是系统 Python
抓包看到请求发了但返回 403/429,而 REST Client 却正常?查 User-Agent 和 Accept-Encoding
很多反爬机制不看 cookie 或 token,专盯请求指纹。VSCode 的 REST Client 默认带 User-Agent: vscode-restclient 和 Accept-Encoding: gzip,而你的爬虫如果没显式设 headers,requests 默认用 python-requests/2.x,极易被识别。
- 在爬虫里补全 headers:
{"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36", "Accept-Encoding": "gzip, deflate"} - REST Client 里也同步改掉默认 header,在
settings.json加:"rest-client.defaultHeaders": {"User-Agent": "xxx", "Accept-Encoding": "gzip, deflate"} - 如果用了 Selenium 或 Playwright,它们自带完整浏览器 UA 和指纹,此时 REST Client 就没法模拟——这类请求必须进浏览器开发者工具 Network 面板看,VSCode 只能调试 Python 控制逻辑
最常被忽略的一点:网络调试不是“让请求跑通”,而是“让每个环节可证伪”。断点停在 response.status_code 前,不代表请求已发出;REST Client 返回 200,也不代表爬虫里 requests 没被代理或 DNS 劫持。真要定位,得同时开三个面板:VSCode Debug Console、REST Client 响应窗口、终端里 curl -v 输出——三者对比 headers 和 timing,才能揪出那个少写了冒号、多缩进了一格、或环境变量没加载的微小偏差。











