如何在VSCode调试控制台中手动执行Scrapy请求并获取响应
Scrapy 在VSCode调试控制台手动发起请求的实现方法
注意:你示例中的请求代码多了一个多余的右大括号,实际运行会触发语法错误,正确写法为
yield scrapy.Request(website, callback=self.parse_site)
你之前直接创建scrapy.Request仅得到请求对象,是因为没有将请求交给Scrapy的下载器链路执行,以下方法可以在不重启调试器的前提下,直接调用Scrapy内置的下载能力拿到响应,且会自动应用你配置的所有请求规则(请求头、代理、Cookie、中间件逻辑等),比单独用requests更贴合实际运行效果。
实现方法
方法1:调用内置fetch工具(最简便)
在Spider方法的断点上下文中,直接在调试控制台输入以下代码即可:
from scrapy.utils.fetch import fetch resp = fetch(scrapy.Request(website, callback=self.parse_site), self.crawler)
执行后resp就是和正常爬虫流程拿到的完全一致的响应对象,你可以直接调用resp.text、resp.xpath()等接口测试,也可以手动执行回调验证解析逻辑:
# 手动执行解析逻辑,命中你在parse_site里打的断点 self.parse_site(resp)
方法2:直接调用下载器(兼容性更好,适合低版本Scrapy)
如果你的Scrapy版本低于2.0没有scrapy.utils.fetch模块,可以直接调用下载器接口:
# .result()会同步等待请求返回,和requests.get的使用体验一致 resp = self.crawler.engine.downloader.fetch(scrapy.Request(website, callback=self.parse_site), self).result()
进阶优化
你可以把调试用的请求方法直接写在你的Spider类里,后续调试不用重复输入导入代码:
class YourSpider(scrapy.Spider): name = "your_spider" # 省略其他配置、start_requests、parse等默认方法 def debug_req(self, url, callback=None): """调试用:直接请求目标url返回响应""" from scrapy.utils.fetch import fetch return fetch(scrapy.Request(url, callback=callback or self.parse), self.crawler)
后续在调试控制台直接输入resp = self.debug_req(website)即可快速拿到响应。
内容的提问来源于stack exchange,提问作者Mathew
相关产品推荐
相关产品推荐

