Scrapy导出CSV仅获单条数据?求全量获取方案及代码排查
问题诊断与解决方案
嘿,我来帮你排查这个问题!你遇到的CSV仅导出1条数据的情况,主要有两个核心问题需要修复:
1. 请求URL参数解析错误(直接导致结果数量不足)
你的start_urls里的链接使用了HTML实体&,而非直接用&分隔URL参数。这会让服务器错误解析你的请求,返回的页面根本没有30条代理数据(实际可能仅返回1条),爬虫自然只能提取到1条信息。
你需要把URL里的&全部替换成&,修正后的start_urls如下:
start_urls = [ "https://www.yellowpages.com/search?search_terms=agent&geo_location_terms=Los%20Angeles%2C%20CA&page=1", ]
2. 字段提取方式不够健壮(可能导致数据丢失)
你之前用zip()合并多个字段列表的方式存在隐患:如果某个字段(比如电话)在部分商家处缺失,对应的提取列表长度就会短于其他字段,zip()会以最短的列表为准截断数据,导致后续商家信息丢失。
更可靠的做法是先遍历每个商家的容器节点,再在每个节点内单独提取字段。这样即使某个商家缺少某个字段,也不会影响其他商家的数据提取。
修正后的完整爬虫代码:
import scrapy class YellowPages(scrapy.Spider): name = 'yp' start_urls = [ "https://www.yellowpages.com/search?search_terms=agent&geo_location_terms=Los%20Angeles%2C%20CA&page=1", ] def parse(self, response): # 遍历页面中每个商家的容器节点(YellowPages的结果节点通常是class为"result"的div) for agent_item in response.xpath("//div[@class='result']"): info = { 'page': response.url, # 使用get(default='')处理字段缺失的情况,避免返回None 'Agent_name': agent_item.xpath(".//a[@class='business-name']/span/text()").get(default=''), 'Phone_number': agent_item.xpath(".//div[@class='phones phone primary']/text()").get(default=''), 'address': agent_item.xpath(".//div[@class='street-address']/text()").get(default=''), 'locality': agent_item.xpath(".//div[@class='locality']/text()").get(default=''), } yield info
关于Scrapy导出全量CSV的确认
你的settings.py里的FEED配置是正确的:
FEED_FORMAT = "csv" FEED_URI = "yp.csv"
只要爬虫能正确提取到30条数据,Scrapy就会自动把所有条目写入CSV文件。如果需要追加数据而非覆盖旧文件,可以添加FEED_EXPORT_APPEND = True。
按照上述修改重新运行爬虫,就能得到完整的30条代理数据啦!
内容的提问来源于stack exchange,提问作者Deepu
相关产品推荐
相关产品推荐

