使用requests-html获取kahoot.it页面元素失败求助
解决Kahoot机器人requests-html无法获取动态加载元素的问题
我来帮你排查这个问题!首先看你的代码和描述,发现一个小细节:你说要找的是#game-pin元素,但代码里写的是#game-input,这大概率是个笔误,先确认这个选择器是否正确——毕竟如果选择器错了,再怎么渲染也找不到元素。
接下来,即使调用了render(),页面可能还没完全加载完成,requests-html的默认渲染时间可能不够。咱们可以通过几个方式优化:
1. 修正选择器并增加渲染等待时间
修改render()的sleep参数,给页面更多时间加载JavaScript内容,同时纠正选择器:
import requests_html session = requests_html.HTMLSession() # 设置更贴近真实浏览器的User-Agent,避免被反爬检测 session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' r = session.get('https://kahoot.it/') # 增加sleep时间,确保页面完全加载 r.html.render(sleep=3) # 修正选择器为#game-pin(根据你的描述) elem = r.html.find('#game-pin', first=True) print(elem)
2. 等待特定元素加载后再获取
如果还是不行,可以用render()的wait参数,指定等待某个元素出现后再停止渲染:
r.html.render(wait='document.querySelector("#game-pin") !== null', sleep=2) elem = r.html.find('#game-pin', first=True)
这个方式会让页面一直等待,直到#game-pin元素存在为止,比固定sleep更可靠。
3. 检查页面结构是否变化
如果以上都没用,可能是Kahoot的页面结构更新了。你可以先渲染页面后导出HTML看看实际结构:
with open('kahoot_page.html', 'w', encoding='utf-8') as f: f.write(r.html.html)
打开生成的HTML文件,搜索游戏PIN输入框的实际ID或类名,再调整选择器。
另外,注意requests-html基于Pyppeteer,第一次运行会下载Chromium,确保网络正常,后续运行会快很多。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

