Python爬虫中爬取代理IP的方法是什么
这篇文章将为大家详细讲解有关Python爬虫中爬取代理IP的方法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
在我们爬虫的过程中,难免会遇到比较恶心的网站(安全性较高),来阻止我们的爬虫,跑着跑着,就断掉了!报错了啊!丢失连接之类的。幸幸苦苦的抓了半天又得从头来,心累啊!
这就是网站的反爬虫在起作用了。
一般来说我们会遇到网站反爬虫策略下面几点:
限制IP访问频率,超过频率就断开连接。(这种方法解决办法就是,降低爬虫的速度在每个请求前面加上time.sleep;或者不停的更换代理IP,这样就绕过反爬虫机制啦!)
后台对访问进行统计,如果单个userAgent访问超过阈值,予以封锁。(效果出奇的棒!不过误伤也超级大,一般站点不会使用,不过我们也考虑进去。
还有针对于cookies的 (这个解决办法更简单,一般网站不会用)
有些网站会监测你的IP,如果在某一时间段内,你的IP多次访问网页,就会封锁你的IP,过段时间再放出来。
对于第一种限制IP的,我们怎么来防止这种反爬虫呢?(与本篇博客无关,只是想挑起大家的好奇心)
对咯,就是用代理IP,OK,想要获取到代理IP,就要找到多个IP,所以我们今天先做第一步,把代理ip网站的所有IP给抓取下来;
我这里找到的一个网站是http://www.66ip.cn/,个人感觉还不错,反正是用来练手,嘿嘿~~~
步骤1、爬取整个网页
我们的思路是:先把网页所有内容爬取下来,然后再提取我们需要的信息。
首先按照惯例我们导入模块:
#-*-coding:utf-8-*-importbs4importurllibfrombs4importBeautifulSoupimporturllib2
我们写一个基本的请求网页并返回response的函数:
#-*-coding:utf-8-*-importbs4importurllibfrombs4importBeautifulSoupimporturllib2#构造网页请求函数defgethtml(url):request=urllib2.Request(url)response=urllib2.urlopen(request)html=response.read()returnhtml
哈哈,简单吧!
这只是基本的,其实学过爬虫的都知道,很多网站都都会拒绝非浏览器的请求的、怎么区分的呢?就是你发起的请求是否包含正常的User-Agent 这玩意儿长啥样儿?就下面这样(如果不一样 请按一下F5)
requests的请求的User-Agent 大概是这样 python-requests/2.3.0 CPython/2.6.6 Windows/7 这个不是正常的User-Agent、所以我们得自己造一个来欺骗服务器(requests又一个headers参数能帮助我们伪装成浏览器哦!不知道的小哥儿 一定是没有看官方文档!在这里request官方文档这样很不好诶!o(一︿一+)o),让他以为我们是真的浏览器。
所以我们修改一下代码:
#-*-coding:utf-8-*-importbs4importurllibfrombs4importBeautifulSoupimporturllib2#构造网页请求函数defgethtml(url):user_agent="Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/56.0.2924.87Safari/537.36"headers={"User-Agent":user_agent}request=urllib2.Request(url,headers=headers)response=urllib2.urlopen(request)html=response.read()returnhtml
好了,接下来就要写主函数了~~撸起袖子开干!!
步骤2、打开网站,查看IP所处位置
按F12
发现所有IP信息都在tr标签下的td节点中。OK,很好,非常好,非常方便~~
现在我们要做的就是找到这个标签。
先用BeautifulSoup解析网页
sp=bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")trs=sp.find_all("tr")fortrintrs:#tr是每一行foraintr.children:#发现a的编码方式是unicode,所以讲unicode转成utf-8字符串ip_val=a.string.encode('utf-8').strip()printip_val
好了,上面我们已经打印出来了td标签里面的所有内容。可是我们这里只想要IP怎么办呢??
好办,我们来判断抓取到的数据是不是IP,大家都知道,IP是有四位整数,通过点(.)来分隔的。恩,找到规律后,我们来定义一个函数来判断IP。
defis_invalid_ip4(ip):ip=ip.strip()#ip4格式:a.b.c.dits=[vforvinip.split('.')]#.分数不对iflen(its)!=4:returnFalse#值不是数字forvinits:ifnotv.isdigit():returnFalsereturnTrue
好了,我们来调用这个函数,修改上面的代码:
#使用beautifulsoup来解析网页sp=bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")trs=sp.find_all("tr")#先定义一个空列表,用于存放爬取到的ipiplist=[]fortrintrs:#tr是每一行foraintr.children:#发现a的编码方式是unicode,所以讲unicode转成utf-8字符串ip_val=a.string.encode('utf-8').strip()#调用判断有效ip函数ifis_invalid_ip4(ip_val):iplist.append(ip_val)printip_val#这里发现ip在tr的第一列,所以我们每次取到第一个数据后跳出breakprint'-'*32#我是分隔符
好了,这样我们就吧爬取到的IP放进了iplist这个列表里。
怎么样,很简单吧~~
步骤3、整理代码
那假如我们想要很多条IP怎么办,一页根本不够啊,OK,统统满足你——爬取多个网页的IP,就要不停的请求网页,那这个网址是变化的怎么办?
好吧,我又帮你找到规律了,只需要将网址的index改变就可以了。好吧,
完整代码:
#-*-coding:utf-8-*-importbs4importurllibfrombs4importBeautifulSoupimporturllib2importrequests#网址:http://www.66ip.cn/index.html#这里看出每一页的网址由index下标表示,即index是几就代表第几页#我这里只爬取五个,你随意啊defmain():#先定义一个空列表,用于存放爬取到的ipiplist=[]foriinrange(1,5):#构造urls=".html"url="http://www.66ip.cn/"#调用网页请求函数cur_url=url+str(i)+shtml_doc=gethtml(cur_url)#使用beautifulsoup来解析网页sp=bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")trs=sp.find_all("tr")fortrintrs:#tr是每一行foraintr.children:#发现a的编码方式是unicode,所以讲unicode转成utf-8字符串ip_val=a.string.encode('utf-8').strip()#调用判断有效ip函数ifis_invalid_ip4(ip_val):iplist.append(ip_val)printip_val#这里发现ip在tr的第一列,所以我们每次取到第一个数据后跳出breakprint'-'*32#我是分隔符defis_invalid_ip4(ip):ip=ip.strip()#ip4格式:a.b.c.dits=[vforvinip.split('.')]#.分数不对iflen(its)!=4:returnFalse#值不是数字forvinits:ifnotv.isdigit():returnFalsereturnTrue#构造网页请求函数defgethtml(url):user_agent="Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/56.0.2924.87Safari/537.36"headers={"User-Agent":user_agent}request=urllib2.Request(url,headers=headers)response=urllib2.urlopen(request)html=response.read()returnhtmlif__name__=="__main__":main()
完美!!
结果如下:
关于Python爬虫中爬取代理IP的方法是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。