如何提取Shopify店铺指标的Revenue值?为何Scrapy Selector仅获Traffic?
问题分析与解决方案
问题根源
你当前的代码里,Traffic和Revenue的XPath完全一模一样,而且都只抓取了shop-tile__data shop-tile__data--has-graph容器下的第一个<span>元素——而网页里Traffic对应的span恰好是第一个,所以Revenue的取值自然和Traffic重复,根本没定位到正确的元素。
看这段关键代码就能明白:
traffic_xpath = "normalize-space(//div[@class="+first_class_name+"]//div[@class="+second_class_name+"]["+str(i)+"]//div[@class="+fifth_class_name+"]/span)" test_traffic = Selector(text=data).xpath(traffic_xpath).extract()[0] revenue_xpath = "normalize-space(//div[@class="+first_class_name+"]//div[@class="+second_class_name+"]["+str(i)+"]//div[@class="+fifth_class_name+"]/span)" test_revenue = Selector(text=data).xpath(revenue_xpath).extract()[0]
两个XPath完全一致,相当于两次抓取同一个元素,结果必然相同。另外你定义的fifth_class_name和revenue_class_name是同一个值,也说明没区分开两个指标的定位逻辑。
针对性解决方案
根据网页的实际结构,你可以选择以下两种方式精准定位Revenue:
方案1:通过文本标识区分(推荐)
如果网页里Traffic和Revenue有明确的标签文本(比如<strong>Traffic</strong>和<strong>Revenue</strong>),可以通过文本筛选对应的span:
# 定位Traffic:找到文本为"Traffic"的strong标签的同级span traffic_xpath = f"normalize-space(//div[@class={first_class_name}]//div[@class={second_class_name}][{i}]//strong[text()='Traffic']/following-sibling::span)" test_traffic = Selector(text=data).xpath(traffic_xpath).extract_first(default='N/A') # 定位Revenue:找到文本为"Revenue"的strong标签的同级span revenue_xpath = f"normalize-space(//div[@class={first_class_name}]//div[@class={second_class_name}][{i}]//strong[text()='Revenue']/following-sibling::span)" test_revenue = Selector(text=data).xpath(revenue_xpath).extract_first(default='N/A')
方案2:通过元素索引区分
如果Traffic和Revenue在同一个容器里是第1、第2个span,可以用索引定位:
# Traffic取第1个span traffic_xpath = f"normalize-space(//div[@class={first_class_name}]//div[@class={second_class_name}][{i}]//div[@class={fifth_class_name}]/span[1])" test_traffic = Selector(text=data).xpath(traffic_xpath).extract_first(default='N/A') # Revenue取第2个span revenue_xpath = f"normalize-space(//div[@class={first_class_name}]//div[@class={second_class_name}][{i}]//div[@class={fifth_class_name}]/span[2])" test_revenue = Selector(text=data).xpath(revenue_xpath).extract_first(default='N/A')
额外优化建议
- 用f-string拼接XPath,比手动拼接字符串更清晰不易出错;
- 用
extract_first(default='N/A')替代extract()[0],避免元素不存在时抛出IndexError,让代码更健壮。
内容的提问来源于stack exchange,提问作者sgerbhctim
相关产品推荐
相关产品推荐

