AJAX动态加载页面爬取问题:FIVB女子沙排排名页无法获取表格内容
解决FIVB女子沙滩排球排名页面AJAX动态内容爬取问题
嘿,我之前也碰到过这类动态页面爬取的坑!你用requests直接请求页面拿不到BTechPlayM里的内容,核心原因是这个表格数据是页面加载完成后,通过AJAX异步请求获取并渲染的——requests只能抓取到页面初始的静态HTML,根本没法获取后续动态加载的内容。
给你两个实用的解决方案:
方案一:直接调用AJAX数据接口
打开浏览器开发者工具(按F12),切换到Network标签页,刷新页面后筛选XHR类型的请求,就能找到页面获取排名数据的真实接口。直接请求这个接口,就能拿到原始的结构化数据(一般是JSON或HTML片段),比解析静态页面高效得多。
举个示例(实际接口需要你自己抓包确认):
import requests # 替换为你抓包得到的真实AJAX接口地址 ajax_api_url = "http://www.fivb.org/对应AJAX接口路径" # 带上必要请求头,模拟浏览器行为,避免被拦截 request_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", "Referer": "http://www.fivb.org/EN/BeachVolleyball/PlayersRanking_W.asp" } response = requests.get(ajax_api_url, headers=request_headers) # 如果接口返回JSON格式数据 rank_data = response.json() # 直接处理数据即可 print(rank_data)
方案二:用Selenium模拟浏览器加载
要是找不到AJAX接口,或者接口有复杂的验证逻辑,那就用Selenium模拟真实浏览器的加载过程,等页面完全渲染后再抓取内容:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup target_url = 'http://www.fivb.org/EN/BeachVolleyball/PlayersRanking_W.asp' # 初始化Chrome浏览器驱动(需提前下载与浏览器版本匹配的chromedriver) driver = webdriver.Chrome() driver.get(target_url) # 等待目标div加载完成,最长等待10秒 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.ID, 'BTechPlayM'))) # 获取完全渲染后的页面源码 full_page_html = driver.page_source soup = BeautifulSoup(full_page_html, 'html.parser') # 现在就能拿到BTechPlayM里的完整内容了 target_content = soup.find('div', id='BTechPlayM') print(target_content) # 记得关闭浏览器 driver.quit()
小提示
- 不管用哪种方法,都要设置合理的请求头,避免被网站的反爬机制拦截
- 使用Selenium时,一定要确保驱动程序和浏览器版本匹配,不然会报错
- 爬取前请务必遵守网站的
robots.txt协议和使用条款
内容的提问来源于stack exchange,提问作者Zeth
相关产品推荐
相关产品推荐

