Scrapy爬虫无法将数据保存至jsonlines文件问题求助
问题分析与解决方案
你的爬虫日志显示已成功抓取数据,但JSON Lines文件始终为空,且FEED_EXPORT_BATCH_ITEM_COUNT配置不生效,核心原因是**JOBDIR持久化配置的影响**,结合细节调整,具体解决步骤如下:
1. 临时关闭JOBDIR(优先测试)
当启用JOBDIR开启爬虫持久化时,Scrapy会将抓取的Item临时缓存到持久化目录中,不会实时写入Feed文件,即使配置了FEED_EXPORT_BATCH_ITEM_COUNT也会被忽略。只有当爬虫正常结束(非强制中断)时,才会一次性写入所有缓存的Item。
测试时先注释掉custom_settings中的JOBDIR配置:
custom_settings = { 'ROBOTSTXT_OBEY': False, 'DOWNLOAD_DELAY': 2, 'FEEDS': {'medscape_links.jsonl': {'format': 'jsonlines',}}, 'FEED_EXPORT_BATCH_ITEM_COUNT': 10, # 'JOBDIR': 'crawl_state', # 注释该行 }
重新运行爬虫,观察是否能生成包含数据的JSON Lines文件。
2. 优化FEEDS配置(避免潜在写入问题)
补充显式参数完善写入逻辑,避免增量或编码问题:
'FEEDS': { 'medscape_links.jsonl': { 'format': 'jsonlines', 'encoding': 'utf-8', 'overwrite': True, # 覆盖已有文件,避免增量写入混淆 'store_empty': False, # 无数据时不生成空文件 }, }
3. 确保爬虫正常结束(若需保留JOBDIR)
如果必须使用JOBDIR持久化,不要强制终止爬虫(如Ctrl+C),需让爬虫自然结束。可以添加配置限制爬取数量,测试写入逻辑:
custom_settings = { # ... 其他配置 'CLOSESPIDER_ITEMCOUNT': 50, # 抓取50个Item后自动停止 'JOBDIR': 'crawl_state', }
4. 排查Item过滤问题
虽然日志显示Scraped from <200 ...>,仍需确认是否有自定义中间件过滤了Item。临时关闭所有自定义中间件,仅保留Scrapy默认组件,测试是否能正常写入。
内容的提问来源于stack exchange,提问作者Enrico Shippole
相关产品推荐
相关产品推荐

