Scrapy 2.5.1运行CrawlSpider导出JSON文件为空问题求助
Scrapy爬虫输出空JSON排查方案
你的爬虫能正常发起请求、拿到200响应,但没有输出任何Item,核心是3个代码逻辑问题,和Scrapy 2.5.1版本本身无关:
- 规则匹配范围错误
你当前写的LinkExtractor(allow = r'category/stories-arcs-')规则,只会匹配URL路径中带category/stories-arcs-的分类列表页,真正包含小说章节标题、标签内容的详情页URL格式类似/arc-1-gestation/1-01/,路径中没有你写的匹配串,根本不会触发parse_item回调,自然没有数据输出。 - XPath取值逻辑错误
你写的/text()只会取当前节点的直接子文本,目标站点的h1.entry-title、span.tag-links节点内的文本是嵌套在子标签里的,直接取直接子文本会拿到空值。 - 页面关闭阈值设置不合理
你设置的CLOSESPIDER_PAGECOUNT=10阈值太小,CrawlSpider启动后会先批量把首页提取到的链接加入队列,触发关闭阈值时队列里的待爬请求仍会执行,但这些请求里大部分是分类列表页,还没爬到足够的详情页就会结束。
可直接复用的修复代码
修正Rule规则
把分类列表页和详情页的规则分开,列表页只做链接跟进,详情页触发数据解析:
rules = ( # 分类列表页:仅跟进链接,不解析数据 Rule(LinkExtractor(allow=r'category/stories-arcs-'), follow=True), # 章节详情页:匹配带/数字-数字/格式的章节URL,触发解析回调,无需继续跟进 Rule(LinkExtractor(allow=r'/\d+-\d+(?:/)?$'), callback='parse_item', follow=False), )
修正XPath取值逻辑
把/text()改成//text()获取节点下所有嵌套文本,单值字段用get()取单个结果,多值标签字段保留getall(),同时做简单的空值和空白字符处理:
def parse_item(self, response): yield { 'Arco': response.xpath('//h1[@class="entry-title"]//text()').get('').strip(), 'tags': [tag.strip() for tag in response.xpath('//span[@class="tag-links"]//text()').getall() if tag.strip()] }
验证方式
修改后重新执行scrapy crawl Worm -O Testeo.json,观察终端日志,如果出现[scrapy.core.scraper] DEBUG: Scraped from <200 xxx章节url>的日志行,就说明回调正常触发,JSON文件会正常写入数据。调试阶段可以先把CLOSESPIDER_PAGECOUNT配置注释掉,等确认能正常抓数据后再按需设置爬取上限。
注意:使用CrawlSpider时不要自定义名为
parse的方法,会覆盖框架原生的规则匹配逻辑,导致所有规则失效。
内容的提问来源于stack exchange,提问作者Nicolas Blanco
相关产品推荐
相关产品推荐

