python擷取代理IP的執行個體分享

來源:互聯網
上載者:User
這篇文章主要介紹了關於python擷取代理IP的執行個體分享,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

平時當我們需要爬取一些我們需要的資料時,總是有些網站禁止同一IP重複訪問,這時候我們就應該使用代理IP,每次訪問前偽裝自己,讓“敵人”無法察覺。

oooooooooooooooOK,讓我們愉快的開始吧!

這個是擷取代理ip的檔案,我將它們模組化,分為三個函數

註:文中會有些英文注釋,是為了寫代碼方便,畢竟英文一兩個單詞就ok了

#!/usr/bin/python#-*- coding:utf-8 -*-"""author:dasuda"""import urllib2import reimport socketimport threadingfindIP = [] #擷取的原始IP資料IP_data = [] #拼接連接埠後的IP資料IP_data_checked = [] #檢查可用性後的IP資料findPORT = [] #IP對應的連接埠available_table = [] #可用IP的索引def getIP(url_target): patternIP = re.compile(r'(?<=<td>)[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}') patternPORT = re.compile(r'(?<=<td>)[\d]{2,5}(?=</td>)') print "now,start to refresh proxy IP..." for page in range(1,4):  url = 'http://www.xicidaili.com/nn/'+str(page)  headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"}  request = urllib2.Request(url=url, headers=headers)  response = urllib2.urlopen(request)  content = response.read()  findIP = re.findall(patternIP,str(content))  findPORT = re.findall(patternPORT,str(content))  #assemble the ip and port  for i in range(len(findIP)):   findIP[i] = findIP[i] + ":" + findPORT[i]   IP_data.extend(findIP)  print('get page', page) print "refresh done!!!" #use multithreading mul_thread_check(url_target) return IP_data_checkeddef check_one(url_check,i): #get lock lock = threading.Lock() #setting timeout socket.setdefaulttimeout(8) try:  ppp = {"http":IP_data[i]}  proxy_support = urllib2.ProxyHandler(ppp)  openercheck = urllib2.build_opener(proxy_support)  urllib2.install_opener(openercheck)  request = urllib2.Request(url_check)  request.add_header('User-Agent',"Mozilla/5.0 (Windows NT 10.0; WOW64)")  html = urllib2.urlopen(request).read()  lock.acquire()  print(IP_data[i],'is OK')  #get available ip index  available_table.append(i)  lock.release() except Exception as e:  lock.acquire()  print('error')  lock.release()def mul_thread_check(url_mul_check): threads = [] for i in range(len(IP_data)):  #creat thread...  thread = threading.Thread(target=check_one, args=[url_mul_check,i,])  threads.append(thread)  thread.start()  print "new thread start",i for thread in threads:  thread.join() #get the IP_data_checked[] for error_cnt in range(len(available_table)):  aseemble_ip = {'http': IP_data[available_table[error_cnt]]}  IP_data_checked.append(aseemble_ip) print "available proxy ip:",len(available_table)

一、getIP(url_target):主要函數 傳入參數是:驗證代理IP可用性的網址,推薦ipchina

擷取代理IP,從http://www.xicidaili.com/nn/網站擷取,它是一個提供免費代理IP的網站,但是裡面的IP不是全都能用,而且結合你的實際地理位置、網路情況、訪問的目標伺服器等情況,能用的大概不到20%,至少我的情況是這樣。

訪問http://www.xicidaili.com/nn/網站使用正常方式,返回的網頁內容通過正則查詢獲得需要的IP和對應連接埠,代碼如下:

patternIP = re.compile(r'(?<=<td>)[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}')patternPORT = re.compile(r'(?<=<td>)[\d]{2,5}(?=</td>)')...findIP = re.findall(patternIP,str(content))findPORT = re.findall(patternPORT,str(content))

關於如何構造Regex,可以參考其他的文章:

擷取的IP儲存在findIP中,對應的連接埠在findPORT中,兩者按索引對應,擷取一頁IP正常數量為100.

接下來進行IP和連接埠拼接

最後進行可用性檢查

二、check_one(url_check,i):線程函數

本次訪問url_check還是使用正常方式訪問,當訪問網頁有返回時,則說明本代理IP可用,則記錄下當前索引值,用於後面將所有可用IP取出。

三、mul_thread_check(url_mul_check):多線程產生

本函數開啟多線程檢查代理IP可用性,每個IP開啟一個線程進行檢查。

本工程直接調用getIP(),並傳入用於檢查可用性的網址,即可返回一個列表,裡面是經可用性檢查的ip列表,格式為

['ip1:port1','ip2:port2',....]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.