如何在爬取网页前触发页面更新?lolprofile.net玩家实时排名爬取异常问题求助
如何触发lolprofile.net的更新按钮以获取最新玩家排名数据?
问题描述
我尝试从lolprofile.net爬取玩家的当前排名,但获取的数据始终不是最新的。我试过直接访问带#update后缀的页面,也在代码里加了time.sleep()等待,但结果依然没有变化。我的代码如下:
from bs4 import BeautifulSoup import requests import time url = ['https://lolprofile.net/de/summoner/euw/Sidestep%20Sabrina#update', 'https://lolprofile.net/de/summoner/euw/Diadormus#update', 'https://lolprofile.net/de/summoner/euw/DeluxeFuture#update', 'https://lolprofile.net/de/summoner/euw/Natron#update', 'https://lolprofile.net/de/summoner/euw/51l3nc3#update'] for x in url: html_text = requests.get(x).text time.sleep(5) soup = BeautifulSoup(html_text, 'lxml') player_name = soup.find('h1').text rank = soup.find('span', class_ = 'tier').text LP = soup.find('span', class_ = 'lp').text print(f'{player_name} ist {rank} mit {LP}') input()
请问我应该如何解决这个问题?此前已有类似问题提出但未得到解答。
解决方案
你的核心问题在于:#update是前端锚点,不会触发后端的数据刷新;而且requests库只会获取初始的静态HTML,不会执行页面上的JavaScript——而点击"update"按钮的更新逻辑,正是由前端JS发起的异步请求来完成的。下面给你两种可行的解决思路:
1. 使用Selenium模拟浏览器操作(最直观的方案)
Selenium可以模拟真实浏览器的行为,包括点击按钮、等待页面加载/刷新,完美适配这种依赖JS的交互场景。
步骤如下:
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如Chrome的ChromeDriver,要和你的浏览器版本匹配)
- 修改代码如下:
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 import time url_list = [ 'https://lolprofile.net/de/summoner/euw/Sidestep%20Sabrina', 'https://lolprofile.net/de/summoner/euw/Diadormus', 'https://lolprofile.net/de/summoner/euw/DeluxeFuture', 'https://lolprofile.net/de/summoner/euw/Natron', 'https://lolprofile.net/de/summoner/euw/51l3nc3' ] # 初始化浏览器驱动(这里用Chrome为例,记得把ChromeDriver路径换成你自己的) driver = webdriver.Chrome() wait = WebDriverWait(driver, 10) for url in url_list: driver.get(url) try: # 等待并点击update按钮 update_btn = wait.until(EC.element_to_be_clickable((By.ID, "update"))) update_btn.click() # 等待数据刷新(可以根据页面元素变化来判断,比如等待tier元素更新) wait.until(EC.staleness_of(driver.find_element(By.CLASS_NAME, "tier"))) # 提取数据 player_name = driver.find_element(By.TAG_NAME, "h1").text rank = driver.find_element(By.CLASS_NAME, "tier").text LP = driver.find_element(By.CLASS_NAME, "lp").text print(f'{player_name} ist {rank} mit {LP}') except Exception as e: print(f"处理{url}时出错: {e}") # 给服务器一点缓冲时间,避免请求过于频繁 time.sleep(2) driver.quit() input()
2. 直接调用更新接口(更高效的方案)
如果你不想用浏览器,可以通过抓包找到"update"按钮触发的真实API接口,直接用requests调用它获取最新数据:
- 打开浏览器的开发者工具(F12),切换到Network标签
- 手动点击页面上的"update"按钮,观察出现的XHR/fetch请求
- 找到那个负责刷新数据的接口(通常会包含类似
update或refresh的关键词),记录它的请求URL、请求方法(GET/POST)和必要参数 - 用
requests直接调用这个接口,解析返回的JSON数据即可
这种方法不需要模拟浏览器,速度更快,也更节省资源,但需要你自己抓包分析接口细节。
为什么之前的方法无效?
#update是HTML锚点,只会让页面滚动到对应位置,不会触发任何后端或前端的更新逻辑time.sleep()只是让你的程序暂停,但requests已经拿到了初始的静态HTML,不会因为等待而自动更新页面内容——只有浏览器执行JS后,才会发起新请求获取最新数据
内容的提问来源于stack exchange,提问作者Diadormus
相关产品推荐
相关产品推荐

