美文网首页我爱编程
在掘金教你如何用nodejs爬掘金

在掘金教你如何用nodejs爬掘金

作者: _千寻瀑_ | 来源:发表于2018-04-14 23:03 被阅读0次

    前言,此文章仅作教学用途,如果有人拿去干别的事情,我概不负责,如果该文章侵害到了掘金社区的利益,请小编立刻联系我删除.

    最近闲来无聊,逛了好几天掘金,想想自己假如掘金这么久了,一篇文章都没发过,遂想写个爬虫教程吧,目标就是掘金,嘿嘿

    本文用到的三个工具为

    • cheerio:jQuery语法,帮助你在非浏览器环境下解析网页用的
    • qs 序列化成url的查询字符串,(不知道说没说对...)例:{a:1,b2} => a=1&b=2
    • request 一个封装好的好用的请求库

    开始我是尝试直接请求掘金首页,然后用cheerio解析,然后拿到网页继续干活的。。可是事情并没有这么简单,通过这个方法爬取的网页跟我们正常浏览的首页不一样(有可能是我哪姿势不对)
    没办法,只能从接口出发了

    首先打开网页版掘金, 然后打开chrome的network,查看相关请求

    image

    咦!recommend?推荐?好了,进去一看,果然是首页热门文章,但是。。。


    image

    请求参数suid是什么?查看请求调用堆栈,,再看源码,emmmm 源码已经被混淆压缩了


    image

    这可怎么办?我没有登陆
    查看完所有请求响应都没看到跟suid有关的,这可咋整?

    直接进入请求网址,再更改suid,发现随便更改都可以得到相应
    但是。。。这并没有什么用啊!就10条信息我爬你个小杰瑞啊?

    没办法了,只能老套路了。先登陆再说

    为了防止页面跳转后登陆请求消失,需要先勾选Preserve log,使页面跳转后前面的请求不会消失

    差点忘打码了,qwq


    image

    我是使用邮箱注册的,可能使用其它账号注册的接口会不一样

      let data = await request.create({
        url: 'https://juejin.im/auth/type/email',
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({email: '155com', password: 'cfdsd.'}) //账号密码
      });
    

    直接一个请求搞定,得到如下相应,问题的关键就在于cookie


    image

    好了,接下来该找接口了,点击最新,发现network多了下面这个请求,其响应数据就是最新板块的文章

    image

    相关参数有来源,设备id,用户id,token等,其中最重要的就是token,id什么的随便改两个字符好像也没问题,但是token错了它会报illegal token,请求方法错了,就算参数对了也会报missing src。

    当你看到token的时候,你会发现,哪都找不到这个数据,就算是登陆响应里面也没有。当然刚开始好像是有,我也忘了我当时token是复制网页的还是直接用的请求响应cookie里面的了

    反正最后你是直接找不到它了

    当你仔细看第5张图的时候,你会发现这auth后面这串字符是多么的熟悉,没错,它就是你们常用的base64编码

    打开相关网站,解码

    image

    答案呼之欲出啊,最重要的三个参数全在这了,那么问题来了,node如何解析base64编码呢?

    一行代码解决,buffer对象本身提供了base64的解码功能,最后调用toString方法,转成字符串,最后parse得到对象

      const cookie = data.headers['set-cookie'];
      const encodeToken = cookie[0]
        .split(';')[0]
        .split('=')[1];
      const decodeToken = JSON.parse(new Buffer(encodeToken, 'base64').toString())
    

    有了token,你就可以随心所欲的爬了,爬图片?主题?标题?文章内容?都欧克

    const {token, clientId, userId} = require('./user.json');  //这里我将相关数据写入了json文件中
    const querystring = qs.stringify({
      src: 'web',
      uid: userId,
      device_id: clientId,
      token: token,
      limit: 20,
      category: 'all',
      recomment: 1
    });
    const data = await request.get({
      url: `https://timeline-merger-ms.juejin.im/v1/get_entry_by_timeline?${querystring}`,
      headers: {
        host: 'timeline-merger-ms.juejin.im',
        referer: 'https://juejin.im/timeline?sort=comment'
      }
    });
    

    当然,我没有使用数据库来保存数据,这只是教大家爬取原理,到这里,一个超级简单的爬虫就完成了

    emmm 到最后好像也没用到cheerio了 ◔ ‸◔?

    以上代码或言论如有错误,还望大家指出

    全部代码见https://github.com/danmin25/Junjin-scrapy

    最后,爬虫需节制,小心被封哦,还有,我要吐槽一句编辑器,居然不支持粘贴图片???

    相关文章

      网友评论

        本文标题:在掘金教你如何用nodejs爬掘金

        本文链接:https://www.haomeiwen.com/subject/zzurkftx.html