爬虫入门(二)让爬虫健壮起来
来源:互联网 发布: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
- 爬虫入门(二)让爬虫健壮起来
- 【Python】健壮的爬虫
- Python爬虫入门二
- Python爬虫入门 (二)
- 网络爬虫之Beautifulsoup入门(二)
- Python爬虫入门(二)requests库
- 爬虫入门二(urllib,urllib2)
- 爬虫入门(1)
- 爬虫入门(一)
- (一)爬虫入门
- Python爬虫----爬虫入门(2)
- Python爬虫----爬虫入门(3)---urllib2
- 爬虫入门四(多线程爬虫)
- 【爬虫笔记】爬虫入门
- python 爬虫(二)
- 爬虫学习(二)
- golang 爬虫(二)
- python爬虫(二)
- Initializing a two dimensional std::vector
- 百度定位
- java中给出一个多线程TCP的ServerSocket例子?
- 【JavaScript】(6)Object、String、Array、Date对象的方法、属性(constructor、prototype)
- 深入PHP面向对象、模式与实践——企业模式
- 爬虫入门(二)让爬虫健壮起来
- WINDOWS PE制作
- yolo训练自己的数据实践总结
- Elton John ------Sorry seems to be the hardest
- 文件处理之XML-----DOM方式
- ORACLE SQL性能优化技巧大总结
- JSP 笔记 —— EL 表达式语言
- 日常练习
- 朴素贝叶斯