首页 > 解决方案 > 使用 Scrapy 抓取数据时数据重复

问题描述

Python

我正在使用scrapy从一个网站上抓取数据,我想在那里抓取图形卡的标题、价格以及它们是否有库存。问题是我的代码循环了两次,而不是有10 个产品,我得到了20 个

import scrapy
    
class ThespiderSpider(scrapy.Spider):
    name = 'Thespider'
    start_urls = ['https://www.czone.com.pk/graphic-cards-pakistan-ppt.154.aspx?page=2']
    
    def parse(self, response):
        data = {}
        cards = response.css('div.row')
        for card in cards:
            for c in card.css('div.product'):
                data['Title'] =  c.css('h4 a::text').getall()
                data['Price'] =  c.css('div.price span::text').getall()
                data['Stock'] = c.css('div.product-stock span.product-data::text').getall()
                yield data

标签: web-scrapingscrapyduplicates

解决方案


当不需要时,您正在执行嵌套的 for 循环。

每张卡片都可以被 CSS 选择器捕获response.css('div.product')

代码示例

def parse(self, response):
    data = {}
    cards = response.css('div.product')
    for card in cards:
        data['Title'] =  card.css('h4 a::text').getall()
        data['Price'] =  card.css('div.price span::text').getall()
        data['Stock'] = card.css('div.product-stock span.product-data::text').getall()
        yield data

附加信息

  • 使用get()而不是getall(). 你得到的输出是一个列表,你可能想要一个字符串,它就是get()给你的。
  • 如果您正在考虑多个页面,则项目字典可能比生成字典更好。总是会有你需要改变的东西,一个项目字典给你更多的灵活性来做到这一点。

推荐阅读