搜狐首页 科技 法医秦明

手机搜狐

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))

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

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

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

精选