一、简述
在一次编写简单的python爬虫的过程中,发现了某个bug,深入学习后了解了这个bug。
二、bug出现的情景
在某次编写python爬虫的过程中,因为是初学,对爬虫并不能很好的使用,在边学习边编写代码的过程中,对某个网站的内容的爬取出现了问题。爬虫的编写时首先对单页内容进行爬取测试,测试时结果正确无误,接下来进行广泛内容的爬取,因为数据量较大,所以需要较长时间。
在内容爬取到大概半个小时的时候,程序进程突然报错,具体错误应为http响应错误,程序运行被强行终止。第一次草草的排查错误后并未发现问题所在,所以在此运行尝试。二第二次运行时,经历比第一次还要短的运行时间后程序在此报错。
三、排除bug
因为是初次编写爬虫,在对很多东西并不熟悉的情况下便进行了代码的编写。因此遇到无法解决的问题首先想到的是使用搜索引擎搜索学习。从搜索结果中找到了问题所在。原因非常简单,大多数的大型网站都有为了保护网站资源不受伤害而设立的保护措施,其中有一条便是防止大量的机器人访问导致网站可用资源紧张。因此大多数的网站设立了防护措施,对于短时间内同意ip地址对网站的重复性访问会给予限制,以保护网站资源。因此只要避免大量的重复访问就可以了,对于本机电脑上的爬虫程序运行,可以限制速度,比如可以限制为每10s访问一次,可以使用time.sleep()函数来限制。设置时间限制后运行程序,经过较长时间的运行后程序正常结束,未发生问题。
但是,限制访问速度同时带来了速度的减慢,所以可以使用多线程来解决,将原本的类设置为Thread的子类,然后创建线程运行程序,同时线程不能过多,过多会导致访问速度的加快。
解决网站限制有很多办法,其余的还有使用服务器集群,动态轮训IP地址等方法。
四、总结
对于出现bug的情况,尤其是对于新手而言,不要过于慌张,而是应该好好学习打好基础,无法解决的问题需要善于使用搜索引擎。同时看源代码是一种非常好的习惯,通过阅读源代码可以了解原理,快速排除bug。
原文:http://www.cnblogs.com/yangmutong/p/5245619.html