首頁 >後端開發 >Python教學 >python取得代理IP的實例分享

python取得代理IP的實例分享

不言
不言原創
2018-05-07 14:08:292225瀏覽

這篇文章主要介紹了關於python獲取代理IP的實例分享,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

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

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

這個是取得代理ip的文件,我將它們模組化,分成三個函數

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

#!/usr/bin/python
#-*- coding:utf-8 -*-
"""
author:dasuda
"""
import urllib2
import re
import socket
import threading
findIP = [] #获取的原始IP数据
IP_data = [] #拼接端口后的IP数据
IP_data_checked = [] #检查可用性后的IP数据
findPORT = [] #IP对应的端口
available_table = [] #可用IP的索引
def getIP(url_target):
 patternIP = re.compile(r&#39;(?<=<td>)[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}&#39;)
 patternPORT = re.compile(r&#39;(?<=<td>)[\d]{2,5}(?=</td>)&#39;)
 print "now,start to refresh proxy IP..."
 for page in range(1,4):
  url = &#39;http://www.xicidaili.com/nn/&#39;+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(&#39;get page&#39;, page)
 print "refresh done!!!"
 #use multithreading
 mul_thread_check(url_target)
 return IP_data_checked
def 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(&#39;User-Agent&#39;,"Mozilla/5.0 (Windows NT 10.0; WOW64)")
  html = urllib2.urlopen(request).read()
  lock.acquire()
  print(IP_data[i],&#39;is OK&#39;)
  #get available ip index
  available_table.append(i)
  lock.release()
 except Exception as e:
  lock.acquire()
  print(&#39;error&#39;)
  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 = {&#39;http&#39;: 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&#39;(?<=<td>)[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}&#39;)
patternPORT = re.compile(r&#39;(?<=<td>)[\d]{2,5}(?=</td>)&#39;)
...
findIP = re.findall(patternIP,str(content))
findPORT = re.findall(patternPORT,str(content))

關於如何建構正規表示式,可以參考其他的文章:

取得的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列表,格式為

[&#39;ip1:port1&#39;,&#39;ip2:port2&#39;,....]

相關推薦:

Python爬蟲抓取代理IP並檢驗可用性的實例

Python採集代理ip並判斷是否可用和定時更新的方法

#

以上是python取得代理IP的實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn