搜狐首页 科技 栀子花开

手机搜狐

SOHU.COM

单机30分钟抓取豆瓣电影7万+数据:论爬虫策略的重要性(附全部数据下载地址)

文|笑虎

首先报告下试验条件和结果:

硬件:普通电脑一台(MacPro),IP地址一个,无代理IP

语言:使用Python语言中的requests库进行抓取

框架:使用自己写的简易爬虫框架PSpider(PSpider框架)

速度:开启100个线程,1846 秒抓取 72500 个URL,排重后有57182条电影信息

框架及爬虫代码开源:https://github.com/xianhu/PSpider。

数据下载地址:http://pan.baidu.com/s/1kUMU7hd密码: r13g

每条电影数据包括下图中的全部字段:

貌似爬虫爱好者都喜欢爬豆瓣的东西,无论是电影、音乐还是小组等等。所以豆瓣网在反爬方面也是煞费苦心。当你的爬虫没什么策略可言时,很容易就会返回403错误。经过一些实验以及Google的结果,大体可以看出豆瓣的反爬策略:

当你不使用Cookie进行抓取时,连续的多请求几次就会被封,而且是封IP地址,即无论你怎么换UA都会返回403错误。当你使用Cookie时,第一次请求豆瓣页面会返回一个名为bid的Cookie,以后的请求都会带此Cookie,但当你请求过于频繁时,此Cookie也会被封。但是此时不会封IP地址。当你不是很频繁的请求豆瓣时,即使不带Cookie,豆瓣每次都会返回一个bid。

基于以上3点,可以大体得出我们的爬虫策略:

(1)不带Cookie先请求一次,并将返回的Cookie进行保存,下边的所有请求都带此Cookie。

(2)请求一段时间被封后,清除所有Cookie后,再次进行请求,返回可用Cookie,依次循环

此策略应该有效,但没有经过验证。我在试验过程中,尝试random获取豆瓣需要的bid值,发现竟然也可用,即bid不需要通过请求获得,直接随机即可。此时策略就更简单了:随机bid值,并加入到Cookie中进行页面请求,当发现被封时,清除Cookie,随机更换bid值。

关键代码如下:

“Cookie”: “bid=%s” % “”.join(random.sample(string.ascii_letters + string.digits, 11))

到这,文章就写完了,是不是特别简单?

下边我们聊聊爬虫策略问题。

平时在和其他技术人员交流爬虫的时候,很多人喜欢把“分布式”挂在嘴边。其实我玩爬虫那么久了,也算是个老司机了,真正遇到需要分布式抓取的情况还真不多。个人觉得除非是很大型的爬虫,比如抓取淘宝某一大类商品信息(总量大概在几千万级别以上),否则真的很少用到分布式爬虫。

当爬虫需要爬的URL特别多时,此时有两个瓶颈:

对方封爬虫请求,即封IP或者利用Cookie、账号等封请求。

自己服务器解析比较慢,即爬虫的瓶颈在于解析慢,特别是对于Python爬虫。

后者可能需要分布式集群,来提高解析能力,顺便提高抓取速度。而前者可能就需要一点策略了。比如我们上边提高的爬豆瓣的策略。当你不断试验,返现对方服务器的反爬策略时,你就可以根据对方的策略,去选择自己爬虫的策略。但道高一尺魔高一丈,爬虫、反爬、反反爬是一个双方不断博弈、不断斗争的过程,有时候想想也挺有意思。

自己玩爬虫那么久了,网页数据、视频数据、APP数据等都抓过。如果APP对数据进行加密就不容易抓取了,而网页数据原理上都能抓。但只是原理上。除了加验证码的,我也遇到过让我头疼的网站,比如:http://openlaw.cn/,初步判断是该网站会首先返回一段JS代码,用来种Cookie,而一般的语言没有办法直接执行JS代码。有感兴趣的,可以尝试一下该网站的爬虫(利用Python+Selenium+PhantomJS应该可以,但没试过),成功后欢迎骚扰!

同时欢迎大家把平时在爬虫工作中遇到的问题在评论中写出来,遇到能解决的问题,也欢迎大家帮忙解决一下。

作者GitHub主页:撸代码,学知识 – GitHub

End.

精选