You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在爬取网页前触发页面更新?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调用它获取最新数据:

  1. 打开浏览器的开发者工具(F12),切换到Network标签
  2. 手动点击页面上的"update"按钮,观察出现的XHR/fetch请求
  3. 找到那个负责刷新数据的接口(通常会包含类似update或refresh的关键词),记录它的请求URL、请求方法(GET/POST)和必要参数
  4. 用requests直接调用这个接口,解析返回的JSON数据即可

这种方法不需要模拟浏览器,速度更快,也更节省资源,但需要你自己抓包分析接口细节。


为什么之前的方法无效?

  • #update是HTML锚点,只会让页面滚动到对应位置,不会触发任何后端或前端的更新逻辑
  • time.sleep()只是让你的程序暂停,但requests已经拿到了初始的静态HTML,不会因为等待而自动更新页面内容——只有浏览器执行JS后,才会发起新请求获取最新数据

内容的提问来源于stack exchange,提问作者Diadormus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:32:41