使用requests访问纽约时报首页成功但文章页返回403的原因及解决方法
问题原因分析
- 反爬策略差异化:纽约时报首页和内页的反爬验证强度不同,内页可能额外校验了请求头完整性、会话状态,或是对非浏览器请求的识别更严格。
- 会话Cookie缺失:访问首页时服务器会生成会话Cookie,但单独请求内页时未携带这些Cookie,被判定为异常访问。
- 请求头不完整:仅设置User-Agent远远不够,真实浏览器会携带Accept、Accept-Language等一系列请求头,缺少这些字段很容易被识别为爬虫。
解决办法
- 补全完整请求头:照搬真实Firefox浏览器的请求头,示例代码:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0', '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', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } - 维持会话状态:用
requests.Session()保持会话,先访问首页获取Cookie再请求内页,示例:import requests session = requests.Session() # 先访问首页建立会话 session.get('https://www.nytimes.com', headers=headers) # 再请求目标内页 res = session.get('https://www.nytimes.com/2022/11/19/sports/soccer/world-cup-qatar-2022.html', headers=headers) print(res.status_code) - 控制请求频率:每次请求前添加随机延迟,比如
time.sleep(random.uniform(1, 3)),避免短时间内请求过多触发拦截。 - 模拟浏览器渲染(可选):如果内页依赖JS加载内容,普通requests无法获取完整数据,可尝试用selenium或playwright模拟真实浏览器操作,但这种方式更容易被检测,需谨慎使用。
内容的提问来源于stack exchange,提问作者jar
相关产品推荐
相关产品推荐

