You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Scrapy提取网页价格信息并存储为字典对应值

Scrapy代码修正方案

你的代码存在4个核心问题导致无法提取到目标字段,修正后即可实现和requests+BeautifulSoup版本完全一致的效果:

  • 字段定义不匹配:你定义的StatisticsItem仅包含statistics_div和url字段,实际需要存储的card、price字段没有定义,后续ItemLoader添加的values字段不存在,无法正常输出内容。
  • 选择器逻辑错误:你仅用get()获取了第一个价格元素,没有批量获取所有商品的标题、价格并配对遍历,和原BS版本的循环逻辑不一致。
  • 依赖冗余:不需要用numpy、pandas处理URL列表,直接用原生列表即可简化代码。
  • ItemLoader使用不规范:实例化时没有绑定当前响应与Item实例,字段处理逻辑异常。

另外建议添加USER_AGENT配置,避免被eBay反爬拦截返回空内容。

修正后完整代码

import scrapy
from scrapy.loader import ItemLoader
from scrapy.item import Field
from itemloaders.processors import TakeFirst
from scrapy.crawler import CrawlerProcess

# 直接用原生列表存储URL,不需要额外转换
start_urls = [
    'https://www.ebay.co.uk/b/Collectable-Card-Games-Accessories/2536/bn_2316999?LH_PrefLoc=2&mag=1&rt=nc&_pgn=1&_sop=16',
    'https://www.ebay.co.uk/b/Collectable-Card-Games-Accessories/2536/bn_2316999?LH_PrefLoc=2&mag=1&rt=nc&_pgn=2&_sop=16',
    'https://www.ebay.co.uk/b/Collectable-Card-Games-Accessories/2536/bn_2316999?LH_PrefLoc=2&mag=1&rt=nc&_pgn=3&_sop=16',
    'https://www.ebay.co.uk/b/Collectable-Card-Games-Accessories/2536/bn_2316999?LH_PrefLoc=2&mag=1&rt=nc&_pgn=4&_sop=16',
    'https://www.ebay.co.uk/b/Collectable-Card-Games-Accessories/2536/bn_2316999?LH_PrefLoc=2&mag=1&rt=nc&_pgn=5&_sop=16'
]

# 按实际存储需求定义Item字段
class StatisticsItem(scrapy.Item):
    card = Field(output_processor=TakeFirst())
    price = Field(output_processor=TakeFirst())
    url = Field(output_processor=TakeFirst())


class StatisticsSpider(scrapy.Spider):
    name = 'statistics'
    start_urls = start_urls

    def parse(self, response):
        # 批量获取所有商品节点,一一对应提取标题和价格,避免错位
        items = response.xpath("//div[contains(@class, 's-item__wrapper')]")
        for item in items:
            loader = ItemLoader(StatisticsItem(), selector=item, response=response)
            # 和原BS版本选择器逻辑保持一致
            loader.add_css('card', '.s-item__title::text')
            loader.add_css('price', '.ITALIC::text')
            loader.add_value('url', response.url)
            yield loader.load_item()


process = CrawlerProcess(
    settings={
        'FEED_URI': 'ebay_data.json',
        'FEED_FORMAT': 'jsonlines',
        # 添加UA避免反爬拦截
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
        # 可选:关闭日志输出避免干扰,需要调试可以注释掉
        'LOG_LEVEL': 'ERROR'
    }
)
process.crawl(StatisticsSpider)
process.start()

运行代码后生成的ebay_data.json就是和原实现逻辑一致的结构化数据,每个条目对应一个商品的名称、价格、来源页面URL。

内容的提问来源于stack exchange,提问作者me.limes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:06:01