<20>python学习笔记——爬虫2——反反爬
2017-02-28 22:31
681 查看
新手参考学习了http://cuiqingcai.com/3256.html,原版写的真的很好!感谢!
会遇到网站反爬虫策略下面几点:
1 / 限制IP访问频率,超过频率就断开连接。(这种方法解决办法就是,降低爬虫的速度在每个请求前面加上time.sleep;或者不停的更换代理IP,这样就绕过反爬虫机制啦!)
2 / 后台对访问进行统计,如果单个userAgent访问超过阈值,予以封锁。(效果出奇的棒!不过误伤也超级大,一般站点不会使用,不过我们也考虑进去
3/ 还有针对于cookies的 (这个解决办法更简单,一般网站不会用)
做一个反反爬模块,需要用到下面这些模块:
requests
re (正则表达式)
random(随机选择)
————处理userAgent访问频率问题
有的网站会限制相同的User-Agent的访问频率,那我们就给他随机来一个User-Agent。
思路就是:百度一堆User-Agent回来,用随机选择来选用。
代码:
这个要用到正则表达式!点我查看正则表达式基本教程
先要获取IP代理网站,这个很多http://haoip.cc/tiqu.htm
_______第二阶段的全部代码
——主程序代码
导入了反反爬模块
会遇到网站反爬虫策略下面几点:
1 / 限制IP访问频率,超过频率就断开连接。(这种方法解决办法就是,降低爬虫的速度在每个请求前面加上time.sleep;或者不停的更换代理IP,这样就绕过反爬虫机制啦!)
2 / 后台对访问进行统计,如果单个userAgent访问超过阈值,予以封锁。(效果出奇的棒!不过误伤也超级大,一般站点不会使用,不过我们也考虑进去
3/ 还有针对于cookies的 (这个解决办法更简单,一般网站不会用)
做一个反反爬模块,需要用到下面这些模块:
requests
re (正则表达式)
random(随机选择)
————处理userAgent访问频率问题
有的网站会限制相同的User-Agent的访问频率,那我们就给他随机来一个User-Agent。
思路就是:百度一堆User-Agent回来,用随机选择来选用。
代码:
import requests import re import random #创建一个反反爬的类 class download: def __init__(self): self.user_agent_list[ "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" ] def get(self,url): UA = random.choice(self,user_agent_list)##从user_agent_list中随机取出一个字符串。 headers = {'User_Agent':UA}##构造一个完整的User_Agent response = requests.get(url,headers=headers) return response————处理IP访问频率问题
这个要用到正则表达式!点我查看正则表达式基本教程
先要获取IP代理网站,这个很多http://haoip.cc/tiqu.htm
_______第二阶段的全部代码
——主程序代码
导入了反反爬模块
#导入需要的包 from bs4 import BeautifulSoup import os from BackClimb import request #建立一个抓图类 class mzitu(): #主入口函数 def all_url(self,url): html = request.get(url,3) ##调用request函数吧地址传进去,返回一个response all_a = BeautifulSoup(html.text,'lxml').find('div',class_='all').find_all('a')##用Soup对象的find方法找标签先查找class为all的div标签,然后查找所有<a>标签。find_all是查找所有<a>标签 for a in all_a: title = a.get_text() print(u'开始保存:',title)##提示保存XXX path = str(title).replace('?','_')##设置名字变量,将?替换成_ self.mkdir(path)##调用mkdir函数创建文件夹,path代表的是标题名 os.chdir('F:\mzitu\\'+path) ##改变工作路径 href = a['href']##取出<a>里面的href属性 self.html(href)##调用html函数吧href参数传递过去,href是套图的地址 #设置一个函数处理套图地址获得图片的页面地址 def html(self,href): html = request.get(href,3)##调用request函数把套图地址传进去,返回一个response max_span = BeautifulSoup(html.text,'lxml').find_all('span')[10].get_text()##查找所有的<span>标签获取最后一个标签中的文本也就是最后一个页面了 for page in range(1,int(max_span)+1):##用range产生页面序列 page_url = href + '/'+str(page)##手动拼接每一个页面地址 self.img(page_url)##调用img函数 #设置一个函数处理图片页面地址获得图片的实际地址 def img(self,page_url): img_html = request.get(page_url,3)##调用request函数把图片页面地址传进去,返回一个response img_url = BeautifulSoup(img_html.text,'lxml').find('div',class_='main-image').find('img')['src']##用img_Soup对象的find方法找标签先查找class为main-image的div标签,然后查找<img>标签里面的src。 self.save(img_url)##调用save函数保存图片,把img_url地址传递过去 #设置一个保存图片的函数 def save(self,img_url): name = img_url[-9:-4]##取url的倒数第四至第九位做图片的名字 print('开始保存:',img_url) img = request.get(img_url,3)##调用request函数把图片地址传进去,返回一个response f = open(name+'.jpg','ab')##写入多媒体文件必须要b这个参数 f.write(img.content)##多媒体文件要用conctent f.close()##关闭文件对象 #创建一个函数用来创建文件夹 def mkdir(self,path): path = path.strip() ##去除path前后空格 isExists = os.path.exists(os.path.join('F:\mzitu',path))##join将各部分合成一个路径名。os.path.exists判断后面的路径是否存在 if not isExists: ##如果为False,创建文件夹 print(u'创建了一个名字叫做',path,u'的文件夹!') os.makedirs(os.path.join('F:\mzitu',path))##创建多层文件夹,用join合成单独的一个路径文件夹 return True else: print(u'名字叫做',path,u'的文件夹已经存在了!') return False # # #创建获取网页response的函数并返回 # def request(self,url): # headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'}#设置浏览器请求头 # content = requests.get(url,headers=headers) ##使用requests中的get方法获取页面的内容,加上浏览器请求头 # return content Mzitu = mzitu() ##实例化 #这就是入口! Mzitu.all_url('http://www.mzitu.com/all')——反反爬代码
import requests import re import random import time #创建一个反反爬的类 class download: def __init__(self): self.iplist = [] ##初始化一个list用来存放获取到的ip html = requests.get(' http://haoip.cc/tiqu.htm')##使用requests中的get方法获取页面的内容 iplistn = re.findall(r'r/>(.*?)<b',html.text,re.S)##正则表达式,表示从html中获取所有r/><b中的内容,re.S的意思是包括匹配包括换行符,findall返回的是列表 for ip in iplistn: i = re.sub('\n','',ip)##利用re.sub替换方法,将\n替换为空 be11 self.iplist.append(i.strip())##将两端去除空格后添加到上面的list里面 self.user_agent_list=[ "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" ] def get(self,url,timeout,proxy=None,num_retries=6):##给函数一个默认参数proxy为空,默认num_retries为6次 UA = random.choice(self.user_agent_list)##从user_agent_list中随机取出一个字符串。 headers = {'User_Agent':UA}##构造一个完整的User_Agent if proxy == None:##当代理为空时,不使用代理获取response try: return requests.get(url,headers=headers)##返回一个requests.get的页面文件,调用随机的headers,服务器以为我们是真的浏览器了 except:##如果上面的代码执行报错则执行下面的代码 if num_retries >0: ##num_retries是限定的重试次数 time.sleep(10) ##延迟10秒 print(u'获取网页出错,10s后将获取倒数第:',num_retries,u'次') return self.get(url,timeout,num_retries-1)##调用自身,并减1,实现循环6次 else: print(u'开始使用代理') time.sleep(10) IP = ''.join(str(random.choice(self.iplist)).strip())##将从self.iplist中随机获取的字符串处理成需要的格式。去除两边空格后,用join拼接? proxy = {'http':IP} return self.get(url,timeout,proxy)##代理不为空的时候 else: ##当代理不为空 try: IP = ''.join(str(random.choice(self.iplist)).strip())##将从self.iplist中随机获取的字符串处理成需要的格式。去除两边空格后,用join拼接? proxy = {'http':IP}##构造成一个代理 return requests.get(url,headers=headers,proxies = proxy,timeout=timeout)##使用代理获取response except: if num_retries >0: time.sleep(10) IP = ''.join(str(random.choice(self.iplist)).strip()) proxy = {'http':IP} print(u'正在更换代理,10s后将重新获取倒数第',num_retries,u'次') print(u'当前代理是:',proxy) return self.get(url,timeout,proxy,num_retries-1) else: print(u'代理也不好使!取消代理') return self.get(url,3) request = download()
相关文章推荐
- <21>python学习笔记——爬虫3——断点续下
- <22>python学习笔记——爬虫4—多线程跑得快的虫子
- <28>python学习笔记——多线程 / 多进程
- <2>python学习笔记——分支和循环
- <35>python学习笔记——协程
- <17>python学习笔记——模块
- <23>python学习笔记——列表解析,字典解析,集合解析筛选元素
- <11>python学习笔记——json and pickle序列化
- <Python爬虫>爬取豆瓣图书/豆瓣电影系列
- <8>python学习笔记——集合set
- <34>python学习笔记——mysql
- <26>python学习笔记——根据字典中的值的大小进行排序
- <9>python学习笔记——文件操作
- <37>python学习笔记——paramiko模块
- <四>、python爬虫抓取购物网站商品信息--图片价格名称
- <33>python学习笔记——反射
- <13>python学习笔记——else语句 / with语句
- <12>python学习笔记——异常
- <39>python学习笔记——键盘鼠标
- <36>python学习笔记——论事件驱动与异步IO