# WeberSpider **Repository Path**: redrice/weber-spider ## Basic Information - **Project Name**: WeberSpider - **Description**: 通用爬虫 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-11-04 - **Last Updated**: 2024-11-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 韦伯爬虫
## Weber-Spider 本地运行环境如下: 1. 操作系统支持:![](https://img.shields.io/badge/macOS-support-green.svg)![](https://img.shields.io/badge/window-support-green.svg)![](https://img.shields.io/badge/centos-support-green.svg) 2. 开发环境:![](https://img.shields.io/badge/Python-3.10-green.svg)、![](https://img.shields.io/badge/Npm-8.3.2-green.svg)、![](https://img.shields.io/badge/Node.js-8.3.2-green.svg)、![](https://img.shields.io/badge/Vue_cli-4.5.15-green.svg)、![](https://img.shields.io/badge/Flask-2.0.2-green.svg) 3. 目录结构 ``` ├── README.md // help ├── static // 仓库静态资源 ├── proxy_pool // 第三方项目代理池 ├── flask_vue // 后端和前端目录 │ ├──spider // 爬虫引擎模块 │ │ ├──abstract //抽象类 │ │ ├──filter //一些管道过滤器方法 │ │ ├──font //中文黑体ttf文件 │ │ ├──project //爬虫项目配置信息、输出、自定义接口 │ │ ├──temp //临时日志 │ │ ├──tools //第三方接口:如验证码、密码字典、代理池配置 │ │ ├──utils //第三方组件:如布隆过滤器、JSExec执行 │ │ ├──Engine.py //1.引擎模块 │ │ ├──Scheduler.py //2.调度器模块 │ │ ├──Downloader.py //3.下载器模块 │ │ ├──Parser.py //4.解析器模块 │ │ ├──Pipeline.py //5.输出器模块 │ │ ├──LogUtils.py //日志组件 │ │ ├──Interpreter.py /JSON解释器 │ │ ├──Multi-Config.ini //多项目配置信息 │ │ └──ReadMulitiConfig.py //多项目配置信息读取 │ ├── www //前端VUE项目 │ | ├──public //存放页面图标、index页面 │ │ ├──src //存放具体资源 │ │ │ ├──api //axios同一的request接口 │ │ │ ├──assets //静态资源图片、gif等 │ │ │ ├──components //全局组件 │ │ │ ├──directive /指令祖册 │ │ │ ├──filters //过滤一些参数的静态方法 │ │ │ ├──icons //一些常用的svg图标 │ │ │ ├──layout //导航栏布局 │ │ │ ├──router //vue路由注册 │ │ │ ├──store //状态管理 │ │ │ ├──styles //全局css │ │ │ ├──utils //工具包、依赖包 │ │ │ ├──vendor //excel/打包输出方法 │ │ │ ├──views //视图 │ │ │ ├──App.Vue //VUE页面资源的首加载入口 │ │ │ ├──main.js //项目的入口文件 │ │ │ ├──permission.js//权限设置 │ │ │ └──settings.js //vue的标题、Logo等 │ │ ├──.env.development //开发环境配置前端IP和端口、axios目标IP和端口 │ │ ├──.env.production //生产环境配置前端IP和端口、axios目标IP和端口 │ │ └──vue.config.js //可选的配置文件 │ ├── spiders.xml //爬虫项目状态对象 │ ├── app.py //flask启动 │ ├── XmlUtils.py //XML结构增删改查方法 │ ├── CONST.py //后端常用方法、常量 │ └── ApiModule.py //用户自定义接口模板 ├── requirements.txt //python环境依赖 ``` ## 需求分析 ### 系统需求 ​ 框架系统技术的设计思想需要运用Python的爬虫技术,用户需求为可同时爬取多个规则简单统一的网页和分页页面数据。框架系统需求是完成的五大主要的爬虫功能模块:其一用于开启初始化爬虫引擎的调用顺序以及配置参数的启动引擎,简称启动器(Engine);其二,为获取启动器相关调度策略和配置请求页面,并调度下载器进行工作的调度器(Scheduler);其三,用于专门请求网址并获取页面内容的下载器(Downloader);其四为下载器获取内容后提取解析相应网页数据的解析器(Parser);其五为解析器的数据内容保存并用于输出的管道(Pipeline)。这五大主要功能模块需要实现良好的高内聚低耦合,各施其职。启动爬虫引擎需要有输入相关的配置信息,所以我想将该爬虫引擎部署在后端的Flask框架中,Flask提供多个调用爬虫引擎模块的接口,用户只需在前端Vue上填写清晰简便的爬虫业务逻辑表单,通过前端向后端的异步请求开启爬虫并获取相关状态信息。 ​ 本框架最终目的在于实现一款基于市面上所有网站的简单通用爬虫框架程序,通过对应的简单规则爬取所需要的网络数据,用户只需在全段表单输入必要的爬取规则,爬虫引擎读取相应的配置信息就可以简洁快速爬取网站数据。但鉴于各个网站的数据规则、反爬措施不同,很难实现一款完全通用的爬虫框架。所以本程序框架仅面向数据逻辑简单,分页属性单一,没有复杂的反爬措施(字体反爬、JS解密)的网站。但是此框架具有扩展性,为用户提供了额外的编写接口,方便用户重构采集规则和请求体参数,进而达到面向不同规则的网站,用户只需分析其网站特殊规律,实现接口的抽象方法或者重写引擎实体类的方法,即可扩展系统的新功能。 ### 系统分析 ​ 鉴于爬虫部分的非法特性,系统内部也需要权衡考虑爬虫所带来的侵权危害,本系统默认不采集Robots协议内明确禁止的路径,避免爬虫方触及商业机密。因此系统需要有明确跳转Robots协议文件的入口,供用户浏览相关条例。 1.设计一款爬虫系统,该爬虫系统需要使用后端进行爬虫调度、前端进行爬虫配置。只要有一台能上网的电脑就能使用该服务,客户端零维护。 2.前端的可视化的爬虫配置必须要清晰简单,使用户能够快速上手,不需要太多成本的编码学习,所以前端的功能要简单详细,才能将配置信息完整的输入到后端的爬虫引擎中。 3.启动器作为爬虫开启的模块,并且能够读取多种配置信息、开启多任务爬虫并周期性运行、爬虫模块使用的策略。 4.调度器作为下载器如何进行请求调度的角色,需要有高速分配任务以及可扩展的功能。 5.下载器作为爬虫真正请求服务器并获取相应的模块,请求功能需要有目前流行且实用的技术,如OCR/三方接口用于识别验证码、代理池切换用于伪装IP、Session会话保持用户与服务器连接状态、Get/Post/Session用户请求切换等。 6.解析器[14]作为解析网页DOM信息和接口的部分,需要有基本的提取方法,如XPath(Xml Path Language)结构信息提取、Re结构信息提取、CSS (Cascading Style Sheets)结构信息提取、JSON结构信息提取。 7.管道作为数据持久化模式需要一键部署与选择的功能,如console、图片、视频、文档、数据库。 8.系统性能要求:框架需要有健壮性、可靠性。 ### 系统结构图
图1 系统结构图
​ 通过系统结构图可以了解整个爬虫系统的功能模块。后端Flask主要给前端提供对应的业务接口包括:调用爬虫五大引擎模块、日志组件、文件系统操作等。前端Vue主要用于提供用户简单易懂的爬虫配置、页面之间的路由逻辑、父子组件之间的调用关系等,主要目的都是方便用户通过前端axios的异步请求调用后端复杂的爬虫引擎等功能。 ​ 为了将爬虫系统部署到服务器并运行,需要使用webpack工具打包前端项目生成dist文件,将dist文件和Flask进行映射,就可以通过服务器运行Flask,运行整个爬虫系统。 ## 引擎模块
图2 系统功能分析图
​ 如图2所示是爬虫引擎功能模块分析图。爬虫引擎默认运行顺序:从运行引擎模块开始就会开启启动器并读取配置信息,启动器解释配置信息进行权衡后开启调度器;调度器内部的生成器给下载器提供下载配置信息的对象;下载器下载后会把响应体转交给解析器解析数据;解析出来的数据最后通过管道输出,至此整个爬虫引擎生命周期结束。 倘若在启动器模块内事先配置了定时器,则一次生命周期结束后可以继续通过定时器唤醒启动器,整个爬虫项目将继续从开始到结束运行各个引擎。 #### 启动器
图3 启动器模块
​ 图3所示是爬虫引擎中启动器模块功能图。启动器模块(Engine),其作用是通过解释器读取调度器、下载器、解析器、管道的配置信息,组合各个引擎模块的顺序。作为爬虫引擎的启动部分,需要考虑全局,可以针对不同类型的网站来设计启动器内各个模块之间的顺序和数量,例如需要多种输出类型的网站可以在启动器内放入多个管道。但为了避免用户对模块本身的重构,以及为了系统的统一和安全,启动器还是爬虫引擎默认运行顺序和数量,下文会提到用户自定义接口的设计,可以满足启动器的扩展模块和增加模块数量的需求。 ​ 解释器(Interpreter),是启动器模块最先调用的部分,解析用户配置的爬虫信息,这里解释的文件可以是JSON、XML、INI等配置文件,本项目使用JSON解析配置信文件的解释器。 ​ 定时器模块(Timer),用于项目在规定时间内定时启动爬虫的启动器模块。主要目的用于对动态数据变化的网站,保持本地数据同步更新。定时器模块支持多个项目配置信息启动顺序,用户可以设置多个项目的配置文件交付给启动器中的定时器,定时器根据项目的权重等级优先开启该项目配置的启动器。 ​ 日志组件(LogUtils),在网络爬虫的过程中,经常会遇到很多报错,如请求网址未响应、爬虫配置出错、某个模块调用错误、返回失败等问题,因此使用日志组件是很重要的,给开发人员去重现、研究、提出解决方案、提高维护效率,便于在任务执行后发现和修改错误。 #### 调度器
图4 启动器模块
​ 图4所示是爬虫引擎中启动器模块功能图。调度器模块(Scheduler)和下载器密不可分,主要提供下载器每次所需的下载参数,调度每个下载器的执行顺序和状态。调度器获取启动器(Engine)模块传来调度信息后,会构造一个生成器的请求对象,该请求对象会激活一个下载器(Downloader)模块进用于页面爬取。调度器主要技术就是如何构建生成器、如何调度下载器、需要给下载器传入怎样的请求参数。调度器默认以先进先出的方式调度下载器,内部已经包含一些简单的页面跳转的方法,可以配置起始页面、结束页面、步长信息获取对应页数的URL,但这仅限于整数有规律的页面跳转。为了解决多页非整形跳转页面问题,可以通过字符串的请求体参数进行页面跳转映射,但这个方法目前仅适用于传入已知的静态参数的页面,倘若需要传入当前时间戳、md5加密等动态数据那么就必须需要用户编程的介入。因此我又给用户加入了一个接口用于用户自定义编程,在真实使用场景下,往往第一次请求的响应体信息是另一个下载器的请求体参数,所以用户可以通过这个接口自行处理请求参数,将最后真正的参数输入到下载器内。 #### 下载器
图5 下载器模块
​ 如图5所示是爬虫引擎中下载器模块功能图。下载器(Downloader)模块,接受调度器的一个生成器对象后,提取出对象内部的请求属性、请求方法、请求头等,且请求参数中提供一个外部接口,用于接入:登陆过程中的验证码识别的、切换代理的代理池、获取数据库漏洞的sql注入、密码的暴力破解字典、JavaScript解密等多种方法,通过Requests请求放入请求的各个必要参数就能实现爬虫向服务器请求,等待服务器返回一个请求体对象后,封装交付给下一层解析器。 #### 解析器
图6 解析器模块
​ 图6所示是爬虫引擎中解析器模块功能图。解析器(Parser)模块,用于爬取下载器模块的Response对象数据中的内容。内含CSS、XPath、Re三种常用XML结构的解析器。返回数据格式为对应匹配的有序数组数据,有序数组中的数据为调度器模块当前URL内容的映射。 #### 管道
图7 解析器模块
​ 图7所示是解析功能模块分析图。管道模块(Pipeline),是一个数据处理并输出的模块,专业的说法就是数据持久化,将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。这里提供了很多持久化的方法例如:直接打印至终端的console、文本文件的Txt、Excel、以及依照默认文件后缀格式输出的File、插入数据的SQL脚本、压缩文件从而良好存储等。 ## 环境安装 ### Flask后端环境 #### 安装后端依赖 1.下载后端python依赖包,在项目(./weber-spider/)根目录下,建议在虚拟环境中载入 ``` pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ ``` ### Vue前端环境(选) #### 安装nodejs 爬虫项目如果用到JavaScript逆向,则环境中必须安装nodejs。 [官网下载](https://nodejs.org/en/download/) [centos安装教程](https://zhuanlan.zhihu.com/p/126704711) 1.查看是否安装了npm (有版本号即成功): ```bash npm -v 说明:npm是node的包管理工具,默认安装完node之后,npm会自动安装上的。 ``` #### 安装Vue 说明:vue依托nodejs,vue只是node万千包中的一个。 1.先查看电脑里有没有安装vue: ```bash vue -V ``` 2.新版vue脚手架安装命令: ```bash sudo npm install -g @vue/cli ``` 3.如果安装vue出现一些警告和错误,清除一下缓存就行,清除缓存的命令: ```bash npm cache clean --force ``` 4.下载前端依赖包node_modules,在项目(weber-spider/flask_vue/www/)目录下 ```bash npm install ``` 5.其他命令 ```bash #卸载版本 sudo npm uninstall vue-cli -g ``` ## 系统使用 ### 系统账号密码 ``` 账号:admin 密码:panwenbo ``` ### 启动Flask 在flask_vue/app.py ,启动后端 ```bash python app.py ``` ### 启动Vue 在flask_vue/www目录下,启动vue ```bash npm run dev ``` 其他命令 ``` npm run init 从模板生成新项目 npm run list 列出可用的官方模板 npm run build 创建新项目的原型 npm run create 创建(警告:仅用于v3以上版本) vue ui 启动脚手架图形界面(3.0以上版本) ``` 配置axios请求后端接口的生成环境(打开flask_vue/www/.env.production) 配置axios请求后端接口的开发环境(打开flask_vue/www/.env.development) ``` #修改前端请求后端的host+port VUE_APP_TARGET_API = 'http://127.0.0.1:5000' #后端flask接口地址 ``` ### 启动代理池 搭建代理池需要使用到redis,请自行依据系统环境安装redis [window安装redis教程](https://blog.csdn.net/weixin_43883917/article/details/114632709) [macOS安装redis教程](https://blog.csdn.net/realize_dream/article/details/106227622) [centOS安装redis教程](https://blog.csdn.net/a_rain2333/article/details/119567362) 默认以下端口配置,可自行配置(weber-spider/proxy_pool/setting.py文件) ```bash HOST = "0.0.0.0" #flask host #默认地址:127.0.0.1:5010 PORT = 5010 #flask port DB_CONN = 'redis://:@127.0.0.1:6379/0' #redis ``` ```bash #启动redis 默认port:6379 ,DB_CONN修改、redis端口也要响应修改 redis-server or nohup reids-server > /dev/null 2>&1 & # 启动调度程序 python3 -u ./proxy_pool/proxyPool.py schedule or nohup python3 -u ./proxy_pool/proxyPool.py schedule >schedule.log 2>&1 & # 启动webApi服务 python3 -u ./proxy_pool/proxyPool.py server or nohup python3 -u ./proxy_pool/proxyPool.py server >server.log 2>&1 & #默认代理池接口地址:127.0.0.1:5010 #代理池使用的默认地址:http://127.0.0.1:5010/get/ ``` ### 前端配置信息 #### 下载器
#### 解析器
#### 输出器
## 已知问题 #### 删除浏览器缓存 ​ 如先开启前端vue并访问,后开启后端flask。会导致登录状态一直为network error,需要清除浏览器数据后才能恢复访问正常。 ## 主要项目负责人

Weber

## 开源协议 MIT © Weber ## 第三方资源 **selesium火狐驱动:** **[ 火狐浏览器驱动下载地址1]( http://npm.taobao.org/mirrors/geckodriver/)** **selesium谷歌驱动:** ​ **[谷歌浏览器驱动下载地址1](https://npm.taobao.org/mirrors/chromedriver/)** ​ **[谷歌浏览器驱动下载地址2](http://chromedriver.storage.googleapis.com/index.html)** **加载界面SVG图:** ​ **[SVG图下载地址](https://loading.io/spinner/dual-ring/-disqus-ring-donut-rotate)** **icon矢量图:** ​ **[iconfont-阿里巴巴矢量图标库](http://www.iconfont.cn/)** **云端图床:** ​ **[imgtu](https://imgtu.com/)** **Badge:** ​ **[shields](https://shields.io/category/coverage)** ## 开发日志
2022年06月07日 1. 更新文件按时间命名。 2. 增加后端robots协议过滤开关。 ## 参考资料 ## 特别感谢 感谢[jhao104]()提供的开源代理池项目:[ProxyPool](https://travis-ci.org/jhao104/proxy_pool),为本次爬虫框架提供代理池 感谢[菲菲打码](http://www.fateadm.com/)平台提供的验证码识别接口 ## 免责声明 请勿将`weber-sipder`应用到任何可能会违反法律规定和道德约束的工作中,请友善使用`weber-sipde`,遵守蜘蛛协议,不要将`weber-sipde`用于任何非法用途。如您选择使用`weber-sipde`即代表您遵守此协议,作者不承担任何由于您违反此协议带来任何的法律风险和损失,一切后果由您承担。