使用

使用"浏览器脚本注入"进行数据采集

Scroll Down

昨天想去极客时间把购买的一个专栏里的数据扒下来,发现之前写的python脚本不能用了,原因是他们网站做了限流、也加了http时间戳的一些校验。我们可以将之前的python脚本进行改进,用ip代理池来处理限流,寻找时间戳验证的规则就可以解决。

但是这次我们用了另外的一种爬虫的思路,就是我们直接写一些js脚本,在对方的网站里运行,去请求相应的接口,从而得到想要的数据。

这种思路其实见过很多例子,之前有一个很火的,qq空间自动点赞的脚本,看过它的源码,其实很简单,就是直接去操作dom,然后触发一些事件。

另外一个很火的例子,github上很火的一个repo, fuckZhihu,据说是winter当年退知乎时写的,将自己在知乎的数据保存下来。

下面是这次实践的内容:

获取文章id集合

刚进入专栏的时候会有一个获取左侧文章列表集合的请求,在这个接口里,我们就能获取到当前专栏的所有请求。

image.png

这个专栏大概有50多篇文章,因为限流的原因,我们分成两次进行请求。

注入FileSaver.js

FileSaver是一个运行在浏览器中,将数据下载为json或者excel文件的库。

image.png

我们在这里创建一个script标签,并将这个标签插入到文档中。

image.png

我在这里写了一个方法downloadJson,我们将等会获取到的数据传到这里来,就可以下载这个json文件了。

创建请求

创建ajax请求,请求文章详情的接口。

image.png

这里我们用原生的js来写的,是一个post请求,res就是我们得到这个接口的返回值,我们将需要的数据从这个返回值中取出来就可以了。

上面说的是单个请求的实现。多个请求的实现如下图所示。

image.png
然后我们将数据保存一下:

image.png

所有的结果都放在rs这个数组中了。

下载数据

我们将所有数据放在了一个数组中,在最后一次请求结束的时候,执行我们写好的downloadJson方法进行下载就可以了。

image.png

导入数据库

json文件导入数据库网上有很多的工具,我这次是用之前写好的脚本。

这个脚本在我的github上面,是用nodejs写的,地址:tomysql.js

最后

我们这次没用通用的做法,模拟请求,或者模拟浏览器,而是直接利用浏览器来采集数据,当然也要根据实际情况去选择用哪种做法。

完整的脚本: geek.js

原文:https://github.com/maixiaojie/maixiaojie.github.io/issues/53