新手爬虫,教你如何爬掘金
发布于 8 小时前 作者 fruit-memory 106 次浏览 来自 分享

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

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

本文用到的三个工具为

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

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

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

咦!recommend?推荐?好了,进去一看,果然是首页热门文章,但是。。。 请求参数suid是什么?查看请求调用堆栈,,再看源码,emmmm 源码已经被混淆压缩了

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

直接进入请求网址,再更改suid,发现随便更改都可以得到相应 但是。。。这并没有什么用啊!就10条信息我手动复制算了?

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

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

差点忘打码了,qwq 我是使用邮箱注册的,可能使用其它账号注册的接口会不一样

  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

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

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

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

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

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

打开相关网站,解码

答案呼之欲出啊,最重要的三个参数全在这了,那么问题来了,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

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

2 回复

和《Node.js 包教不包会》里面的很类似哈

回到顶部