在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
相关产品推荐
相关产品推荐

