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

使用Scrapy Playwright时是否需要手动关闭页面标签?

Scrapy Playwright 单请求完成后是否需要手动关闭标签页

核心结论

长时间多站点循环爬取场景下,强烈建议手动关闭对应标签页,避免内存泄漏导致爬虫异常

具体说明

  • 首先说默认机制:Scrapy-Playwright 不会在单个请求的响应返回、解析逻辑启动时自动销毁关联的 Page 实例(即浏览器标签页)。如果你爬取的站点总量大,未关闭的标签页会持续占用Chromium进程内存,积累到一定阈值后会出现渲染卡顿、页面加载超时,甚至直接触发浏览器OOM崩溃、爬虫假死。你目前把CONCURRENT_REQUESTS = 3的配置下,短时间爬取少量页面可能感知不到异常,但长时间轮询多站点时内存占用会持续攀升,隐患很明显。
  • 你贴的手动关页逻辑是可行的,但要注意两个细节:
    1. 写了await page.close()的parse方法必须定义为协程,也就是要用async def parse(self, response)的写法,普通同步方法里用await会直接抛语法错误。
    2. 关页操作必须放在所有数据提取、页面交互逻辑完成之后执行,不要刚拿到response对象就立刻关页,否则可能出现还没拿到完整渲染内容、标签页就被销毁的问题,导致提取数据为空。
  • 不需要手动关页的场景只有两类:一是你配置了全局Page复用,所有请求共用同一个标签页跳转,只需要在整个爬虫结束时统一回收资源即可;二是你配置了Playwright请求级上下文自动销毁,单请求结束后上下文连带Page自动清理。但你现在是跨多站点循环爬取的场景,每个站点对应独立标签页的模式下,手动关页是最稳妥、资源占用最可控的方案。

参考实现代码

async def parse(self, response):
    # 先完成所有数据提取、页面交互操作
    item = {
        "url": response.url,
        "page_title": response.css("title::text").get(),
        "page_content": response.xpath("//body//text()").getall()
    }
    yield item

    # 所有逻辑处理完再关闭标签页,可加简单异常捕获避免关页报错中断爬虫
    page = response.meta["playwright_page"]
    try:
        await page.close()
    except Exception:
        pass

内容的提问来源于stack exchange,提问作者Shahidul Islam Pranto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:51:17