如何爬取pregame.com游戏中心的大学橄榄球对阵完整表格数据
爬取失败原因
- 目标网站的大学橄榄球对阵数据属于客户端动态渲染内容,静态HTML源码中没有加载完成的表格数据,浏览器会在页面加载完成后单独请求接口获取数据再渲染到页面上,因此直接用requests拉取静态页再解析无法拿到目标内容
- 原代码存在两处语法错误:请求头字典格式错误,key和值需要拆分书写;requests.get不需要传入第二个参数'r'
解决方案
方案1:调用后端数据接口(优先选择,效率更高)
打开浏览器F12开发者工具,切换到「网络」面板,刷新页面后筛选XHR/Fetch类型的请求,可直接找到返回对阵数据的后端接口,该接口返回结构化的JSON数据,直接请求接口即可拿到完整数据,无需解析HTML元素。
方案2:模拟浏览器渲染(无需找接口,易上手)
使用Playwright模拟真实浏览器访问页面,等待页面所有资源加载完成后再拿源码解析,可直接拿到渲染完成的所有元素,实现代码如下:
# 先安装依赖:pip install playwright 再执行 playwright install chromium 安装浏览器内核 from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup with sync_playwright() as p: # 启动无头模式浏览器 browser = p.chromium.launch(headless=True) # 设置请求头 page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36") # 访问目标页面,等待网络空闲后再继续 page.goto("https://pregame.com/game-center/?d=1636174800000&t=0&l=2&a=0&s=AwayRot&m=false&b=undefined&o=Current&c=All&k=", wait_until="networkidle") # 获取渲染完成的页面源码 full_page = page.content() browser.close() # 解析渲染后的页面内容 soup = BeautifulSoup(full_page, 'lxml') div = soup.find_all('p', class_ = 'pggc-col-data pggc-away') print(div)
注意事项
- 控制请求频率,避免触发网站反爬策略,可根据需求添加适当的等待时间
- 如需爬取多批次不同筛选条件的数据,优先选择方案1抓接口,响应速度和稳定性远高于模拟浏览器方案
内容的提问来源于stack exchange,提问作者RookiePython
相关产品推荐
相关产品推荐

