Scrapy爬取WebMD医生数据出现空行及标题重复问题求助
解决Scrapy爬取医生数据时的格式问题
咱们先拆解你遇到的两个核心问题:每条记录间有空行和首行标题重复,这俩问题大多和Scrapy的输出配置或者数据提取细节有关,下面给你针对性的解决办法:
1. 消除记录间的空行
如果是用scrapy crawl main_spider -o doctors.csv这类命令导出CSV格式,默认情况下Scrapy的CSV导出器会在每条记录后添加空行。你可以修改项目的settings.py来调整这个行为:
# 明确指定导出字段顺序(可选但推荐) FEED_EXPORT_FIELDS = ["Name", "Speciality", "Years of experience", "Employer", "Address", "City", "Url"] FEED_EXPORT_ENCODING = 'utf-8' # 强制使用单换行符,避免空行 FEED_EXPORT_CSV_LINE_ENDINGS = '\n'
另外,你代码里的print(doctor)会在控制台输出医生链接,可能和最终的爬取结果输出混在一起造成视觉上的“空行”,建议把这行注释掉,避免干扰最终输出格式。
2. 解决首行标题重复的问题
表头重复通常是因为Scrapy在分页爬取时,每次请求都重复写入表头。有两种稳妥的解决方式:
方式一:调整Feed导出设置
在settings.py里添加以下配置,确保只写入一次表头:
FEED_EXPORT_APPEND = False # 禁止追加模式,确保从头开始写入,默认就是False,但如果之前有缓存可能需要确认
方式二:自定义CSV导出器(更可靠)
如果上面的设置没生效,你可以自定义一个导出器强制只写一次表头。在项目根目录创建exporters.py文件:
from scrapy.exporters import CsvItemExporter from scrapy.utils.python import to_bytes class SingleHeaderCsvExporter(CsvItemExporter): def __init__(self, file, include_headers_line=True, join_multivalued=',', **kwargs): super().__init__(file, include_headers_line=include_headers_line, join_multivalued=join_multivalued, **kwargs) self.headers_written = False def start_exporting(self): if self.include_headers_line and not self.headers_written: self._write_headers_and_set_fields_to_export() self.headers_written = True self.file.write(to_bytes(self._line_ending))
然后在settings.py里指定使用这个自定义导出器:
FEED_EXPORTERS = { 'csv': '你的项目名称.exporters.SingleHeaderCsvExporter', }
3. 额外优化:整理列表类型数据
看你的代码里,Address和City是用extract()获取的列表,导出时会显示成['xxx']这种不太友好的格式,建议把它们转成字符串:
"Address": ', '.join(response.xpath('//*[@itemprop="address"]//*[@itemprop="streetaddress"]//text()').extract()).strip(), "City": ', '.join(response.xpath('//*[@itemprop="address"]//*[@itemprop="addressLocality"]//text()').extract()).strip(),
这样导出的地址和城市会是整洁的字符串,不会带列表符号。
最后用命令导出结果:
scrapy crawl main_spider -o doctors.csv
这样就能得到格式干净、没有重复表头和多余空行的爬取结果了。
内容的提问来源于stack exchange,提问作者Luis Ramon Ramirez Rodriguez
相关产品推荐
相关产品推荐

