Scrapy中ItemLoader未处理parse_firstpage_item的conversion_date问题求助
问题分析与解决方案
你的核心问题是conversion_date字段未被ItemLoader的处理器处理,原样输出,结合代码来看,问题出在以下几点:
1. XPath语法错误(粘贴转义导致)
你代码中的XPath使用了HTML实体",这会导致Scrapy无法正确解析XPath表达式,无法获取到正确的conversion_date值。另外,XPath中固定写了li[2],只能获取第二个商品的日期,无法批量获取所有商品数据。
2. Product URL取值错误
item["product_url"][-1]会取URL的最后一个字符,导致请求的商品页面URL完全错误,虽然你说能获取数据,但这明显是逻辑bug。
3. 调试缺失
没有打印中间结果,无法确认ItemLoader是否正确处理了conversion_date。
修正后的代码示例
Spider代码修正
class AllSaledataSpider(CrawlSpider): name = 'all_salesdata_copy' allowed_domains = ['www.buyma.com'] # 从CSV读取商家URL列表 def start_requests(self): with open('/Users/morni/BUYMA/buyma_researchtool/AllshoppersURL.csv', 'r', encoding='utf-8-sig') as f: reader = csv.reader(f) for row in reader: for n in range(1, 3): # 可修改为300 # 拼接销售记录页面URL url = f"{row[2][:-5]}/sales_{n}.html" yield scrapy.Request( url=url, callback=self.parse_firstpage_item, dont_filter=True ) # 解析销售记录页面,获取商品URL和成交日期,传递到商品详情页解析 def parse_firstpage_item(self, response): # 修正XPath:去掉li[2]批量获取所有商品的日期,替换&为双引号 conversion_date_list = response.xpath('//*[@id="buyeritemtable"]/div/ul/li/p[3]/text()').getall() product_url_list = response.xpath('//*[@id="buyeritemtable"]/div/ul/li/p[1]/a/@href').getall() # 遍历所有商品(确保两个列表长度一致) for conversion_date, product_url in zip(conversion_date_list, product_url_list): loader = ItemLoader(item=BuymaResearchtoolItem(), response=response) loader.add_value("conversion_date", conversion_date) loader.add_value("product_url", product_url) item = loader.load_item() # 调试打印:确认日期是否被处理 print(f"处理后的成交日期: {item['conversion_date']}") yield scrapy.Request( url=response.urljoin(item["product_url"]), # 修正URL取值方式 callback=self.parse_productpage_item, cb_kwargs={'item': item}, ) # 解析商品详情页,合并已有数据 def parse_productpage_item(self, response, item): loader = ItemLoader(item=item, response=response) loader.add_xpath("product_name", 'normalize-space(//li[@class="page_ttl"]/span[1]/text())') loader.add_xpath("brand_name", 'normalize-space(//*[@id="s_brand"]/dd/a/text())') # 其他字段继续添加... yield loader.load_item()
关键修正点说明
- 替换XPath中的
"为双引号,确保表达式正确解析 - 去掉XPath中的
li[2],使用zip遍历所有商品的日期和URL,避免固定循环次数的局限性 - 修正
product_url的取值方式,直接使用item["product_url"](因为TakeFirst处理器已经将其转为单个字符串) - 添加调试打印,确认
conversion_date是否被正确处理
验证方法
- 运行爬虫后,查看控制台打印的
处理后的成交日期,如果是datetime对象(如2024-05-20 00:00:00)或去掉前缀的日期字符串,说明处理器已生效 - 检查最终输出的item数据,确认
conversion_date字段格式符合预期
内容的提问来源于stack exchange,提问作者K_MM
相关产品推荐
相关产品推荐

