昨天想去极客时间把购买的一个专栏里的数据扒下来,发现之前写的 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
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于