Python嵌套for循环困惑:亚马逊多页爬取重复结果排查
解决亚马逊商品爬取中重复获取第一页数据的问题
我来帮你排查问题——你遇到的重复返回第一页结果的问题,核心出在URL的构建错误上,还有分页参数的使用不对,咱们一步步理清楚:
问题根源分析
- HTML实体符号错误:你用了
&,这是HTML里对&的转义字符,但实际HTTP请求的URL里需要直接用&来分隔参数,用&会被亚马逊服务器识别为参数名的一部分,导致分页参数完全无效。 - 分页参数名称错误:亚马逊搜索结果的分页参数是
page(单数),不是pages(复数),用错参数名的话,服务器只会默认返回第一页数据。 - 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
相关产品推荐
相关产品推荐

