您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    一只node爬虫的晋级打怪之路
    时间:2017-11-15 21:37 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    Tech Neo技术沙龙 | 11月25号,九州云/ZStack与您一同讨论云时代网络边界管理实际

    我不断觉得,爬虫是许多web开发人员难以逃避的点。我们也应该或多或少的去接触这方面,由于可以从爬虫中学习到web开发中应当掌握的一些基本知识。而且,它还很幽默。

    我是一个知乎细微重度用户,之前写了一只爬虫帮我爬取并剖析它的数据,我觉得这个进程还是挺有意思,由于这是一个不断给本人发明成绩又去处置成绩的进程。其中遇到了一些点,明天总结一下跟大家分享分享。

    它都爬了什么?

    先复杂引见下我的爬虫。它可以定时抓取一个成绩的关注量、阅读量、答双数,以便于我将这些数据绘成图表展现它的热点趋向。为了不让我错过一些抢手事情,它还会定时去获取我关注话题下的抢手问答,并推送到我的邮箱。

    作为一个前端开发人员,我必须为这个爬虫系统做一个界面,能让我登陆知乎帐号,添加关注的标题、话题,看到可视化的数据。所以这只爬虫还有登陆知乎、搜索标题的功用。

    然后来看下界面。

    一只node爬虫的晋级打怪之路

    一只node爬虫的晋级打怪之路

    下面正儿八经讲它的开发历程。

    技术选型

    Python得益于其复杂快捷的语法、以及丰厚的爬虫库,不断是爬虫开发人员的首选。惋惜我不熟。当然最重要的是,作为一名前端开发人员,node能满足爬虫需求的话,自然更是首选。而且随着node的开展,也有许多好用的爬虫库,甚至有 puppeteer 这样直接能模拟Chrome拜访网页的工具的推出,node在爬虫方面应该是妥妥能满足我一切的爬虫需求了。

    于是我选择从零搭建一个基于koa2的效劳端。为什么不直接选择egg,express,thinkjs这些愈加片面的框架呢?由于我爱折腾嘛。而且这也是一个学习的进程。假设以前不了解node,又对搭建node效劳端有兴味,可以看我之前的一篇文章-从零搭建Koa2 Server。

    爬虫方面我选择了 request + cheerio 。虽然知乎有很多中央用到了react,但得益于它绝大部分页面还是效劳端渲染,所以只需能央求网页与接口(request),解析页面(cherrio)即可满足我的爬虫需求。

    其他不逐一举例了,我列个技术栈

    效劳端

    koajs 做node server框架;

    request + cheerio 做爬虫效劳;

    mongodb 做数据存储;

    node-schedule 做义务调度;

    nodemailer 做邮件推送。

    客户端

    vuejs 前端框架;

    museui Material Design UI库;

    chart.js 图表库。

    技术选型妥善后,我们就要关心业务了。首要义务就是真正的爬取到页面。

    如何能爬取网站的数据?

    知乎并没有对外开放接口能让用户获取数据,所以想获取数据,就得本人去爬取网页信息。我们知道即使是网页,它本质上也是个GET央求的接口,我们只需在效劳端去央求对应网页的地址(客户端央求会跨域),再把html结构解析下,获取想要的数据即可。

    那为什么我要搞一个登陆呢?由于非登陆帐号获取信息,知乎只会展现有限的数据,而且也无法得知本人知乎帐户关注的话题、成绩等信息。而且若是想本人的系统也给其他冤家运用,也必须搞一个帐户系统。

    模拟登陆

    大家都会用Chrome等现代阅读器看央求信息,我们在知乎的登录页停止登陆,然后查看捕获接口信息就能知道,登陆无非就是向一个登陆api发送账户、密码等信息,假设成功。效劳端会向客户端设置一个cookie,这个cookie即是登陆凭证。

    所以我们的思绪也是如此,经过爬虫效劳端去央求接口,带上我们的帐号密码信息,成功后再将前往的cookie存到我们的系统数据库,以后再去爬取其他页面时,带上此cookie即可。

    当然,等我们真正尝试时,会遭到更多波折,由于会遇到token、验证码等成绩。不过,由于我们有客户端了,可以将验证码的辨认交给真正的 人 ,而不是效劳端去解析图片字符,这降低了我们完成登陆的难度。

    一波三折的是,即使你把正确验证码提交了,还是会提示验证码错误。假设我们本人做过验证码提交的系统就可以迅速的定位缘由。假设没做过,我们再次查看登陆时触及的央求与照应,我们也能猜到:

    在客户端获取验证码时,知乎效劳端还会往客户端设置一个新cookie,提交登陆央求时,必须把验证码与此cookie一同提交,来验证此次提交的验证码确实是事先给予用户的验证码。

    言语描画有些绕,我以图的方式来表达一个登陆央求的残缺流程。

    一只node爬虫的晋级打怪之路

    注:我编写爬虫时,知乎还部分采取图片字符验证码,现已全部改为“点击倒立文字”的方式。这样会加大提交正确验证码的难度,但也并非无计可施。获取图片后,由 人工 辨认并点击倒立文字,将点击的坐标提交到登陆接口即可。当然有兴味有才能的同窗也可以本人编写算法辨认验证码。

    爬取数据

    上一步中,我们曾经获取到了登陆后的凭证cookie。用户登陆成功后,我们把登陆的帐户信息与其凭证cookie存到mongo中。以后此用户发起的爬取需求,包括对其跟踪成绩的数据爬取都依据此cookie爬取。

    当然cookie是有时间期限的,所以当我们存cookie时,应该把过时时间也记载上去,以后面再获取此cookie时,多加一步过时校验,若过时了则前往过时提示。

    爬虫的基础搞定后,就可以真正去获取想要的数据了。我的需求是想知道某个知乎成绩的热点趋向。先用阅读器去看看一个成绩页面下都有哪些数据,可以被我爬取剖析。举个例子,比如这个成绩: 有哪些令人赞不绝口的推理桥段 。

    翻开链接后,页面上最直接展现出来的有 关注者 , 被阅读 , 1xxxx个回答 ,还要默许展现的几个高赞回答及其点赞评论数量。右键查看网站源代码,确认这些数据是效劳端渲染出来的,我们就可以经过request央求网页,再经过cherrio,运用css选择器定位到数据节点,获取并存储上去。代码示例如下:

    async getData (cookie, qid) { 

      const options = { 

        url: `${zhihuRoot}/question/${qid}`, 

        method: 'GET'

        headers: { 

          'Cookie': cookie, 

    (责任编辑:admin)