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

Python爬虫XPATH获取失败及Playwright同步API报错求助

问题1:Requests+LXML爬取返回空列表的原因及解决
  • 核心原因:op.gg的召唤师数据是动态加载的,requests.get()仅能获取页面的静态HTML源码,而你要抓取的cs数据是页面加载完成后通过JavaScript异步请求渲染生成的,静态源码里不存在对应节点,因此XPath查询返回空列表。
  • 验证方法:将r.content.decode("utf-8")保存为HTML文件,打开后搜索class="cs",会发现该节点不存在,和Chrome控制台中渲染后的DOM结构完全不同。
问题2:Playwright同步API报错的解决

报错是因为你在**异步环境(如Jupyter Notebook)**中使用了Playwright的同步API,两者的事件循环产生冲突。下面提供两种可行的解决方法:

方案1:使用Playwright异步API(推荐)

以下是完整可运行的代码,用于爬取目标页面的CS数据:

import asyncio
from playwright.async_api import async_playwright

async def get_cs_data():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)  # 设为headless=True可后台运行
        page = await browser.new_page()
        await page.goto("https://www.op.gg/summoners/kr/Hide%20on%20bush", timeout=10000)
        # 等待目标元素加载完成
        await page.wait_for_selector('div.stats div.cs')
        # 获取元素文本内容
        cs_text = await page.locator('div.stats div.cs').inner_text()
        print(f"CS数据:{cs_text}")
        await browser.close()

# 在Jupyter Notebook中直接执行
await get_cs_data()

方案2:同步API+nest_asyncio(兼容异步环境)

如果更习惯使用同步API,可以先安装nest_asyncio,再修改代码:

import nest_asyncio
from playwright.sync_api import sync_playwright

# 允许嵌套事件循环,解决异步环境冲突
nest_asyncio.apply()

with sync_playwright() as p, p.chromium.launch() as browser:
    page = browser.new_page()
    page.goto("https://www.op.gg/summoners/kr/Hide%20on%20bush", timeout=10000)
    page.wait_for_selector('div.stats div.cs')
    cs_text = page.locator('div.stats div.cs').inner_text()
    print(f"CS数据:{cs_text}")
额外高效方案:直接调用API

如果不想用浏览器渲染,可以通过抓包找到op.gg的接口,直接请求API获取数据,速度更快。示例代码如下(接口可能随网站更新变化,需自行抓包确认最新参数):

import requests

summoner_name = "Hide on bush"
server = "kr"
# 召唤师信息接口(需抓包验证最新格式)
url = f"https://op.gg/api/v1.0/internal/bypass/summoners/{server}/{summoner_name}"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)
data = response.json()
# 从返回的JSON中提取所需数据
print(data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:45:44