不同URL返回相同响应:如何获取与浏览器一致的请求结果?
问题原因与解决方案
出现相同响应的原因
- 前端动态渲染机制:亚马逊黑五页面的商品列表是通过前端JavaScript动态加载的,你通过
requests请求的只是页面的基础HTML框架,实际的分页数据(不同viewIndex对应的内容)是浏览器加载页面后,再通过AJAX请求从后端接口获取的。因此不管viewIndex是0还是60,初始GET请求返回的基础HTML都是一致的。 - 请求头不完整:浏览器发送请求时会携带多个关键请求头(如
User-Agent、Accept系列头、Referer等),你的requests代码仅提供了Cookie,缺失这些头会导致亚马逊服务器无法识别为合法浏览器请求,返回统一的基础页面内容。 - Cookie有效性问题:你使用的Cookie可能已过期,或缺少部分会话标识信息,导致服务器无法根据
viewIndex参数返回对应分页的内容。
解决办法
1. 补充完整请求头,模拟浏览器请求
将浏览器中实际发送的请求头(可通过F12开发者工具的Network标签查看)添加到requests的headers中,示例代码如下:
import requests url = "https://www.amazon.it/blackfriday" querystring = { "ref_": "nav_cs_gb_td_bf_dt_cr", "deals-widget": "{\"version\":1,\"viewIndex\":60,\"presetId\":\"deals-collection-all-deals\",\"sorting\":\"BY_SCORE\"}" } # 从浏览器复制完整的请求头替换此处内容 headers = { "cookie": "session-id=260-4643637-2647537; session-id-time=2082787201l; i18n-prefs=EUR; ubid-acbit=258-7747562-7485655; session-token=%22aZB70z2dnXHbhJ9e02ESp7q6xO23IGnDFT2iBCiPXZFoBTTEguAJ%2FBSnV7ud6bjAca64nh3bMF1bwDykOBf9BV%2BVjbx4tUQCyBkrg8tyR8PLZ8cjzpCz%2FzQSAmjiL6mSBcspkF8xuV0bxqLeRX7JQCMrHVBFf%2BsUhxV%2FMBLCH8UPk2o5aNL7OyAFCODBdRqm72RK5DAoKeMUymlVEOtqzvZSJbP%2Fut0gobiXJblRM2c%3D%22", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Language": "it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7", "Accept-Encoding": "gzip, deflate, br", "Referer": "https://www.amazon.it/", "Upgrade-Insecure-Requests": "1" } response = requests.get(url, headers=headers, params=querystring) # 检查响应内容是否包含对应分页的商品数据 print(response.text)
2. 直接抓取动态加载的API接口
通过浏览器开发者工具(F12 → Network → XHR/Fetch),找到页面加载分页数据时调用的后端API接口,直接请求该接口获取对应viewIndex的商品数据(通常为JSON格式)。步骤如下:
- 打开目标页面,切换到开发者工具的Network标签
- 切换分页(或刷新页面),找到带有
deals-widget或分页参数的XHR请求 - 复制该请求的URL、请求头和参数,用
requests直接请求
3. 使用浏览器自动化工具(Selenium/Playwright)
如果亚马逊反爬机制严格,直接模拟请求头或API接口无法获取数据,可使用Selenium或Playwright完全模拟浏览器行为,执行JavaScript并加载动态内容。示例(Playwright):
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动浏览器,headless=False可看到浏览器窗口 browser = p.chromium.launch(headless=False) page = browser.new_page() # 访问目标URL target_url = "https://www.amazon.it/blackfriday?ref_=nav_cs_gb_td_bf_dt_cr&deals-widget=%257B%2522version%2522%253A1%252C%2522viewIndex%2522%253A60%252C%2522presetId%2522%253A%2522deals-collection-all-deals%2522%252C%2522sorting%2522%253A%2522BY_SCORE%2522%257D" page.goto(target_url, wait_until="networkidle") # 获取页面完整内容(包含动态加载的商品) page_content = page.content() print(page_content) browser.close()
注意事项
- 亚马逊反爬机制严格,频繁请求可能导致IP或账号被封禁,建议添加请求间隔、使用代理IP,避免过度请求。
- Cookie具有时效性,需定期从浏览器中更新Cookie内容。
内容的提问来源于stack exchange,提问作者Elias Lonfernini
相关产品推荐
相关产品推荐

