黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

python掃描proxy并獲取可用代理ip的實(shí)例

系統(tǒng) 1953 0

今天咱寫一個(gè)挺實(shí)用的工具,就是掃描并獲取可用的proxy

首先呢,我先百度找了一個(gè)網(wǎng)站:http://www.xicidaili.com 作為例子

這個(gè)網(wǎng)站里公布了許多的國內(nèi)外可用的代理的ip和端口

我們還是按照老樣子進(jìn)行分析,就先把所有國內(nèi)的proxy掃一遍吧

點(diǎn)開國內(nèi)部分進(jìn)行審查發(fā)現(xiàn),國內(nèi)proxy和目錄為以下url:

http://www.xicidaili.com/nn/x

這個(gè)x差不多兩千多頁,那么看來又要線程處理了。。。

老樣子,我們嘗試是否能直接以最簡(jiǎn)單的requests.get()獲取內(nèi)容

返回503,那么我們加一個(gè)簡(jiǎn)單的headers

返回200,成咯

好了我們先進(jìn)行網(wǎng)頁內(nèi)容分析并獲取想要的內(nèi)容

我們發(fā)現(xiàn),包含ip信息的內(nèi)容在標(biāo)簽內(nèi),于是我們就能很方便的用bs進(jìn)行獲取標(biāo)簽內(nèi)容

但是我們隨之又發(fā)現(xiàn),ip、端口、協(xié)議的內(nèi)容分別在提取的標(biāo)簽的第2,3,6三個(gè)標(biāo)簽內(nèi)

于是我們開始嘗試編寫,一下為編寫思路:

  處理頁面的時(shí)候,是先提取tr標(biāo)簽,再將tr標(biāo)簽中的td標(biāo)簽提取

  所以運(yùn)用了兩次bs操作,并且第二次使用bs操作時(shí)需要進(jìn)行str處理

  因?yàn)槲覀儷@得tr之后,我們需要其中的2,3,6號(hào)的東西,

  但是當(dāng)我們用一個(gè)for循環(huán)輸出的i并不能進(jìn)行組的操作

  所以我們干脆分別對(duì)每一個(gè)td的soup進(jìn)行第二次操作之后直接提取2,3,6

  提取之后,直接加上.string提取內(nèi)容即可

            
r = requests.get(url = url,headers = headers)

 soup = bs(r.content,"html.parser")
 data = soup.find_all(name = 'tr',attrs = {'class':re.compile('|[^odd]')})

 for i in data:

  soup = bs(str(i),'html.parser')
  data2 = soup.find_all(name = 'td')
  ip = str(data2[1].string)
  port = str(data2[2].string)
  types = str(data2[5].string).lower() 

  proxy = {}
  proxy[types] = '%s:%s'%(ip,port)
          

這樣,我們每次循環(huán)都能生成對(duì)應(yīng)的proxy字典,以便我們接下來驗(yàn)證ip可用性所使用

字典這兒有個(gè)注意點(diǎn),我們有一個(gè)將types變?yōu)樾懙牟僮鳎驗(yàn)樵趃et方法中的proxies中寫入的協(xié)議名稱應(yīng)為小寫,而網(wǎng)頁抓取的是大寫的內(nèi)容,所以進(jìn)行了一個(gè)大小寫轉(zhuǎn)換

那么驗(yàn)證ip可用性的思路呢

很簡(jiǎn)單,我們使用get,加上我們的代理,請(qǐng)求網(wǎng)站:

http://1212.ip138.com/ic.asp

這是一個(gè)神奇的網(wǎng)站,能返回你的外網(wǎng)ip是什么

            
url = 'http://1212.ip138.com/ic.asp'
r = requests.get(url = url,proxies = proxy,timeout = 6)
          

這里我們需要加上timeout去除掉那些等待時(shí)間過長的代理,我設(shè)置為6秒

我們以一個(gè)ip進(jìn)行嘗試,并且分析返回的頁面

返回的內(nèi)容如下:

            
            
               您的IP地址 
            
            
您的IP是:[xxx.xxx.xxx.xxx] 來自:xxxxxxxx

那么我們只需要提取出網(wǎng)頁內(nèi)[]的內(nèi)容即可

如果我們的代理可用,就會(huì)返回代理的ip

(這里會(huì)出現(xiàn)返回的地址還是我們本機(jī)的外網(wǎng)ip的情況,雖然我也不是很清楚,但是我把這種情況排除,應(yīng)該還是代理不可用)

那么我們就能進(jìn)行一個(gè)判斷,如果返回的ip和proxy字典中的ip相同,則認(rèn)為這個(gè)ip是可用的代理,并將其寫入文件

我們的思路就是這樣,最后進(jìn)行queue和threading線程的處理即可

上代碼:

            
#coding=utf-8

import requests
import re
from bs4 import BeautifulSoup as bs
import Queue
import threading 

class proxyPick(threading.Thread):
 def __init__(self,queue):
  threading.Thread.__init__(self)
  self._queue = queue

 def run(self):
  while not self._queue.empty():
   url = self._queue.get()

   proxy_spider(url)

def proxy_spider(url):
 headers = {
   .......
  }

 r = requests.get(url = url,headers = headers)
 soup = bs(r.content,"html.parser")
 data = soup.find_all(name = 'tr',attrs = {'class':re.compile('|[^odd]')})

 for i in data:

  soup = bs(str(i),'html.parser')
  data2 = soup.find_all(name = 'td')
  ip = str(data2[1].string)
  port = str(data2[2].string)
  types = str(data2[5].string).lower() 


  proxy = {}
  proxy[types] = '%s:%s'%(ip,port)
  try:
   proxy_check(proxy,ip)
  except Exception,e:
   print e
   pass

def proxy_check(proxy,ip):
 url = 'http://1212.ip138.com/ic.asp'
 r = requests.get(url = url,proxies = proxy,timeout = 6)

 f = open('E:/url/ip_proxy.txt','a+')

 soup = bs(r.text,'html.parser')
 data = soup.find_all(name = 'center')
 for i in data:
  a = re.findall(r'\[(.*?)\]',i.string)
  if a[0] == ip:
   #print proxy
   f.write('%s'%proxy+'\n')
   print 'write down'
   
 f.close()

#proxy_spider()

def main():
 queue = Queue.Queue()
 for i in range(1,2288):
  queue.put('http://www.xicidaili.com/nn/'+str(i))

 threads = []
 thread_count = 10

 for i in range(thread_count):
  spider = proxyPick(queue)
  threads.append(spider)

 for i in threads:
  i.start()

 for i in threads:
  i.join()

 print "It's down,sir!"

if __name__ == '__main__':
 main()
          

這樣我們就能把網(wǎng)站上所提供的能用的代理ip全部寫入文件ip_proxy.txt文件中了

以上這篇python掃描proxy并獲取可用代理ip的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論