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

Scrapy提取HTML无引号文本失败,实为JS动态生成内容问题

解决Scrapy抓取JavaScript动态生成内容的问题

你之前误以为是数字48没被引号包裹导致抓不到,其实根本原因是这个数字是JavaScript动态渲染生成的——原始网页源代码里没有,只有浏览器执行JS后才会出现,而Scrapy默认只会抓取服务器返回的原始HTML,所以自然拿不到它。至于能抓到"times",是因为这段文本是静态写在HTML里的,和引号完全没关系。

下面给你几种可行的解决方法:

方法一:用Playwright模拟浏览器渲染(推荐)

Playwright可以让Scrapy模拟真实浏览器执行JS,渲染出完整的页面后再解析。步骤如下:

  1. 先安装依赖:
pip install scrapy-playwright playwright
playwright install chromium  # 安装Chromium浏览器
  1. 在Scrapy项目的settings.py里配置中间件:
DOWNLOAD_HANDLERS = {
    "http": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
    "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
}

PLAYWRIGHT_LAUNCH_OPTIONS = {
    "headless": True,  # 无头模式,不显示浏览器窗口
}

DOWNLOADER_MIDDLEWARES = {
    "scrapy_playwright.middleware.PlaywrightMiddleware": 543,
}
  1. 在你的Spider里,给需要渲染的请求添加meta={"playwright": True},之后就能正常解析动态内容了:
def start_requests(self):
    yield scrapy.Request(
        url="目标网页URL",
        meta={"playwright": True},
        callback=self.parse
    )

def parse(self, response):
    # 现在可以直接抓取动态生成的数字48了
    count = response.css('span.base-entity-display-count::text').get()
    print(count)  # 输出48

方法二:直接爬取数据接口(更高效)

如果这个数字是通过AJAX从后端接口拉取的,直接爬接口会比渲染页面快很多:

  • 打开Chrome的「开发者工具」→「Network」面板,刷新页面
  • 筛选「XHR」或「Fetch」类型的请求,查看每个请求的响应内容,找到返回包含48的JSON数据的接口
  • 用Scrapy直接请求这个接口,解析JSON就能拿到数字,比如:
def parse(self, response):
    data = response.json()
    count = data["某个字段名"]  # 替换成实际的字段名

方法三:使用Scrapy-Splash(旧方案)

Splash是一个专门用于渲染JS的服务,不过需要额外部署服务,步骤相对繁琐:

  1. 安装Splash服务(比如用Docker):
docker run -p 8050:8050 scrapinghub/splash
  1. 安装scrapy-splash依赖:
pip install scrapy-splash
  1. 在settings.py里配置Splash,然后在请求里添加meta={"splash": {"args": {"wait": 0.5}}}来渲染页面。

总之,优先尝试方法二(找接口),如果找不到再用方法一(Playwright),这两种是目前最常用的解决方案。

内容的提问来源于stack exchange,提问作者WebOrCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:54:29