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
相关产品推荐
相关产品推荐

