文章来源:http://blog.csdn.net/yatere/article/details/6674306
由于经常要使用代理服务器,而网上提供的代理服务器很多都是临时的,一个一个的手动验证费时费力,所以我就想用python3的urllib库来写一个服务器获取、验证工具。
首先,要找一个提供代理服务器的网站,我用的是,这个网站的代理服务器几乎每天都更新,所以效果应该是比较好的。
我的思路是,先打开这个网站的页面,将页面的信息down下来,然后用正则表达式分析,找出其中的代理服务器和端口号,再用
urllib.request.build_opener构造一个使用该代理服务器的opener,然后用这个opener去打开百度的页面,探测获取到
的信息是否正确,如果正确,就说明代理服务器有效,输出代理服务器的IP、端口即可。
- #!/usr/bin/env python
- #coding=utf-8
- import urllib
- import http.cookiejar
- import re
- import socket
- class OpenUrl:
- def __init__(self):
- self.result = ""
-
-
- def openpage(self): # url为相对路径
- try:
- url = ""
- self.result = self.opener.open(url).read().decode("gb2312")
- except urllib.error.HTTPError as ex :
- self.mute.release()
- self.result = "openpage error: %s"%ex
- return False
- except ssl.SSLError as ex:
- self.mute.release()
- self.result = "openage error: %s"%ex
- return False
-
- return self.result.find("京ICP证030173号")
-
-
-
- def getHtmlTdInfo(self, context):
- result = []
- p = re.compile("/d{1,3}/./d{1,3}/./d{1,3}/./d{1,3}[/w|/W]+?
60/">/d{2,4}")
- ret = p.findall(str(context))
-
- if ret is None:
- return None
-
- for x in ret:
- element = []
- q = re.compile("^(/d{1,3}/./d{1,3}/./d{1,3}/./d{1,3})[/w|/W]+?(/d{2,4}){1}quot;)
- subRet = q.search(x);
- if subRet==None:
- continue
- element.append(subRet.group(1))
- element.append(subRet.group(2))
- result.append(element)
- return result
-
-
- def getAgencyIP(self,url=""):
- socket.setdefaulttimeout(20) #20秒内没有打开web页面,就算超时
-
- url="http://5uproxy.net/http_fast.html" #获取最新代理服务器
- self.result = str(urllib.request.urlopen(url).read())
- if self.result==None:
- return
- AgencyIP = self.getHtmlTdInfo(self.result)
- print(len(AgencyIP))
-
- url="http://5uproxy.net/http_anonymous.html" #获取匿名访问代理服务器
- self.result = str(urllib.request.urlopen(url).read())
- if self.result==None:
- return
- AgencyIP += self.getHtmlTdInfo(self.result)
- print(len(AgencyIP))
-
- url="http://5uproxy.net/http_non_anonymous.html" #获取透明访问代理服务器
- self.result = str(urllib.request.urlopen(url).read())
- if self.result==None:
- return
- AgencyIP += self.getHtmlTdInfo(self.result)
- print(len(AgencyIP))
-
- socket.setdefaulttimeout(5) #5内没有打开web页面,就算超时
- if len(AgencyIP)==0:
- print("获取代理服务器失败")
- return
- for x in AgencyIP:
- if x[0]=="":
- continue
- try:
- proxy_support = urllib.request.ProxyHandler({'http':'http://'+str(x[0])+':'+str(x[1])})
- self.opener = urllib.request.build_opener(proxy_support, urllib.request.HTTPHandler)
- urllib.request.install_opener(self.opener)
- if self.openpage()==False:
- x[0] = ""
- x[1] = ""
- continue
- print("有效的代理服务器"+str(x[0])+":"+str(x[1]))
- print("等待2秒")
- time.sleep(2)
- except:
- continue
-
-
- if __name__ == "__main__":
- test = OpenUrl()
- test.getAgencyIP()
阅读(1132) | 评论(0) | 转发(0) |
|