昨天想去极客时间把购买的一个专栏里的数据扒下来,发现之前写的python脚本不能用了,原因是他们网站做了限流、也加了http时间戳的一些校验。我们可以将之前的python脚本进行改进,用ip代理池来处理限流,寻找时间戳验证的规则就可以解决。
但是这次我们用了另外的一种爬虫的思路,就是我们直接写一些js脚本,在对方的网站里运行,去请求相应的接口,从而得到想要的数据。
这种思路其实见过很多例子,之前有一个很火的,qq空间自动点赞的脚本,看过它的源码,其实很简单,就是直接去操作dom,然后触发一些事件。
另外一个很火的例子,github上很火的一个repo, fuckZhihu,据说是winter当年退知乎时写的,将自己在知乎的数据保存下来。
下面是这次实践的内容:
获取文章id集合
刚进入专栏的时候会有一个获取左侧文章列表集合的请求,在这个接口里,我们就能获取到当前专栏的所有请求。
这个专栏大概有50多篇文章,因为限流的原因,我们分成两次进行请求。
注入FileSaver.js
FileSaver是一个运行在浏览器中,将数据下载为json或者excel文件的库。
我们在这里创建一个script标签,并将这个标签插入到文档中。
我在这里写了一个方法downloadJson,我们将等会获取到的数据传到这里来,就可以下载这个json文件了。
创建请求
创建ajax请求,请求文章详情的接口。
这里我们用原生的js来写的,是一个post请求,res就是我们得到这个接口的返回值,我们将需要的数据从这个返回值中取出来就可以了。
上面说的是单个请求的实现。多个请求的实现如下图所示。
然后我们将数据保存一下:
所有的结果都放在rs这个数组中了。
下载数据
我们将所有数据放在了一个数组中,在最后一次请求结束的时候,执行我们写好的downloadJson方法进行下载就可以了。
导入数据库
json文件导入数据库网上有很多的工具,我这次是用之前写好的脚本。
这个脚本在我的github上面,是用nodejs写的,地址:tomysql.js
最后
我们这次没用通用的做法,模拟请求,或者模拟浏览器,而是直接利用浏览器来采集数据,当然也要根据实际情况去选择用哪种做法。
完整的脚本: geek.js
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。