You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:15:13