web-scraping - 使用 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
解决方案
当不需要时,您正在执行嵌套的 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()
给你的。 - 如果您正在考虑多个页面,则项目字典可能比生成字典更好。总是会有你需要改变的东西,一个项目字典给你更多的灵活性来做到这一点。
推荐阅读
- prometheus-alertmanager - 进程使用过多 CPU 时,prometheus 中带有警报规则的进程导出器
- javascript - /static/ 的位置在设置 app.route(/something/) 时更改为 /something/static/
) - android - 失败的 sepolicy 检查 - Android 10 构建 - Pixel 3a XL
- node.js - 我需要验证电话号码中的前四位数字,在 Node Js 中应该是“5678”。我该怎么做?我应该使用哪个验证器库
- php - 如何在箭头后应用 laravel 循环索引
- android - Espresso 无法点击显示的视图
- c# - 如何从中间件调用控制器方法并且只允许从该中间件调用该方法?
- c# - WebContentTypeMapper / GetMessageFormatForContentType 中的 HttpContext.Current null
- angular - @Input() 中的相同布尔值不会触发更改检测
- javascript - 如何在 ajax 中获取按钮所在的 DataTable 中的数据列?