如何在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
相关产品推荐
相关产品推荐

