Python requests.get请求网站返回浏览器过时错误该如何解决?
问题原因
- 首先
requests默认发送的请求头User-Agent会明确标识自身为爬虫客户端,被网站反爬策略识别后就会返回浏览器版本过时的提示 - 切换年份页面URL不变,说明表格数据是前端异步加载后动态渲染的,原始静态HTML中不存在完整表格内容,因此
pandas.read_html无法直接解析到目标数据
可行解决方案
方案1:修改请求头伪装浏览器(优先尝试)
先给请求添加正常浏览器的User-Agent,绕过基础反爬验证,确认是否能直接拿到数据:
import pandas as pd import requests farmers_url = 'https://www.pgatour.com/tournaments/farmers-insurance-open/past-results.html' # 可自行替换为你当前使用浏览器的真实User-Agent,搜索"我的UA"即可获取 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" } response = requests.get(farmers_url, headers=headers) farmers = pd.read_html(response.text, header=0)[0] print(farmers.head())
如果该方案还是拿不到表格,说明数据确实是动态渲染的,可使用下面两个方案。
方案2:抓取异步数据接口(效率最高)
打开浏览器开发者工具(按F12),切换到「网络」面板,筛选「XHR/提取」类别,然后手动切换页面上的年份选项,观察网络请求列表里新增的请求,找到返回格式为JSON、内容包含表格数据的接口,直接请求该接口即可。这类接口通常会带年份参数,修改参数就能批量获取不同年份的赛事数据,不需要解析HTML页面,效率远高于其他方案。
方案3:用无头浏览器渲染动态页面(兼容性最好)
如果找不到接口,就用Selenium、Playwright这类工具模拟浏览器运行,等待页面JS执行完毕、表格完全渲染后,再提取页面源码交给pandas解析,Selenium版本示例代码如下:
import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.options import Options import time chrome_options = Options() # 无头模式,不弹出浏览器窗口 chrome_options.add_argument("--headless=new") chrome_options.add_argument("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") driver = webdriver.Chrome(options=chrome_options) farmers_url = 'https://www.pgatour.com/tournaments/farmers-insurance-open/past-results.html' driver.get(farmers_url) # 等待页面加载完成,可根据实际网络情况调整等待时长 time.sleep(3) # 如果需要切换年份,可模拟点击年份选择按钮后再等待加载完成 page_source = driver.page_source farmers = pd.read_html(page_source, header=0)[0] print(farmers.head()) driver.quit()
内容的提问来源于stack exchange,提问作者Ryan Miller
相关产品推荐
相关产品推荐

