1. 程式人生 > >Python爬蟲捉取資料(代理網站)

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。練手的!!!!!!!!!