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

如何在Django中点击触发运行多个Selenium爬虫脚本?

最佳实践指引

1. 你的思路完全符合开发规范

直接把Selenium脚本全粘贴到views.py的做法完全不可取,会导致视图逻辑和爬虫逻辑高度耦合,后续修改爬虫规则、排查问题都会非常麻烦。你想把Selenium脚本封装为独立类再在视图中调用的思路是正确的,符合单一职责的开发原则。

2. 推荐的项目结构调整方案

你可以在对应的Django App目录下新建专门的爬虫模块存放Selenium代码,避免和其他业务逻辑混放,参考结构如下:

你的Django项目/
├── 对应APP目录/
│   ├── __init__.py
│   ├── views.py
│   ├── scrapers/ # 专门存放爬虫逻辑的模块
│   │   ├── __init__.py
│   │   ├── base_scraper.py # 抽离Selenium公共逻辑:驱动初始化、反爬配置、资源释放等
│   │   ├── site_a_scraper.py # 封装网站A的爬取逻辑,对应WebPageA类
│   │   └── site_b_scraper.py # 封装网站B的爬取逻辑,对应WebPageB类

公共逻辑抽离后,两个网站的爬虫类只需要继承基类,写各自的页面操作、数据提取逻辑即可,不需要重复写驱动配置、异常捕获这类通用代码。

3. 视图调用的注意事项

  • 基础调用方式和你写的示例一致,参考代码:
# views.py
from .scrapers.site_a_scraper import WebPageA
from .scrapers.site_b_scraper import WebPageB

def run_scrape(request):
    if request.method == "POST":
        # 执行爬取逻辑
        scraper_a = WebPageA()
        result_a = scraper_a.run() # 你封装的爬取入口方法,返回爬取结果
        scraper_b = WebPageB()
        result_b = scraper_b.run()
        # 后续可自行处理结果:存入数据库、返回给前端展示都可以
    # 返回对应响应给前端
  • 要注意Selenium启动运行是阻塞操作,如果两个爬虫总运行时间超过30秒,普通同步视图很容易出现请求超时的问题。如果爬取耗时较长,建议搭配异步任务队列(比如Celery)处理:点击按钮后先给前端返回「正在爬取」的提示,后台异步执行爬虫任务,执行完成后再更新结果通知用户。
  • 务必在爬虫类里做好异常捕获,以及driver.quit()的资源释放逻辑,避免爬取失败后残留浏览器进程占用服务器内存。

4. 额外优化建议

可以把Selenium相关的配置(比如驱动路径、无头模式开关、页面等待时长、代理配置)写到Django的settings.py里统一管理,不要硬编码在爬虫类中,后续调整配置不需要修改爬虫业务代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:18:04