如何配置网页爬虫避免重定向循环?Python requests爬Metacritic遇此问题
Metacritic爬虫重定向问题解决方案
用requests库抓取Metacritic是可行的,不一定非要用Selenium这类工具,但你需要模拟真实浏览器的请求特征,而不只是随便加个Cookie。以下是具体的解决思路:
一、补全完整的请求头
Metacritic会校验请求头的完整性,只带User-Agent远远不够,你需要模拟主流浏览器的全部核心请求头:
- 必须包含真实的
User-Agent:比如Chrome最新版本的UA字符串Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 - 补充
Accept、Accept-Language、Accept-Encoding、Referer这些字段,模拟浏览器的内容接收偏好
示例代码:
import requests import time import random headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.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': 'en-US,en;q=0.5', 'Accept-Encoding': 'gzip, deflate, br', 'Referer': 'https://www.metacritic.com/', 'DNT': '1', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } url = "https://www.metacritic.com/browse/games/score/metascore/all/pc/filtered" session = requests.Session() # 先请求主页获取初始Cookie session.get("https://www.metacritic.com/", headers=headers) # 加随机延迟模拟人类访问 time.sleep(random.uniform(1, 3)) response = session.get(url, headers=headers) print(response.status_code) print(response.text[:500])
二、正确处理Cookie
Cookie是关键,但不需要纠结具体哪几个字段,用会话保持即可:
- 用
requests.Session()创建会话对象,它会自动保存和复用请求过程中获取的Cookie - 如果会话自动获取的Cookie不够,可手动复制浏览器访问目标页面时的Cookie(在浏览器开发者工具的Network面板中查看),加到请求头的
Cookie字段里
三、避免被判定为机器人
- 每次请求后加1-3秒的随机延迟,避免固定间隔
- 不要一次性抓取大量数据,分批次请求
- 避免短时间内重复请求同一页面
什么时候需要用Selenium/Playwright?
如果上面的方法还是触发重定向循环,说明Metacritic启用了更严格的反爬机制,比如Cloudflare的人机验证(hCaptcha)或者需要执行JavaScript才能渲染页面。这时候用Selenium、Playwright这类工具更合适,它们会模拟真实浏览器的全部行为,包括JS执行、页面渲染,能绕过大部分基于浏览器特征的反爬。
内容的提问来源于stack exchange,提问作者Brendan McCauley
相关产品推荐
相关产品推荐

