Scrapy爬虫动态添加CSV输出列的技术问题咨询
解决爬虫CSV动态列的问题
嘿,我来帮你搞定这个CSV列动态调整的事儿!你遇到的问题其实是Scrapy(我猜你用的是Scrapy吧?毕竟提到了yield)CSV导出器的默认行为导致的——它会把第一个被yield的Item的字段作为CSV的表头,后续Item里新增的字段就不会被加到CSV里了。下面给你几个实用的解决方案:
提前定义所有可能的字段(最推荐)
直接在你的Item类里把两个站点可能抓取到的所有字段都定义好,这样不管你先yield哪个站点的数据,CSV都会保留所有列,没有数据的字段会自动留空。示例代码:class TargetItem(scrapy.Item): # 第一个站点的核心字段 site1_title = scrapy.Field() site1_content = scrapy.Field() # 第二个站点的额外字段(不管有没有数据都先定义) site2_extra_info = scrapy.Field() site2_extra_detail = scrapy.Field()这样后续抓取到第二个站点的数据时,直接给对应的字段赋值就行,CSV会完整输出所有列。
强制指定CSV导出字段
如果不想在Item里提前写死所有字段,可以在爬虫的settings.py里配置FEED_EXPORT_FIELDS,手动指定CSV要包含的所有列。比如:FEED_EXPORT_FIELDS = ['site1_title', 'site1_content', 'site2_extra_info', 'site2_extra_detail']这个配置会覆盖导出器默认的表头逻辑,不管你yield的Item顺序如何,CSV都会严格按照这个列表输出列。
关于你提到的<改>测试
你发现改比较符号后列数变化,其实就是验证了导出器的默认行为:第一个yield的Item决定了表头字段。如果先yield包含额外字段的Item,表头就会包含那些列;反之就只会有第一个站点的字段。但这种靠调整抓取顺序的方式不稳定,毕竟爬虫的抓取顺序可能受目标站点响应速度影响,还是前面两种方法更可靠。
内容的提问来源于stack exchange,提问作者Marcelo
相关产品推荐
相关产品推荐

