Python爬虫捉取数据(代理网站)
#!/usr/bin/evn python# -*- coding:utf-8 -*-import urllib2import urllibimport refrom HTMLParser import HTMLParser # 代理信息实体class ProxyObj:proxyAddress="" #代理服务器地址proxyPort=0 #代理服务器端口...
#!/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。练手的!!!!!!!!!
更多推荐
所有评论(0)