一.前言
本次记录一个爬虫爬虫实现,包括整体架构,爬虫实现逻辑,多平台数据联动。
二.环境
1.操作系统
本次在MAC上进行代码开发,使用Git将代码部署到MAC和Linux(ubuntu)服务器上。
2.开发语言
本次使用Python3作为主要语言,用于爬虫的撰写以及数据队列的处理,接口访问。
3.涉及工具
- Python3 本次主要开发语言
- Redis 用于存储爬虫解析队列以及任务下载队列
- Django 用于相关接口撰写以及后端服务提供
- 前端语言(html、js、css)用于前端界面的绘制
- MySQL数据库 用于存储资源的一些基本信息
- ffmpeg 用于下载资源、音轨处理
- wcscmd工具 用于上传资源
三.需求&实现
1.需求
输入指定的视频资源,解析出视频真实地址以及相关视频播放地址,入库基本信息、下载、上传视频到cdn服务器,完成后标记此视频资源以及相关视频资源。
2.实现
本次使用三台Linux服务器、一台MAC Book完成整个流程
为了表述方便,在此标记:
服务器1:Linux服务器,向解析队列添加任务
服务器2:Linux服务器,从下载队列拿取任务,进行下载、上传、标记
服务器3:Linux服务器,部署了Redis,提供接口服务
解析机器:MAC Book笔记本
队列1:解析队列
队列2:下载队列
接口1:取解析任务接口
接口2:回传下载任务接口
3.整体架构
四.技术细节
1.任务添加
解析任务的添加是通过用户在以Django作为后台的前端页面添加的,用户添加了相关资源的地址,就会通过Redis直接放入解析队列中,解析队列的数据结构为:list。
2.爬虫
通过前期的调研,发现目标网站存在多钟反爬措施(鉴权、验证码、开发者工具监控、JS监控),使用传统的requests无法得到想要的数据。
本次爬虫使用了undetected_chromedriver,此第三方库功能类似于selenium,但是却胜于selenium, 可以防止浏览器特征被识别,可以 解决被某些网站反爬导致的selenium 无法访问或 滑块验证失败等问题。
爬虫是部署在MAC Book上的,通过接口1拿到解析任务。本次爬虫使用undetected_chromedriver开启日志性能监听、记录访问中的日志(包括并不限于请求地址、参数、响应体…),通过设置显、隐式等待、调用相关JS命令、日志过滤提取出指定的资源地址,最后将地址通过接口2回传到下载队列,下载队列数据结构为:list,方法为lpush。至此解析机器就完成了它的使命。
3.下载、入库
服务器2从下载队列中拿到下载任务,为了保证一致性使用rpop拿取下载任务,先对视频的基本信息进行入库,然后使用ffmpeg工具对资源进行下载,下载资源到本地服务器指定位置,借助wcscmd工具上传到CDN服务器,删除本地资源,通过对MySQL数据进行标记,标记资源的可用性,至此就完成了整个的实现流程。
五.总结
本次撰写本篇记录了一次爬虫的实现,整个流程都是笔者亲自操刀的,在此只是提供一个解决问题的思路。在部署时,要根据具体的业务需求,选择合适的服务器,尽量不要浪费服务器资源,减少与其他业务的耦合,能够我们后期维护、查错的工作量。