#!/usr/bin/evn python

# -*- coding:utf-8 -*-

import urllib2

import urllib

import re

from HTMLParser import HTMLParser

 

# 代理信息实体

class ProxyObj:

proxyAddress="" #代理服务器地址

proxyPort=0 #代理服务器端口

proxyHttp="http" # 代理服务器的协议

 

#解析html的类

class MyHhtml(HTMLParser):

proxDir=[];

proxyobj=ProxyObj();

tagExit=False;

def handle_starttag(self, tag, attrs):

#抓取固定标签数据

if tag == "tr":

self.tagExit=True

self.proxyobj = ProxyObj();

def handle_data(self, data):

HTMLParser.handle_data(self,data)

if self.tagExit:

ipPn=re.compile("(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})")

portPn = re.compile("\d{4,6}")

httpPn = re.compile("https|http|HTTPS|HTTP")

data=data.replace("\n","")

if type(data) is str and len(data)>0:

#print("ip:" + data)

tempdata=data;

data = ipPn.search(tempdata)

# ip

if data is not None:

self.proxyobj.proxyAddress=str(data.group())

#端口

data = portPn.search(tempdata)

if data is not None:

if self.proxyobj.proxyPort==0:

self.proxyobj.proxyPort=int((data.group()))

# 使用协议

data = httpPn.search(tempdata)

if data is not None:

self.proxyobj.proxyHttp=str(data.group())

def handle_endtag(self, tag):

HTMLParser.handle_endtag(self,tag)

if tag=="tr":

if len(self.proxyobj.proxyAddress)>0:

self.proxDir.append(self.proxyobj)

self.tagExit=False

 

 

 

 

headers={"Accept":" */*",

"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

}

 

url="http://www.ip3366.net/?stype=1";

for i in range(1,11):

url=url+"&page="+str(i);

#分页捉取代理网页数据

request = urllib2.Request(url=url, headers=headers);

response = urllib2.urlopen(request);

htmlcontent = response.read();

myhtml = MyHhtml()

#处理响应数据

myhtml.feed(htmlcontent);

 

 

print("从网站上抓取到的代理服务器信息为有"+str(len(myhtml.proxDir))+"个数据");

print("----------------------------进入代理测试程序------------------------")

enableProxy=[];

disableProxy=[];

def proxyTest(proxDir):

if type(proxDir) is list:

if len(proxDir)>0:

for obj in proxDir:

test_url="http://www.baidu.com"

test_str={""+obj.proxyHttp+"":""+obj.proxyAddress+":"+str(obj.proxyPort)+""}

#使用代理创建一个测试的handler

proxy_handler=urllib2.ProxyHandler(test_str);

# 构造代理opener

opener=urllib2.build_opener(proxy_handler);

#构造测试的Request

request=urllib2.Request(url=test_url,headers=headers);

#设置测试超时时间

response=opener.open(request,timeout=10);

if response.getcode() != 200:

print(str(test_str)+"不可用!")

disableProxy.append(obj)

else:

enableProxy.append(obj)

print(str(test_str) + "可用!")

else:

print("暂无可用的代理信息")

else:

print("输入的不是List")

 

proxyTest(myhtml.proxDir);

print("----------------------------代理测试程序完毕------------------------")

print("爬虫抓取到的Proxy个数为:"+str(len(myhtml.proxDir)))

print("Proxy可用个数为:"+str(len(enableProxy)))

print("Proxy不可用个数为:"+str(len(disableProxy)))

#关闭html的解析器

myhtml.close()

 

     解析的过程中是使用的比较low 的dom操作和xpath。练手的!!!!!!!!!

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐