#coding:utf8
import urllib2,sys,re
import threading,os
import time,datetime
'''''
这里没有使用队列 只是采用多线程分发对代理量不大的网页还行但是几百几千性能就很差了
'''
def get_proxy_page(url):
'''''解析代理页面 获取所有代理地址'''
proxy_list = []
p = re.compile(r'''''
(.+?).*?(.+?).+?(.+?)(''')
試してください:
res = urllib2.urlopen(url)
urllib2.URLError を除く:
print 'url Error'
sys.exit(1)
pageinfo = res.read()
res = p.findall(pageinfo) #すべてを取得
# すべてのプロキシ サーバーをルールに準拠するリストに結合します
for i in res:
ip = i [0]
port = i[1]
addr = i[2]
l = (ip,port,addr)
proxy_list.append(l)
return proxy_list
#同期ロック デコレーター
lock = threading.Lock()
def synchronous(f):
def call(*args, **kw):
lock.acquire()
try:
return f(*args, **kw)
finally:
lock.release()
return call
#Time calculator
def sumtime(f):
def call(*args, **kw):
t1 = time.time()
try:
return f(*args, **kw)
finally:
print u'Total所要時間 %s' % (time.time() - t1)
return call
proxylist = []
reslist = []
#単一のプロキシを取得して処理します
@synchronous
def getoneproxy():
グローバル プロキシリスト
if len(proxylist)>0:
return proxylist.pop()
else:
return ''
#Addプロキシが正常に検証されました
@synchronous
def getreslist(proxy):
global reslist
そうでない場合 (reslist 内のプロキシ):
reslist.append(proxy)
def handle() :
timeout = 10
test_url = r'http://www.baidu.com'
test_str = '030173'
while 1:
proxy = getoneproxy()
#最後の戻り値は空です
プロキシでない場合:
return
print u"Verifying: %s" %proxy[0]
#最初のステップは Cookie を有効にすることです
cookies = urllib2.HTTPCookieProcessor ()
proxy_server = r'http://%s:%s' %(proxy[0],proxy[1])
#2 番目のステップは、プロキシ
proxy_hander = urllib2 をロードすることです。 ProxyHandler({ "http":proxy_server})
#3 番目のステップでは、リクエスト
try:
opener = urllib2.build_opener(cookies, proxy_hander)
pass
以外は urllib2.URLError: print u'url 設定エラー'
続行
#Configure request
opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML) 、Gecko のような ) Chrome/21.0.1180.89 Safari/537.1')]
#Send request
urllib2.install_opener(opener)
t1 = time.time()
try:
req = urllib2.urlopen (test_url,timeout=timeout)
result = req.read()
pos = result.find(test_str)
timeused = time.time() - t1
if pos>1 :
#リストに保存
getreslist((proxy[0],proxy[1],proxy[2],timeused))
print u'squiredly completed',proxy[0],timeused
else :
続行
例外を除き、e:
print u'Collection failed %s: timeout' %proxy[0]
続行
def save(reslist):
パス= os .getcwd()
ファイル名 = パス + '/Proxy-'+datetime.datetime.now().strftime(r'%Y%m%d%H%M%S')+'.txt'
f = open(filename,'w+')
reslist のプロキシの場合:
f.write('%s %s %s %s rn'%(proxy[0],proxy[1] ,proxy [2],proxy[3]))
f.close()
@sumtime
def main():
url = r'http://www.free998.net/ daili/ httpdaili/8949.html'
global proxylist,reslist
#すべてのスレッドを取得
proxylist = get_proxy_page(url)
print u'合計 %s プロキシを取得' %len(proxylist)
#print proxylist
print '*'*80
#スレッド作成と配布タスク
print u'スレッド処理の作成を開始....'
threads = []
proxy_num = len (proxylist)
for i in range(proxy_num):
th = threading.Thread(target=handle, args=())
threads.append(th)
for thread inスレッド:
thread.start()
スレッド内のスレッドの場合:
threading.Thread.join(thread)
print u'有効なエージェント %s を取得し、並べ替えと保存を開始します'%len( reslist)
reslist =sorted(reslist,cmp=lambda x,y:cmp(x[3],y[3]))
save(reslist)
if __name__=='__main__':
main()
出力:
合計 31 個のプロキシが取得されました
********************************* *** ***********************************************
スレッド作成処理の開始....
検証中: 122.10.48.13
検証中: 122.72.76.121
検証中: 122.72.11.129
検証中: 222.89.159.131
検証中: 218.5。 74.174
確認中: 218.203.107.165
確認中: 219.224.101.81
確認中: 221.176.169.14
確認中: 112.5.254.85
確認中: 06.73 .210
確認中: 114.247.21.212
検証中: 122.72.76.122
検証中: 219.239.26.23
検証中: 222.89.154.14
検証中: 58.67.147.197
検証中: 22 2.188 .88.26
確認中: 103.247.16.241
確認中: 183.221.250.141
確認中: 183.221.250.137
確認中: 122.72.80.108
確認中: 122.72.76 .125
確認中: 122.72.11.131
確認中: 122.72.80.101
検証中: 122.72.120.41
検証中: 122.72.120.38
検証中: 122.72.120.35
検証中: 218 .203.105.26
検証中: 221.130.18.211
確認中: 110.77.236.48
検証中: 218.91.206.146
検証中: 211.162.16.210
正常に収集されました 114.247.21.21 2 0.300999879837
正常に収集されました 218.203.105.26 99921799
221.176.169.14 0.417000055313
122.72 の収集に成功しました。 120.35 0.369999885559
収集に失敗しました 218.5.74.17 4: タイムアウト
収集に成功しました 122.72.120.38 0.40900015831
収集に成功しました 183.221.250.137 0.6089 99967575
正常に収集されました 122.72.11.131 0.679999828339
正常に収集されました 183.221.250.141 0.791000127792
正常に収集されました 113.106.73.210 0.891000032 425
正常に収集されました 122.72.76.121 1.40299987793
正常に収集されました 122.72.80.108 1.4470000267
正常に収集されました 211.162.16.210 1.625
正常に収集されました 122.72.76.125 1.6819999218
収集されました112.5.254.85 1.74399995804
正常に収集されました 122.72.80.101 1.797999858 86
正常に収集されました 122.72.11.129 2.00900006294
122 が正常に収集されました。 72.120.41 1.99099993706
222.188.88.26 の収集に失敗しました: タイムアウト
122.72 の収集に成功しました.76.122 3.49100017548
正常に収集されました 218.91.206.146 3.66000008583
正常に収集されました 122.10.48.13 3.9179 9998283
正常に収集されました 222.89.154 .14 3.93499994278
収集に成功しました 222.89.159.131 3.99699997902
収集に成功しました 221.130.18.211 3.99500012398
収集失敗 219.224.101.81: タイムアウト 収集失敗 218.203.107.165: タイムアウト
収集失敗 58 .67.147.197: タイムアウト
収集失敗 103.247.16.241: タイムアウト
収集失敗8: タイムアウト
219.239.26.23 12.2809998989
24 個の有効なプロキシを取得しました。並べ替えと保存を開始します
合計時間 13.2810001373