使用Playwright获取Goodreads页面时无法得到完整HTML的问题求助
解决Goodreads页面未完全加载导致HTML混乱的问题
出现这个问题的核心原因是页面还没完成JavaScript渲染就获取了内容,以下是几个可行的解决办法:
1. 等待关键元素加载完成
在获取页面内容前,等待页面上的核心元素(比如书籍标题、详情区域)加载完成,确保页面渲染完毕:
await page.wait_for_selector('h1.Text__title1', timeout=120000)
2. 优化页面跳转的等待策略
修改page.goto的wait_until参数,等待网络请求基本结束后再获取内容,避免过早抓取未渲染的HTML:
await page.goto(url, timeout=120000, wait_until='networkidle')
3. 模拟真实浏览器环境
Goodreads有反爬机制,模拟真实浏览器的UA和行为可以减少被拦截或渲染异常的概率:
page = await browser.new_page(user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36')
修改后的完整代码
import asyncio from playwright.async_api import async_playwright from selectolax.parser import HTMLParser async def get_book_html(id: int) -> HTMLParser: async with async_playwright() as p: # 可以先关闭无头模式观察页面加载情况 browser = await p.chromium.launch(headless=False) # 模拟真实浏览器UA page = await browser.new_page(user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36') url = f'https://www.goodreads.com/book/show/{id}' # 等待网络空闲后再继续 await page.goto(url, timeout=120000, wait_until='networkidle') # 等待关键元素加载完成 await page.wait_for_selector('h1.Text__title1', timeout=120000) html_content = await page.content() html = HTMLParser(html_content) with open('testing/book.html', 'w', encoding='utf-8') as f: f.write(html_content) await browser.close() return html async def run() -> None: html = await get_book_html(5) print(html.css_first('title').text()) asyncio.run(run())
另外,如果你关闭了无头模式(headless=False),可以观察页面是否有验证码或反爬弹窗,这类情况也会导致页面渲染异常,需要额外处理。
内容的提问来源于stack exchange,提问作者thelara
相关产品推荐
相关产品推荐

