Scrapy导出CSV时所有数据合并为单行的问题排查求助
问题原因与解决方法
你的问题根源在于一次性把整页的所有商品数据(列表形式)塞进了一个Item里,然后只yield一次,所以导出时所有数据会被合并到一行。正确的做法是遍历每个商品条目,为每个商品单独生成一个Item。
修正后的代码
import scrapy from ..items import AmazondawinItem class AmazonspiderSpider(scrapy.Spider): name = 'amazon' pagenumber = 3 allowed_domains = ['amazon.com'] start_urls = [ 'https://www.amazon.com/s?k=laptop&i=computers&crid=27GFGJVF4KNRP&sprefix=%2Ccomputers%2C725&ref=nb_sb_ss_recent_1_0_recent' ] def parse(self, response): # 定位每个商品的容器节点(亚马逊搜索页的商品容器选择器) product_containers = response.css('.s-result-item[data-component-type="s-search-result"]') for container in product_containers: item = AmazondawinItem() # 提取单个商品的名称 item['name'] = container.css('.a-size-medium::text').extract_first(default='') # 提取单个商品的原价 item['old_price'] = container.css('.a-spacing-top-micro .a-text-price span::text').extract_first(default='') # 提取单个商品的现价 item['price'] = container.css('.a-spacing-top-micro .a-price-whole::text').extract_first(default='') # 提取单个商品的评论数 item['review'] = container.css('.s-link-style .s-underline-text::text').extract_first(default='') # 提取单个商品的图片链接 item['imagelink'] = container.css('.s-image::attr(src)').extract_first(default='') yield item
关键改动说明
- 遍历商品容器:先找到页面中每个商品的独立容器节点,循环处理每个商品,确保每个Item对应一个商品。
- 使用
extract_first()替代extract():extract()返回匹配到的所有结果列表,而extract_first()只返回第一个匹配结果(或者指定的默认值),这样每个字段都是单个字符串,符合CSV单行单条数据的要求。 - 移除无用的try-except:
extract()和extract_first()不会抛出异常,找不到匹配结果时extract()返回空列表,extract_first()返回None(或指定的default值),所以原来的try-except块完全没必要。
现在导出CSV时,每个商品的数据会单独占一行,不会再出现所有数据合并到同一行的问题。
内容的提问来源于stack exchange,提问作者Mathematics physics Biology
相关产品推荐
相关产品推荐

