在进行网页爬虫的项目时,常常会因为爬取的频率过高而触发 反爬虫机制 ,这时候,面临两个选择:
- 休息片刻。一般反爬虫机制不会进行永久的 IP 封禁,只是暂时限制访问而已,等待封禁时间结束再进行爬取即可。当然对于某些拥有黑名单机制的网站,如果封禁次数过多,封禁的时间也会随着这个次数而提高。
- 更换 IP。既然我的 IP 被封了,那么我换一个其他的 IP 不就行了。
显然,第二种方法更优于第一种,并且更加符合 geek 的风格。但是问题在于,从哪里寻找这样一个 IP 地址呢?
关于疫情
各地的疫情警报使得今年的春节有一种别样的味道。
我看到有人心系灾区捐款捐物,也看到有人趁此机会将自己推上舆论的风口攫取利益;我看到有人抱着舍身取义的心态奔赴一线,也看到有人仅将其作为茶余饭后的谈资不值一哂。
灾难面前众生百态,精彩如同一部小说,却远比我看过的任何小说都要精彩。对人的刻画,对社会的刻画,名为现实的大作家,以它的春秋笔法,将一切尽书于人前。
感慨就到这里吧,作为一个程序员,我们能做什么呢?
开启这个项目的起因是 severchain 发起的一个疫情推送功能,但是由于请求次数过多,服务器负载超限,不得已又停止了服务。我虽然不会做推送,但是搭建一个简单的疫情实况 api 还是很熟练地。
正好可以将寒假的两大技能 爬虫和 Flask ,做一个综合运用。
引入
根据笔者以往的爬虫经验,大部分的爬虫是在静态网页上完成的,爬虫所要做的只不过是提交请求,然后分析返回的页面即可。当然,api 本质上也可以作为静态页面来处理。这意味着只要掌握 requests 就可以完成 60%-80%的爬虫任务。
这是一个很惊人的占比,这里解释一下,静态页面可能听起来很 low,但是有着以加载速度更快、易于维护为核心的一系列优势,尤其是引入了 ajax 之后,实现了动态加载,通过更加频繁的前后端交互,使得用户的使用更加丝滑流畅。
但是总有一些网站是静态爬虫无法应付的。它们就是与 js 耦合度较高的,需要 js 进行渲染的页面,与上文所述的情况(前端只接收数据,而不用对数据进行计算层面的处理)不同,这类网站将部分的计算工作交托给前端,牺牲部分的用户体验来实现缓解服务器压力等一系列目的。
这就是剩下的 20%了。如何处理这些刺头呢?这就引出了本文的主角–splash。