Anything0 2019-06-27
正文之前:
这是一个针对小白的小项目。。大神感兴趣的看看哈,不感兴趣的不忙的话麻烦也帮我看看,我是一个野生的程序员,学习前端这块没有经历过别人指导。真诚希望热心大神指出我的一些缺点与不足。。
项目介绍:
这是一个在线web爬虫项目,可以提供最多深度为3的数据抓取服务。同时还包含了用户后台管理,数据接口生成的功能。
该项目后台基于Nodejs,Web框架利用koa2,数据库使用了mongodb,前端框架是Vue,还简单的使用了一下VueRouter与Vuex,前后端通信Axios,爬虫利用superagent与cheerio。
系统界面:
首页:
后台:
项目背景:
上课的时候偶然想到做这么一个项目,可以方便别人抓取数据,用来弄一些有价值的东西。正巧最近粗浅的学了学Vue,还想学学使用koa2和axios这些。恰巧之前学习过alsotang的《Nodejs包教不包会》系列,学了点Nodejs爬虫。所以当即开始了本项目的开发。
项目经历:
在写这个项目之前,使用koa2的经历也仅限于实现几个官网的Demo。做后台的时候,边看着koa2的官网API,边完成代码的编写。koa2相比express,koa2使用了ES7的async与await,使得相比express少了很多回调函数,用起来更舒服。此外koa2中很多中间件需要自行安装。本项目中使用koa-static与koa-session两个。koa-static用来设置静态文件夹,koa-session用来保存用户登录状态。koa-router这个路由中间件没有用到,因为在开始写的时候,参考官网的Dome,所以就一直if条件判断请求路径。
项目中koa2的代码写的相较express项目显得较为原生,很多东西需要手动实现,比如说用户请求路径的判断(完成一个响应需要很多个if判断,这个可以安装koa-router中间件),响应文件需要使用原生fs模块读取文件等等。。。还有就是标签识别与定制爬虫输出格式这一块稍显麻烦,怎么样才能让用户输入的参数被整合到相关上下文?绞尽脑汁之后,灵机一动,想到了eval函数,虽然牺牲了一些安全性,但是最后识别效果还算完美。然后就是怎么样根据用户选择的爬取深度,制定合适的爬取规则?这里蛮困难的,如果是深度为1还好说,只需要将用户输入的参数带到爬虫程序里的上下文,获得数据直接输出即可,但是深度为2,为3怎么办呢?深度为2时,还要以第一个爬取的结果为条件,深度为3时,以第二次爬取为条件。。这里其实容易想到Promise,利用Promise即可实现函数的串行调用。。如何控制并发请求数,以免让目标网站发现,封了我的IP?我用了async库,来控制并发请求数,使得二次请求时(及将深度为一获得的链接用于第二次请求),并发数量限制在可控范围内。在实验过程中,我试着抓塔读文学网的数据,结果就被封了IP