最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python獲取代理IP的實(shí)例分享

 更新時間:2018年05月07日 09:53:02   作者:HelloHaibo  
今天小編就為大家分享一篇python獲取代理IP的實(shí)例分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

平時當(dāng)我們需要爬取一些我們需要的數(shù)據(jù)時,總是有些網(wǎng)站禁止同一IP重復(fù)訪問,這時候我們就應(yīng)該使用代理IP,每次訪問前偽裝自己,讓“敵人”無法察覺。

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

這個是獲取代理ip的文件,我將它們模塊化,分為三個函數(shù)

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

#!/usr/bin/python
#-*- coding:utf-8 -*-
"""
author:dasuda
"""
import urllib2
import re
import socket
import threading
findIP = [] #獲取的原始IP數(shù)據(jù)
IP_data = [] #拼接端口后的IP數(shù)據(jù)
IP_data_checked = [] #檢查可用性后的IP數(shù)據(jù)
findPORT = [] #IP對應(yīng)的端口
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_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('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):主要函數(shù) 傳入?yún)?shù)是:驗(yàn)證代理IP可用性的網(wǎng)址,推薦ipchina

獲取代理IP,從http://www.xicidaili.com/nn/網(wǎng)站獲取,它是一個提供免費(fèi)代理IP的網(wǎng)站,但是里面的IP不是全都能用,而且結(jié)合你的實(shí)際地理位置、網(wǎng)絡(luò)情況、訪問的目標(biāo)服務(wù)器等情況,能用的大概不到20%,至少我的情況是這樣。

訪問http://www.xicidaili.com/nn/網(wǎng)站使用正常方式,返回的網(wǎng)頁內(nèi)容通過正則查詢獲得需要的IP和對應(yīng)端口,代碼如下:

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))

關(guān)于如何構(gòu)造正則表達(dá)式,可以參考其他的文章:

獲取的IP保存在findIP中,對應(yīng)的端口在findPORT中,兩者按索引對應(yīng),獲取一頁IP正常數(shù)量為100.

接下來進(jìn)行IP和端口拼接

最后進(jìn)行可用性檢查

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

本次訪問url_check還是使用正常方式訪問,當(dāng)訪問網(wǎng)頁有返回時,則說明本代理IP可用,則記錄下當(dāng)前索引值,用于后面將所有可用IP取出。

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

本函數(shù)開啟多線程檢查代理IP可用性,每個IP開啟一個線程進(jìn)行檢查。

本工程直接調(diào)用getIP(),并傳入用于檢查可用性的網(wǎng)址,即可返回一個列表,里面是經(jīng)可用性檢查的ip列表,格式為

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

以上這篇python獲取代理IP的實(shí)例分享就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

阳泉市| 常熟市| 潮安县| 和龙市| 黎城县| 砀山县| 无锡市| 虎林市| 石狮市| 恩平市| 会东县| 通山县| 慈利县| 炎陵县| 西平县| 陵川县| 临夏市| 柳州市| 寿光市| 中阳县| 稻城县| 嘉禾县| 湟源县| 临海市| 峨边| 东方市| 信阳市| 库尔勒市| 中阳县| 调兵山市| 聂荣县| 乐安县| 平顺县| 鄂托克旗| 禹城市| 静宁县| 黑龙江省| 繁昌县| 芜湖县| 互助| 沿河|