如何绕过AMD网站检测,用Python requests下载GPU驱动?
问题描述
我尝试使用Python requests访问AMD显卡驱动的下载链接,但网站检测到我未使用浏览器,将我重定向至论坛页面。我已尝试在请求头中嵌入网站Cookie但无效,以下是我的代码:
from requests import get from bs4 import BeautifulSoup header = { "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36"} url = 'https://www.amd.com/fr/support/graphics/amd-radeon-6000-series/amd-radeon-6900-series/amd-radeon-rx-6900-xt' req = get(url, headers=header) latestlink = BeautifulSoup(req.text, 'html.parser').find("a", {"class":"btn-transparent-black"})['href'] for key in req.headers: header[key]= req.headers[key] dlpage = get(latestlink, headers=header).url print(dlpage) #Actually the forum page
请问如何“欺骗”该系统以正常访问下载链接?
解决方案
AMD的反爬机制不止检查User-Agent和Cookie,还会验证请求完整性与会话状态,可尝试以下几种方法:
- 使用会话保持连接:用
requests.Session()代替直接调用get,它会自动维护Cookie和会话状态,模拟浏览器的持续连接逻辑:
from requests import Session from bs4 import BeautifulSoup session = Session() # 补全浏览器常用请求头字段 session.headers.update({ "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "accept-language": "fr-FR,fr;q=0.5", "accept-encoding": "gzip, deflate, br", "connection": "keep-alive", "upgrade-insecure-requests": "1" }) # 先访问驱动页面建立有效会话 url = 'https://www.amd.com/fr/support/graphics/amd-radeon-6000-series/amd-radeon-6900-series/amd-radeon-rx-6900-xt' req = session.get(url) latestlink = BeautifulSoup(req.text, 'html.parser').find("a", {"class":"btn-transparent-black"})['href'] # 基于已有会话请求下载链接 dl_response = session.get(latestlink, allow_redirects=True) print(dl_response.url)
补全完整请求头:你的初始请求头过于简略,浏览器发送的请求包含
Accept、Accept-Language等多个字段,这些都是网站判断是否为真实浏览器的关键依据,上述代码已补充这类核心字段。模拟完整跳转流程:AMD的下载按钮链接通常是中间跳转页,需要先访问该页面让服务器生成有效下载会话,再获取最终的真实下载地址。
直接模拟浏览器操作:如果上述方法仍无效,可使用
selenium或playwright直接模拟真实浏览器行为,彻底绕过反爬检测,示例代码(playwright):
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto('https://www.amd.com/fr/support/graphics/amd-radeon-6000-series/amd-radeon-6900-series/amd-radeon-rx-6900-xt') # 定位并点击下载按钮 download_btn = page.locator('a.btn-transparent-black') download_btn.click() # 等待页面跳转完成后获取地址 page.wait_for_load_state() print(page.url) browser.close()
注意:不要频繁发起请求,避免被网站封禁IP,遵守网站的robots协议。
内容的提问来源于stack exchange,提问作者user19428688
相关产品推荐
相关产品推荐

