沒有使用隊列 ,也沒有線程池 還在學習 只是多線程
#coding:utf8import urllib2,sys,re import threading,osimport time,datetime'''這裡沒有使用隊列 只是採用多線程分發 對代理量不大的網頁還行 但是幾百幾千效能就很差了'''def get_proxy_page(url): '''解析代理頁面 擷取所有Proxy 位址''' proxy_list = [] p = re.compile(r'''<div>(.+?)<span class="Apple-tab-span" style="white-space:pre">.*?</span>(.+?)<span class="Apple-tab-span" style="white-space:pre">.+?</span>(.+?)(<span.+?)?</div>''') try: res = urllib2.urlopen(url) except urllib2.URLError: print 'url Error' sys.exit(1) pageinfo = res.read() res = p.findall(pageinfo) #取出所有的 #組合成所有Proxy 伺服器列表成一個符合規則的list 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#時間計算機 def sumtime(f): def call(*args, **kw): t1 = time.time() try: return f(*args, **kw) finally: print u'總共用時 %s' % (time.time() - t1) return callproxylist = []reslist = []#擷取單個代理並處理@synchronousdef getoneproxy(): global proxylist if len(proxylist)>0: return proxylist.pop() else: return ''#添加驗證成功的代理 @synchronousdef getreslist(proxy): global reslist if not (proxy in reslist): reslist.append(proxy) def handle(): timeout = 10 test_url = r'http://www.baidu.com' test_str = '030173' while 1: proxy = getoneproxy() #最後一個返回是空 if not proxy: return print u"正在驗證 : %s" %proxy[0] #第一步啟用 cookie cookies = urllib2.HTTPCookieProcessor() proxy_server = r'http://%s:%s' %(proxy[0],proxy[1]) #第二步 裝載代理 proxy_hander = urllib2.ProxyHandler({"http":proxy_server}) #第三步 組合request try: opener = urllib2.build_opener(cookies, proxy_hander) pass except urllib2.URLError: print u'url設定錯誤' continue #配置request opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1')] #發送請求 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'成功採集',proxy[0],timeused else: continue except Exception,e: print u'採集失敗 %s :timeout' %proxy[0] continue def save(reslist): path = os.getcwd() filename = path + '/Proxy-'+datetime.datetime.now().strftime(r'%Y%m%d%H%M%S')+'.txt' f = open(filename,'w+') for proxy in reslist: f.write('%s %s %s %s \r\n'%(proxy[0],proxy[1],proxy[2],proxy[3])) f.close()@sumtimedef 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 threads: thread.start() for thread in threads: 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
正在驗證 : 113.106.73.210
正在驗證 : 114.247.21.212
正在驗證 : 122.72.76.122
正在驗證 : 219.239.26.23
正在驗證 : 222.89.154.14
正在驗證 : 58.67.147.197
正在驗證 : 222.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.212 0.300999879837
成功採集 218.203.105.26 0.306999921799
成功採集 221.176.169.14 0.417000055313
成功採集 122.72.120.35 0.369999885559
採集失敗 218.5.74.174 :timeout
成功採集 122.72.120.38 0.40900015831
成功採集 183.221.250.137 0.608999967575
成功採集 122.72.11.131 0.679999828339
成功採集 183.221.250.141 0.791000127792
成功採集 113.106.73.210 0.891000032425
成功採集 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.79799985886
成功採集 122.72.11.129 2.00900006294
成功採集 122.72.120.41 1.99099993706
採集失敗 222.188.88.26 :timeout
成功採集 122.72.76.122 3.49100017548
成功採集 218.91.206.146 3.66000008583
成功採集 122.10.48.13 3.91799998283
成功採集 222.89.154.14 3.93499994278
成功採集 222.89.159.131 3.99699997902
成功採集 221.130.18.211 3.99500012398
採集失敗 219.224.101.81 :timeout採集失敗 218.203.107.165 :timeout
採集失敗 58.67.147.197 :timeout
採集失敗 103.247.16.241 :timeout
採集失敗 110.77.236.48 :timeout
成功採集 219.239.26.23 12.2809998989
擷取有效代理 24 個,現在開始排序和儲存
總共用時 13.2810001373