为何requests-html仅返回部分内容?启用JS渲染仍异常
解决requests-html渲染JS仍只获取部分内容的问题
下面是几个可能导致你遇到这个问题的原因和对应的修复方案:
1. 更换更现代的User-Agent
你当前使用的Chrome 36版本User-Agent过于老旧,不少网站会对这类过时浏览器返回受限内容,甚至阻止部分资源加载。换成一个最新的Chrome浏览器UA试试:
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'
2. 延长渲染等待时间并强制等待异步内容加载
render()方法默认的等待逻辑可能跟不上页面异步加载的节奏,你可以通过wait参数让浏览器主动等待指定时长,或者用sleep参数在页面初始加载完成后再额外休眠一段时间:
# 等待5秒确保异步内容加载完毕 r.html.render(timeout=13, wait=5) # 或者初始加载后再额外休眠3秒 r.html.render(timeout=13, sleep=3)
3. 模拟页面滚动触发内容加载
这类小说阅读网站常采用滚动加载的方式加载后续内容,requests-html默认不会触发页面滚动,你可以注入JS代码模拟滚动操作:
# 渲染时注入滚动脚本,多次滚动触发全部内容加载 r.html.render( timeout=13, script=""" window.scrollTo(0, document.body.scrollHeight); // 分两次滚动,确保延迟加载的内容都被触发 setTimeout(() => window.scrollTo(0, document.body.scrollHeight), 1000); setTimeout(() => window.scrollTo(0, document.body.scrollHeight), 2000); """ )
4. 修改浏览器参数规避无头模式检测
部分网站会识别无头浏览器并限制内容返回,你可以修改浏览器启动参数,禁用自动化标识:
session = HTMLSession() # 添加浏览器启动参数 session.browser.args.extend([ '--no-sandbox', '--disable-blink-features=AutomationControlled', ])
综合优化后的完整代码
把上述优化点结合起来,代码可以改成这样:
from requests_html import HTMLSession session = HTMLSession() # 配置浏览器参数规避反爬 session.browser.args.extend([ '--no-sandbox', '--disable-blink-features=AutomationControlled', ]) # 使用现代浏览器UA user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36' headers = {'User-Agent': user_agent} r = session.get("https://readli.net/chitat-online/?b=439184&pg=1", headers=headers) # 渲染时注入滚动脚本并等待足够时间 r.html.render( timeout=15, wait=3, script=""" window.scrollTo(0, document.body.scrollHeight); setTimeout(() => window.scrollTo(0, document.body.scrollHeight), 1000); setTimeout(() => window.scrollTo(0, document.body.scrollHeight), 2000); """ ) text = r.html.text print(text)
内容的提问来源于stack exchange,提问作者GayLord
相关产品推荐
相关产品推荐

