Scrapy抓取亚马逊站点时原有Xpath失效的问题排查与修复求助
亚马逊搜索页XPath匹配失效问题排查与修复
现有写法存在的问题
- 采用
[@class="完整类名"]的精确匹配方式:亚马逊会动态调整节点类名的顺序、新增/删除临时类,只要类名属性和你写的内容有任何不一致就会匹配失效,比如评论数节点的类名可能会变成s-underline-text a-size-base a-color-base,顺序变化后精确匹配直接不生效。 - 直接取当前节点下的
text():部分目标文本可能被嵌套在子标签内,并不是你定位的span节点的直接子文本节点,会出现取空的情况。 - 未做上下文节点校验:如果调用带
.开头的相对路径XPath时,上下文节点不是商品卡片父节点,也会出现匹配遗漏。 - 未确认返回页面一致性:亚马逊反爬策略会给异常请求返回简化版页面、验证码页,节点结构和正常浏览器访问的页面完全不同,匹配前需要先确认Scrapy拿到的源码结构正确。
修复后的匹配规则
建议先定位到稳定的商品父级卡片节点,再从每个卡片内提取对应字段,避免字段错位:
# 先定位所有商品卡片节点,data-component-type属性基本不会变动,匹配稳定性高 goods_list = response.xpath('//div[contains(@data-component-type, "s-search-result")]') for item in goods_list: # 商品标题:用contains匹配核心类名,不限制类名顺序,取不到就返回空字符串 title = item.xpath('.//span[contains(@class, "a-text-normal")]/text()').get('').strip() # 评论数:匹配两个核心类名即可,无评论的商品默认返回0 reviews = item.xpath('.//span[contains(@class, "a-size-base") and contains(@class, "s-underline-text")]/text()').get('0').strip() # 商品跳转链接:取href属性后补全域名 link = item.xpath('.//a[contains(@class, "a-link-normal") and contains(@class, "s-underline-text")]/@href').get('') if link and not link.startswith('https'): link = 'https://www.amazon.com' + link
额外调试优化建议
- 如果用
/text()还是取不到,可以用string()方法提取节点下所有子孙文本,写法为item.xpath('string(.//span[contains(@class, "a-text-normal")])').get('').strip() - 每次调试前先在Scrapy Shell中执行
view(response),确认返回的页面和浏览器正常访问的页面结构一致,如果是验证码页或者简化页,需要先调整请求头、代理、Cookie参数再测试。
内容的提问来源于stack exchange,提问作者Santoo
相关产品推荐
相关产品推荐

