You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python嵌套for循环困惑:亚马逊多页爬取重复结果排查

解决亚马逊商品爬取中重复获取第一页数据的问题

我来帮你排查问题——你遇到的重复返回第一页结果的问题,核心出在URL的构建错误上,还有分页参数的使用不对,咱们一步步理清楚:

问题根源分析

  1. HTML实体符号错误:你用了&,这是HTML里对&的转义字符,但实际HTTP请求的URL里需要直接用&来分隔参数,用&会被亚马逊服务器识别为参数名的一部分,导致分页参数完全无效。
  2. 分页参数名称错误:亚马逊搜索结果的分页参数是page(单数),不是pages(复数),用错参数名的话,服务器只会默认返回第一页数据。
  3. URL拼接逻辑的小瑕疵:虽然你的格式化写法没报错,但把分页参数提前拼到URL里的方式容易混淆,更清晰的做法是每次循环直接在基础搜索URL后拼接正确的分页参数。

修正后的代码

from requests_html import HTMLSession

def get_url(search_text):
    session = HTMLSession()
    # 基础搜索URL模板,仅包含搜索关键词占位符
    template = 'https://www.amazon.com/s?k={}'
    search_term = search_text.replace(' ', '+')
    # 生成不带分页的基础URL
    base_url = template.format(search_term)
    products = []
    
    for x in range(1, 21):
        # 每次循环拼接正确的分页参数:page=x
        url_inc = f"{base_url}&page={x}"
        r = session.get(url_inc)
        # 渲染页面(注意:频繁请求易触发反爬,建议适当延长sleep或添加代理)
        r.html.render(sleep=1)
        # 注意:亚马逊的标题class可能随页面更新变动,建议定期验证xpath有效性
        for item in r.html.xpath('//*[@class="a-size-medium a-color-base a-text-normal"]'):
            product = item.text
            products.append(product)
    return products

额外注意事项

  • 反爬机制规避:亚马逊有严格的反爬策略,连续20次请求很容易被封IP,建议添加随机sleep时间(比如sleep(random.uniform(1,3))),或者使用代理IP池分散请求来源。
  • 元素定位稳定性:xpath里的class名称可能会随着亚马逊页面更新而变化,你可以用更稳定的定位方式,比如先找商品卡片容器//div[contains(@class, 's-result-item')],再在容器内部定位标题元素。

内容的提问来源于stack exchange,提问作者doghoney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:33:12