使用Python requests库访问网页遇418错误,请求解决方法
问题分析与解决办法
原因分析
- 请求未携带浏览器特征的HTTP头信息,服务器通过
User-Agent等字段识别出这是脚本发起的请求,而非正常浏览器访问 - 未处理网站的反爬机制,比如会话Cookie验证、请求频率限制等,直接发起请求被拦截
- 原代码中请求地址缺少
https://协议头,这也是请求不合法的潜在因素
解决办法
- 添加模拟浏览器的请求头:服务器通常通过
User-Agent判断请求来源,添加符合主流浏览器格式的User-Agent,同时补充Accept、Referer等字段提升请求合法性 - 使用Session保持会话:先访问CNN主站获取必要的Cookie,再通过同一个Session请求API,模拟正常用户的访问流程
- 控制请求频率:避免短时间内连续发起大量请求,可添加适当延迟降低被拦截概率
修改后的示例代码
import requests import time # 模拟Chrome浏览器的请求头 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/webp,*/*;q=0.8', 'Referer': 'https://www.cnn.com/' } # 初始化会话,保持Cookie session = requests.Session() # 先访问首页建立会话 session.get('https://www.cnn.com/', headers=headers) time.sleep(1) # 添加短延迟模拟用户行为 # 请求目标CNN DataViz API api_url = 'https://你的CNN DataViz API完整地址' # 替换为实际API地址 response = session.get(api_url, headers=headers) print(f"状态码: {response.status_code}") print(response.text)
内容的提问来源于stack exchange,提问作者Birkan
相关产品推荐
相关产品推荐

