Python爬蟲捉取資料(代理網站)
#!/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。練手的!!!!!!!!!