Python 爬虫入门—— IP代理使用
2017-07-04 17:21
1161 查看
转自:http://www.cnblogs.com/hearzeus/p/5157016.html
上一节,大概讲述了Python 爬虫的编写流程, 从这节开始主要解决如何突破在爬取的过程中限制。比如,IP、JS、验证码等。这节主要讲利用IP代理突破。 1.关于代理 简单的说,代理就是换个身份。网络中的身份之一就是IP。比如,我们身在墙内,想要访问google、u2b、fb等,直接访问是404,所以要换个不会被墙的IP,比如国外的IP等。这个就是简单的代理。 在爬虫中,有些网站可能为了防止爬虫或者DDOS等,会记录每个IP的访问次数,比如,有些网站允许一个IP在1s(或者别的)只能访问10次等,那么我们就需要访问一次换一个IP(具体什么策略,自己决定)。 那么问题来了,这些代理从哪得到?对于公司来讲,买代理IP。但是对于个人的话,可能会有浪费。那么怎么办呢?网上有很多免费的代理IP网站,但是手动更改的话,很浪费时间,并且免费的IP有很多不可用。所以,我们可以用爬虫爬那么IP。用上一节的代码,完全可以做到。这里我们用http://www.xicidaili.com/nn/1测试,声明:仅学习交流,切勿用作商业用途等 2.获取代理IP,代码如下:
代码说明: a).这里我们使用的urllib2模块,因为,这个请求有点特殊,服务器会验证请求中的header(如有疑问,可参考http的相关资料) b).urllib2与urllib的区别在于,urllib2发送请求的时候可携带参数(我现在只用到这点区别) c).open()用于打开文件,第一个参数是文件的路径可以填绝对路径,例如E:\\proxy("\"在编程中是特殊字符,要用"\\"代表实际的"\")。也可以是相对路径,比 如"../src/proxy",就是文件相对于代码的位置。第二个参数"w",代表打开文件的权限,w代表写权限,r代表读权限。这个在很多系统中都通用。比如,linux等 d).for循环,如果之前学过java或者其他高级语言,可能不太习惯,因为他们用的是for(;;)这样的。python中的for循环,in 表示X的取值,按顺序取到in后面的参数 特别注意:别忘了for语句后面的冒号(":") c).range函数,代表生成一系列数,如果range(0,6,1),意思就是从0开始,到6结束(不包括6),每次增加1(也就是步长为1),生成一个数组,结果就是[0, 1, 2, 3, 4, 5] e).f.write()就是往文件里面写数据,如果打开文件的时候,没有"w"权限,则无法写入。 页面截图:
运行结果:
3.并不是所有的代理都能用,原因有很多,可能是我们所处的网络连不到这个代理,也有可能是这个代理,连不到我们的目标网址,所以,我们要验证一下。以http://ip.chinaz.com/getip.aspx作为目标网址为例(这个是测试ip地址的网址)代码如下:
代码说明: a).ip = lines[i].strip("\n").split("\t") 这个是去掉每行末尾的换行符(也就是"\n"),然后以制表符(也就是"\t")分割字符串为字符串数组 b).proxy_temp = {"http":proxy_host}其中http代表代理的类型,除了http之外还有https,socket等这里就以http为例 c).urllib.urlopen(url,proxies=proxy) 其中proxies就是代理。以代理模式访问目标网址 d).socket.setdefaulttimeout(3)设置全局超时时间为3s,也就是说,如果一个请求3s内还没有响应,就结束访问,并返回timeout(超时) 运行结果如图:
从结果看可用的并不是很多。但是也够个人用了。 至此,IP代理的使用就结束了。
上一节,大概讲述了Python 爬虫的编写流程, 从这节开始主要解决如何突破在爬取的过程中限制。比如,IP、JS、验证码等。这节主要讲利用IP代理突破。 1.关于代理 简单的说,代理就是换个身份。网络中的身份之一就是IP。比如,我们身在墙内,想要访问google、u2b、fb等,直接访问是404,所以要换个不会被墙的IP,比如国外的IP等。这个就是简单的代理。 在爬虫中,有些网站可能为了防止爬虫或者DDOS等,会记录每个IP的访问次数,比如,有些网站允许一个IP在1s(或者别的)只能访问10次等,那么我们就需要访问一次换一个IP(具体什么策略,自己决定)。 那么问题来了,这些代理从哪得到?对于公司来讲,买代理IP。但是对于个人的话,可能会有浪费。那么怎么办呢?网上有很多免费的代理IP网站,但是手动更改的话,很浪费时间,并且免费的IP有很多不可用。所以,我们可以用爬虫爬那么IP。用上一节的代码,完全可以做到。这里我们用http://www.xicidaili.com/nn/1测试,声明:仅学习交流,切勿用作商业用途等 2.获取代理IP,代码如下:
#encoding=utf8import urllib2import BeautifulSoup User_Agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0'header = {} header['User-Agent'] = User_Agent url = 'http://www.xicidaili.com/nn/1'req = urllib2.Request(url,headers=header) res = urllib2.urlopen(req).read() soup = BeautifulSoup.BeautifulSoup(res) ips = soup.findAll('tr') f = open("../src/proxy","w")for x in range(1,len(ips)): ip = ips[x] tds = ip.findAll("td") ip_temp = tds[1].contents[0]+"\t"+tds[2].contents[0]+"\n" # print tds[1].contents[0]+"\t"+tds[2].contents[0] f.write(ip_temp)
代码说明: a).这里我们使用的urllib2模块,因为,这个请求有点特殊,服务器会验证请求中的header(如有疑问,可参考http的相关资料) b).urllib2与urllib的区别在于,urllib2发送请求的时候可携带参数(我现在只用到这点区别) c).open()用于打开文件,第一个参数是文件的路径可以填绝对路径,例如E:\\proxy("\"在编程中是特殊字符,要用"\\"代表实际的"\")。也可以是相对路径,比 如"../src/proxy",就是文件相对于代码的位置。第二个参数"w",代表打开文件的权限,w代表写权限,r代表读权限。这个在很多系统中都通用。比如,linux等 d).for循环,如果之前学过java或者其他高级语言,可能不太习惯,因为他们用的是for(;;)这样的。python中的for循环,in 表示X的取值,按顺序取到in后面的参数 特别注意:别忘了for语句后面的冒号(":") c).range函数,代表生成一系列数,如果range(0,6,1),意思就是从0开始,到6结束(不包括6),每次增加1(也就是步长为1),生成一个数组,结果就是[0, 1, 2, 3, 4, 5] e).f.write()就是往文件里面写数据,如果打开文件的时候,没有"w"权限,则无法写入。 页面截图:
运行结果:
3.并不是所有的代理都能用,原因有很多,可能是我们所处的网络连不到这个代理,也有可能是这个代理,连不到我们的目标网址,所以,我们要验证一下。以http://ip.chinaz.com/getip.aspx作为目标网址为例(这个是测试ip地址的网址)代码如下:
#encoding=utf8import urllibimport socket socket.setdefaulttimeout(3) f = open("../src/proxy") lines = f.readlines() proxys = []for i in range(0,len(lines)): ip = lines[i].strip("\n").split("\t") proxy_host = "http://"+ip[0]+":"+ip[1] proxy_temp = {"http":proxy_host} proxys.append(proxy_temp) url = "http://ip.chinaz.com/getip.aspx"for proxy in proxys: try: res = urllib.urlopen(url,proxies=proxy).read() print res except Exception,e: print proxy print e continue
代码说明: a).ip = lines[i].strip("\n").split("\t") 这个是去掉每行末尾的换行符(也就是"\n"),然后以制表符(也就是"\t")分割字符串为字符串数组 b).proxy_temp = {"http":proxy_host}其中http代表代理的类型,除了http之外还有https,socket等这里就以http为例 c).urllib.urlopen(url,proxies=proxy) 其中proxies就是代理。以代理模式访问目标网址 d).socket.setdefaulttimeout(3)设置全局超时时间为3s,也就是说,如果一个请求3s内还没有响应,就结束访问,并返回timeout(超时) 运行结果如图:
从结果看可用的并不是很多。但是也够个人用了。 至此,IP代理的使用就结束了。
相关文章推荐
- Python 爬虫入门(二)—— IP代理使用
- Python 爬虫入门(二)—— IP代理使用
- Python 爬虫入门(二)—— IP代理使用 - 不剃头的一休哥 - 博客园
- [Python爬虫] 使用urllib2库检测代理ip是否可用,并使用代理提交GET、POST请求
- python3实现网络爬虫(7)-- 使用ip代理抓取网页
- Python3 爬虫使用User Agent和代理IP隐藏身份
- 【Python3.6爬虫学习记录】(十一)使用代理IP及用多线程测试IP可用性--刷访问量
- Python:爬虫使用代理防封IP:HTTP Error 403: Forbidden
- Python 爬虫之使用代理ip
- 鱼c笔记——Python爬虫(三):使用User Agent和代理IP隐藏身份
- 使用python为爬虫获取免费代理ip
- Python3网络爬虫之使用User Agent和代理IP隐藏身份
- Python:爬虫使用代理防封IP:HTTP Error 403: Forbidden
- python爬虫入门(二)——爬取代理IP
- python爬虫之Scrapy 使用代理配置
- Python爬虫入门笔记:urllib库的使用2
- Python爬虫入门三之Urllib库的基本使用
- Python爬虫入门(6):Cookie的使用
- python网络应用入门:网络爬虫的使用
- [python]新手写爬虫v2.5(使用代理的异步爬虫)