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

在Python 3中使用代理构建Amazon爬虫的技术问询

关于你的Amazon Corsair DDR4爬虫代码的问题解析与改进

先梳理下你代码里几个关键的问题,以及对应的修复方案:

1. 代理配置错误

你现在直接把代理字符串赋值给proxies,但requests库要求proxies参数是字典格式(比如{"http": "http://代理地址", "https": "https://代理地址"}),直接传字符串会导致请求失败。而且你只在循环外选了一次代理,20次请求都用同一个,很容易被Amazon识别封掉,应该每次请求都随机换一个代理。

2. URL格式问题

你的URL里用了&,这是HTML转义后的字符,实际请求时应该用原始的&;另外末尾的ie=UT...不完整,会导致URL无效,建议直接用完整的搜索页面URL模板。

3. 反爬相关的缺失

Amazon反爬非常严格,你现在没有设置请求头(比如User-Agent),很容易被返回403或验证码页面;而且固定的time.sleep(3)太规律,最好用随机休眠时间,模拟人类浏览行为。

4. 缺乏异常处理

爬虫过程中很容易遇到代理失效、请求超时、页面解析失败等情况,没有异常处理的话程序会直接崩溃,无法继续后续请求。


改进后的代码示例

import requests
from bs4 import BeautifulSoup
import time
import random

# 模拟不同的浏览器请求头,避免被识别为爬虫
USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
]

proxy_list = [
    '66.82.144.29:8080',
    '47.75.0.253:3129',
    '217.119.82.14:8080'
]

# 循环爬取20页(Amazon页码从1开始,不是0)
for page in range(1, 21):  
    # 每次请求随机选代理和请求头
    proxy = random.choice(proxy_list)
    proxies = {
        "http": f"http://{proxy}",
        "https": f"https://{proxy}"
    }
    headers = {
        "User-Agent": random.choice(USER_AGENTS),
        "Accept-Language": "en-US,en;q=0.9"
    }

    # 构造正确的URL,替换转义字符&为原始&,补全完整参数
    url = f"https://www.amazon.com/s/ref=sr_pg_{page}?fst=p90x%3A1%2Cas%3Aoff&rh=n%3A172282%2Cn%3A541966%2Cn%3A193870011%2Cn%3A172500%2Ck%3Acorsair+ddr4%2Cp_89%3ACorsair&page={page}&keywords=corsair+ddr4&ie=UTF8"

    try:
        # 发送请求,设置超时时间避免卡住
        response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
        # 检查请求是否成功,失败则抛出异常
        response.raise_for_status()
        
        # 解析页面
        soup = BeautifulSoup(response.text, "html.parser")
        # 示例:提取商品标题(可根据实际需求调整选择器)
        titles = soup.select("span.a-size-medium.a-color-base.a-text-normal")
        for title in titles:
            print(title.get_text(strip=True))

        # 随机休眠2-5秒,模拟人类浏览节奏
        time.sleep(random.uniform(2, 5))

    except requests.exceptions.RequestException as e:
        print(f"第{page}页请求失败: {str(e)}")
        # 代理失效时跳过,继续下一页
        continue
    except Exception as e:
        print(f"第{page}页解析失败: {str(e)}")
        continue

额外提示

  • 代理有效性:你列表里的代理可能已经失效,建议定期更新代理列表,或者使用付费代理服务,稳定性更高。
  • Amazon反爬:即使做了这些优化,Amazon还是可能触发验证码,此时可以考虑使用无头浏览器(比如Selenium),但需要配合更复杂的反爬绕过策略。
  • 数据提取:BeautifulSoup的选择器需要根据Amazon页面的实际结构调整,因为Amazon的页面结构可能会随时变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:40:07