You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用requests抓取动态网页中的电竞参与者名称?

老哥,你的问题我太熟了——动态页面用静态请求抓不到内容简直是爬虫入门的经典坑。你之前的BeautifulSoup代码没效果,核心原因就是那些.gll-MarketGroup_Wrapper元素是页面加载完成后,通过JavaScript动态渲染出来的,根本不在requests.get拿到的初始HTML源码里。

给你两个最实用的解决方案,按步骤来就能搞定:

解决方案1:直接调用网站的公开API

这是效率最高的方式,因为动态页面的内容几乎都是通过API接口拉取的。操作步骤如下:

  • 打开目标页面,按F12打开开发者工具,切换到Network面板后刷新页面
  • 在面板的筛选器里选择XHRFetch,重点找URL里带esportsmatchparticipant这类关键词的请求,看哪些返回的是JSON格式数据
  • 找到对应请求后,复制它的URL、完整请求头(尤其是User-AgentReferer,部分API会校验这些字段),用requests直接请求这个接口

代码示例:

import requests
import json

# 替换成你找到的API接口URL
api_url = "https://example.com/api/esports/participants"
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": "你的目标页面URL"  # 有些API会校验来源,加上更稳妥
}

response = requests.get(api_url, headers=headers)
data = response.json()

# 从JSON数据里提取参与者名称,具体路径需要根据返回的结构调整
# 举个示例,假设数据嵌套在data['matches'][0]['participants']里
for match in data.get('matches', []):
    for participant in match.get('participants', []):
        print(participant.get('name'))
解决方案2:提取页面script标签里的预加载数据

如果找不到明确的API接口,很多网站会把初始渲染需要的数据塞在页面的<script>标签里(比如window.__INITIAL_STATE__这类全局变量)。操作步骤如下:

  • requests拿到页面的初始HTML
  • 用BeautifulSoup定位到包含动态数据的script标签
  • 提取标签内的内容,去掉JS变量声明部分,转成JSON格式处理

代码示例:

import requests
from bs4 import BeautifulSoup
import json

url = "你的目标页面URL"
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"}

res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text, 'lxml')

# 找包含初始数据的script标签,不同网站的标识不同,比如常见的__NEXT_DATA__
script_tag = soup.find('script', id='__NEXT_DATA__')
if script_tag:
    raw_data = script_tag.string
    # 如果是类似window.__INITIAL_STATE__ = {...}的格式,需要先截取JSON部分
    # 比如:raw_data = raw_data.replace('window.__INITIAL_STATE__ = ', '').rstrip(';')
    data = json.loads(raw_data)
    
    # 从JSON结构里定位参与者名称,路径需要根据实际数据调整
    participants = data.get('props', {}).get('pageProps', {}).get('esportsData', {}).get('participants', [])
    for p in participants:
        print(p.get('name'))

额外提示

  • 不管用哪种方法,都要通过开发者工具的ResponsePreview面板仔细分析返回的数据结构,找到参与者名称的具体嵌套路径
  • 如果遇到403/401错误,把浏览器里该请求的完整请求头(包括CookieAuthorization等)复制过来,不过要注意Cookie可能会过期

内容的提问来源于stack exchange,提问作者robots.txt

火山引擎 最新活动