使用Scrapy Playwright时是否需要手动关闭页面标签?
Scrapy Playwright 单请求完成后是否需要手动关闭标签页
核心结论
长时间多站点循环爬取场景下,强烈建议手动关闭对应标签页,避免内存泄漏导致爬虫异常
具体说明
- 首先说默认机制:Scrapy-Playwright 不会在单个请求的响应返回、解析逻辑启动时自动销毁关联的 Page 实例(即浏览器标签页)。如果你爬取的站点总量大,未关闭的标签页会持续占用Chromium进程内存,积累到一定阈值后会出现渲染卡顿、页面加载超时,甚至直接触发浏览器OOM崩溃、爬虫假死。你目前把
CONCURRENT_REQUESTS = 3的配置下,短时间爬取少量页面可能感知不到异常,但长时间轮询多站点时内存占用会持续攀升,隐患很明显。 - 你贴的手动关页逻辑是可行的,但要注意两个细节:
- 写了
await page.close()的parse方法必须定义为协程,也就是要用async def parse(self, response)的写法,普通同步方法里用await会直接抛语法错误。 - 关页操作必须放在所有数据提取、页面交互逻辑完成之后执行,不要刚拿到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
相关产品推荐
相关产品推荐

