实时Django项目中Selenium性能过慢及内存占用过高问题求助
优化动态页面爬取性能的实用方案
1. 优先抓取目标站点的API接口(最有效)
直接绕过前端渲染,找到加载帖子的核心接口:
- 打开目标站点的开发者工具(F12),切换到网络标签,刷新页面后筛选
XHR或Fetch请求 - 定位到返回帖子列表的接口,分析请求参数(关键词、城市、分页等),直接用
requests或aiohttp发送请求获取JSON数据 - 这种方式比浏览器渲染快10-100倍,完全不会有内存占用问题
2. 替换Selenium为更轻量的无头浏览器工具
如果必须依赖浏览器渲染,换用资源消耗更低的工具:
- Playwright:默认无头模式,资源占用远低于Selenium,支持自动等待元素加载,代码示例:
from playwright.sync_api import sync_playwright def get_cards(url): with sync_playwright() as p: browser = p.chromium.launch(headless=True, args=["--disable-images", "--disable-css"]) page = browser.new_page() page.goto(url, timeout=10000) # 提取前3条数据后立即关闭浏览器 cards = page.locator(".post-card").first(3).all() data = [{"title": card.locator(".title").text_content(), "link": card.get_attribute("href")} for card in cards] browser.close() return data - Pyppeteer:基于Chrome DevTools协议,比Selenium更轻量,同样支持无头模式
3. 对现有Selenium做极致优化(保留Selenium的前提下)
如果不想更换工具,通过以下设置大幅降低资源消耗:
- 启用新版无头模式:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless=new") # 新版无头模式资源占用显著降低 - 禁用非必要资源加载:
options.add_argument("--disable-images") options.add_argument("--disable-css") options.add_argument("--disable-extensions") options.add_argument("--disable-plugins") # 若帖子加载无需JS,可添加:options.add_argument("--disable-javascript") - 限制加载超时,爬完即终止:
driver.set_page_load_timeout(10) # 设置10秒超时 # 提取完前3条数据后立即调用driver.quit(),无需等待页面完全加载 - 复用浏览器实例:不要每次爬取都新建浏览器,可全局复用实例,爬取多个URL后再关闭
4. 增加本地缓存机制
针对相同的关键词+城市筛选条件,缓存爬取结果:
- 用字典、JSON文件或SQLite存储已爬取的查询结果,下次遇到相同请求直接返回缓存,避免重复爬取
5. 异步并行爬取多站点
如果需要爬多个目标站点,用异步方式提升效率:
- 配合API接口用
aiohttp做异步请求,或用Playwright的异步API同时处理多个页面
内容的提问来源于stack exchange,提问作者Novartis Nk
相关产品推荐
相关产品推荐

