爬虫入门(二)让爬虫健壮起来

来源:互联网 发布:js md5 sha1 消耗时间 编辑:程序博客网 时间:2024/06/05 20:48

爬虫入门(二)

不知道大家有没有去编写代码实战呢,如果有的话可能你就会发现有很多问题,最常见的就是爬取一段时间后就突然爬取不了了,整个程序直接中断了,又要重新开始爬取是很扎心的事情……显然别人的网站也不是傻子,肯定会有一定的反爬虫方法嘛

一般网站上比较常见的有两种方法

  • 限制IP访问频率,超过频率就中断
  • 单个User-Agent访问次数超过次数就中断

当然还有其他的方法,但是呢入门嘛我们就先解决这两种反爬虫方法

首先呢既然它限制IP访问频率,那么我们最直接的方法就是在每个爬取之后添加一个延迟,time.sleep()可以有效的降低频率,然后如果还解决不了怎么办呢?显然我们可以换一个IP嘛,那么顺着这个思路,我们就可以去百度一下代理IP,代理IP的获取呢在我前面的博文有,可以去看看

同样的对于User-Agent,我们也是借助神奇的百度来获取一堆浏览器的User-Agent,然后我们就可以改写我们的代码啦

User_Agent = [    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",    "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"]

上面的就是我百度出来的,直接复制进去,Ip你也可以一样复制或者自己再写个小爬虫来获取,自动处理一下就可以了

在mzitu类添加获取Ip,User-Agent的代码,很简单,我们就随机从列表返回一个就可以了

def getUser_Agent(self):    UA = random.choice(self.User_Agent)    headers = {'User-Agent': UA}    return headersdef getUser_IP(self):    IP = random.choice(self.User_IP)    ip = {'IP': IP}    return ip

然后我们的requets.get()就可以改写成这个样子,不熟悉的可以去翻翻文档咯

requests.get(url,headers=self.getUser_Agent(),proxies=self.getUser_IP())

但是呢仅此而已还是不够的,万一还是返回失败或者本身自己的网络就不好呢?那么整个程序还是会中断的,我们不想它就这样草草中断了,于是乎我们可以给它请求函数再添加一些异常判断

因为要对requests.get()进行一些判断,我们可以再写一个函数来封装这个requests.get()方法,让它成为一个健壮的GetRespon方法

#地址,延迟时间,重新尝试次数,代理Ip,def GetRespon(self,url,timeout,num_retries=4,proxy=None):    print(u'开始获取地址:',url)    if proxy == None:        try:            return requests.get(url,headers=self.getUser_Agent(),timeout=timeout)        except:            if num_retries > 0:                print(u'尝试重新连接,等待10S,剩余次数:%s次'%(num_retries))                time.sleep(10)                return self.GetRespon(url,timeout,num_retries-1)            else:                print(u'我的IP不好使啦,使用代理IP')                return self.GetRespon(url,timeout,4,self.getUser_IP())    else:        try:            return requests.get(url,headers=self.getUser_Agent(),proxies=proxy,timeout=timeout)        except:            if num_retries > 0:                print(u'尝试重新连接,等待10S,剩余次数:%s次'%(num_retries))                time.sleep(10)                return self.GetRespon(url,timeout,num_retries-1)            else:                print(u'代理Ip有点不好用,取消代理')                return self.GetRespon(url,timeout,4,None)

这就是我改写的函数了,首先我们默认用自己的Ip进行访问,如果超过一定的尝试次数我们可以认为你的Ip就暂时被屏蔽了,那么我们就可以换一个Ip继续来嘛,这样往复访问

这样呢我们只要把我们这个类里面其他调用requests.get()方法的位置改为我们的GetRespon方法就可以啦

另外还有一个地方是要加异常处理的,那就是我们创建文件夹的地方os.mkdir(dirName)

因为我在爬取到最后几页的时候突然出错了,震惊!是因为本身那个图片的标题就是XXX/XXX/XXX,而这个代码没有对图片进行不识别转义字符的操作,所以建立文件夹的时候它会在目录/XXX/XXX/XXX下建立,而前面的两个XXX文件夹根本就没有,然后……GG,因为懒的关系我就直接加了个异常直接跳过

        try:            os.mkdir(dirName)        except:            return False

大概这样改完呢一个比较健壮的爬虫就出来啦,可以工作比较长时间了~

1 0
原创粉丝点击