如何使用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
相关产品推荐
相关产品推荐

