使用requests爬取Amazon遭拦截,含cURL转Python失效问题求解决方案
爬取Amazon时requests模块失效问题及解决方案
问题描述
我使用requests模块爬取Amazon时始终无法正常工作,尝试过配置cookies、headers以及更换IP,但只有浏览器能成功访问。此外,用cURL请求可以正常返回页面,但转为Python代码后就触发验证码请求,即便携带cookies也无法解决。
可正常运行的cURL示例
curl -L -vvv http://amazon.com -H "User-Agent:Mozilla 5.0"
转译后失效的Python代码
import requests cookies = { 'session-id': '135-4585428-6195300', 'session-id-time': '2082787201l', 'i18n-prefs': 'USD', 'sp-cdn': '"L5Z9:IL"', 'ubid-main': '132-1503580-7678418', 'session-token': 'R5XVE3t8VeX8bRwnjuxXwONDgBnxkngfLfzobFxK5HL+8QaofrVEPjv8Mvta3D6EMlaiFeOyhjjiHkHLjjRwlh9seQ0wsfXE0BU0csh2Wtx6q6r630bsx5VvbBIQcyVAPRkgvL5wgU12P39t5iCZ7b3ykFjRvb9qe7eScZC/F9DJ+NuFMOVP+Z7OQtlZNQzcYrKmWTJH0HJZho8VtJBish0ATwfLhVI+Ihu1ioHYUfSUNDdjQFgG7SyiKZDufkXekZZGaF3x24vY9haBeJVnE9GjmMN+XHySuQtP/stlZmhlp9JOH17+JTZHVsCn/SEONdK5QhETXzoaQ+9YvptxA+v49bgXJn+L', 'csm-hit': 'tb:NBK78382HSSRXD9W22YX+s-SKXXAE4EMPQ2XYNGK1G0|1692968547644&t:1692968547644&adb:adblk_no', } headers = { 'authority': 'www.amazon.com', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-language': 'en-US,en;q=0.9', 'cache-control': 'max-age=0', # 'cookie': 'session-id=135-4585428-6195300; session-id-time=2082787201l; i18n-prefs=USD; sp-cdn="L5Z9:IL"; ubid-main=132-1503580-7678418; session-token=R5XVE3t8VeX8bRwnjuxXwONDgBnxkngfLfzobFxK5HL+8QaofrVEPjv8Mvta3D6EMlaiFeOyhjjiHkHLjjRwlh9seQ0wsfXE0BU0csh2Wtx6q6r630bsx5VvbBIQcyVAPRkgvL5wgU12P39t5iCZ7b3ykFjRvb9qe7eScZC/F9DJ+NuFMOVP+Z7OQtlZNQzcYrKmWTJH0HJZho8VtJBish0ATwfLhVI+Ihu1ioHYUfSUNDdjQFgG7SyiKZDufkXekZZGaF3x24vY9haBeJVnE9GjmMN+XHySuQtP/stlZmhlp9JOH17+JTZHVsCn/SEONdK5QhETXzoaQ+9YvptxA+v49bgXJn+L; csm-hit=tb:NBK78382HSSRXD9W22YX+s-SKXXAE4EMPQ2XYNGK1G0|1692968547644&t:1692968547644&adb:adblk_no', 'device-memory': '8', 'downlink': '10', 'dpr': '1', 'ect': '4g', 'rtt': '100', 'sec-ch-device-memory': '8', 'sec-ch-dpr': '1', 'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-ch-ua-platform-version': '"10.0.0"', 'sec-ch-viewport-width': '1037', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.54', 'viewport-width': '1037', } response = requests.get('https://www.amazon.com/dp/B002G9UDYG', cookies=cookies, headers=headers)
可行解决方案
- 统一Cookie传递方式:不要同时在headers和cookies参数中传递Cookie,二选一即可。推荐使用
cookies字典参数,避免headers中Cookie字符串的转义问题(比如代码中注释的Cookie字段包含"转义符,可能导致服务端解析异常)。 - 模拟浏览器请求流程:不要直接请求商品详情页,先请求Amazon主页初始化会话,获取最新的会话Cookie后再请求目标页面。Amazon的反爬机制会验证会话连贯性,直接请求深层页面极易触发验证码。示例代码:
import requests # 使用Session保持会话 session = requests.Session() # 先请求主页初始化会话 session.get('https://www.amazon.com', headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.54' }) # 再请求目标商品页 response = session.get('https://www.amazon.com/dp/B002G9UDYG') print(response.status_code) - 精简Headers字段:移除
device-memory、downlink、rtt等浏览器特有的性能指标字段,这些字段在requests模拟时很难和真实浏览器完全一致,反而容易被反爬机制识别。 - 保持代理与会话一致性:使用代理时,确保同一个Session会话始终使用同一个IP,不要每次请求更换IP,否则会被判定为异常流量。
- 处理动态渲染内容:如果目标页面依赖JavaScript渲染,requests只能获取静态HTML,此时可以使用
requests-html库进行JS渲染,或者直接用Selenium模拟真实浏览器行为(注意Selenium需配置规避检测,比如使用undetected-chromedriver)。
内容的提问来源于stack exchange,提问作者MarinaF
相关产品推荐
相关产品推荐

