Python BeautifulSoup无法获取FlashScore完整HTML,缺失ATP排名数据表
解决FlashScore ATP排名爬取不完整的问题
你的问题核心在于网页的排名数据是JavaScript动态渲染生成的,requests只能获取服务器返回的初始静态HTML,而那些排名数据表是页面加载完成后通过JS异步加载的,所以直接用requests拿不到完整内容。
下面给你两种可行的解决办法:
方法一:用Selenium模拟浏览器加载
Selenium可以模拟真实浏览器的行为,等待页面JS执行完毕后再获取完整HTML,步骤如下:
- 先安装Selenium和对应浏览器的驱动(比如ChromeDriver,需和你的Chrome版本匹配)
- 编写代码:
from bs4 import BeautifulSoup as bs 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 # 设置Chrome无头模式(不弹出浏览器窗口) options = webdriver.ChromeOptions() options.add_argument('--headless=new') options.add_argument('--disable-gpu') driver = webdriver.Chrome(options=options) driver.get("https://www.flashscore.co/tenis/rankings/atp/") # 等待排名表加载完成(选择器可根据页面实际调整) try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "rankings__table")) ) finally: # 获取完整页面HTML page_source = driver.page_source driver.quit() # 用BeautifulSoup解析完整内容 soup = bs(page_source, 'html.parser') # 提取排名表格示例 rank_table = soup.find('table', class_='rankings__table') print(rank_table)
方法二:抓包找API接口
打开浏览器开发者工具(F12)切换到Network标签,刷新页面后筛选XHR/Fetch请求,里面大概率有直接返回排名数据的API接口。拿到接口地址后,用requests带上正确请求头(比如User-Agent、Referer)直接请求,这种方法更高效,返回的一般是JSON格式,解析起来比HTML更方便。
内容的提问来源于stack exchange,提问作者Oscar Piñeros
相关产品推荐
相关产品推荐

