如何在Python中无浏览器渲染含动态JS插件的HTML并爬取内容
问题原因
你使用requests_html的写法存在错误:HTML.render() 方法本身无返回值,所以你拿到的page结果必然是None。渲染完成后的完整HTML需要从html.html属性获取,另外本地静态HTML直接传给HTML实例的场景下,第三方SDK的异步加载很容易出现跨域、资源路径异常的问题,requests_html对这类场景的兼容性很差。
如果要坚持用requests_html,可先修改写法如下,但大概率会因为跨域限制导致FB SDK无法正常初始化:
from requests_html import HTML doc = """你的完整HTML代码""" html = HTML(html=doc) html.render(sleep=30, keep_page=True) # 渲染后的内容从html.html属性获取 loaded_html = html.html
最优实现方案
推荐用Playwright无头浏览器实现,兼容性好、渲染稳定,可以完全符合你期望的「传入HTML代码、返回渲染完成的完整HTML」的调用形式。
步骤1:安装依赖
pip install playwright playwright install chromium
步骤2:封装渲染方法
from playwright.sync_api import sync_playwright def render_html(html_code: str, wait_timeout: int = 20) -> str: with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page() # 加载传入的HTML内容 page.set_content(html_code, wait_until="networkidle") # 等待FB评论插件的iframe加载完成,也可根据需求换成固定时长等待 page.wait_for_selector(".fb-comments iframe", timeout=wait_timeout*1000) # 取渲染后的完整HTML full_rendered_html = page.content() browser.close() return full_rendered_html # 调用示例 if __name__ == "__main__": html_code = """ <html> <body> <div id="fb-root"></div> <script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v11.0" nonce="4HbUqy4w"></script> <div class="fb-comments" data-href="https://developers.facebook.com/docs/plugins/comments#configurator" data-width="1" data-numposts="1"></div> </body> </html> """ loaded_html_code = render_html(html_code) # 后续可从loaded_html_code里提取需要的文本内容
内容的提问来源于stack exchange,提问作者E_K
相关产品推荐
相关产品推荐

