Python爬取亚马逊商品页面无法提取Merchant ID问题求助
问题根因
你提取Merchant ID失败的核心原因如下:
- 亚马逊反爬机制触发后会返回验证码/跳转页面,你当前没有做返回页有效性校验,直接解析非目标页面自然找不到对应字段
- 现有XPath规则只覆盖了旧版页面结构,亚马逊新版商品/报价页的隐藏input ID已经更新,原有规则匹配不到
- 正则匹配逻辑只取了第一个script标签的内容,merchantId可能存在于任意script标签中,同时原有正则只覆盖了一种赋值格式,漏了键值对、带空格等多种写法
修复方案
1. 新增页面有效性校验
先校验返回状态码是否为200,再检查页面是否包含「Add to Cart」「Other Sellers on Amazon」这类特征字符串,确认返回的是正常商品页而非拦截页后再做解析。
2. 扩展XPath匹配规则
新增新版页面的input ID匹配项,覆盖merchantID、soldByMerchantId两种常见的新版ID。
3. 优化正则匹配逻辑
遍历所有script标签的内容,同时扩展正则规则,覆盖多种merchantId书写格式,同时通过长度规则过滤无效匹配。
4. 确认offer节点定位准确
如果是爬取多卖家报价列表,需确保你提取的offer节点对应单个卖家的独立报价区块,不要错误定位到全局页面根节点。
修正后的参考代码
import re import logging log = logging.getLogger(__name__) # Get Seller merchant ID merchant_id = "" # 先校验当前offer节点是否有效,可根据实际页面结构调整校验逻辑 if offer: # 扩展XPath匹配规则,覆盖新老版本所有可能的input ID try: merchant_input = offer.xpath( ".//input[@id='ftSelectMerchant' or @id='ddmSelectMerchant' or @id='merchantID' or @id='soldByMerchantId']" )[0] # 部分解析库获取属性要用get(),避免.value调用失败 merchant_id = merchant_input.get("value", "").strip() except IndexError: # 遍历所有script标签匹配,不再只取第一个 all_scripts = offer.xpath(".//script/text()") for script_content in all_scripts: script_content = script_content.strip() if not script_content: continue # 扩展正则,匹配赋值、键值对、带空格等多种格式,同时限制ID长度符合亚马逊规则 match = re.search(r"merchantId\s*[:=]\s*[\"'](\w{13,20})[\"']", script_content, re.IGNORECASE) if match: merchant_id = match.group(1) break log.info(f"merchant_id: {merchant_id}") if not merchant_id: log.debug("No Merchant ID found")
额外建议
如果触发了亚马逊反爬,可通过增加请求间隔、更换代理IP、添加完整的请求头(尤其是User-Agent、Accept-Language、Cookie)解决,避免返回拦截页。
内容的提问来源于stack exchange,提问作者rf_dante
相关产品推荐
相关产品推荐

