首頁  >  文章  >  後端開發  >  python掃描proxy並且如何取得可用代理ip的範例分享

python掃描proxy並且如何取得可用代理ip的範例分享

黄舟
黄舟原創
2017-08-07 15:36:291650瀏覽

下面小編就為大家帶來一篇python掃描proxy並取得可用代理ip的實例。小編覺得蠻不錯的,現在就分享給大家,也給大家做個參考。一起跟著小編過來看看吧

今天咱寫一個挺實用的工具,就是掃描並取得可用的proxy

##首先呢,我先百度找了一個網站:www.xicidaili.com 作為例子

這個網站裡公佈了許多的國內外可用的代理的ip和端口

我們還是按照老樣子進行分析,就先把所有國內的proxy掃一遍

點開國內部分進行審查發現,國內proxy和目錄為以下url:

www.xicidaili.com/nn/x

這個x差不多兩千多頁,那麼看來又要線程處理了。 。 。

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

#返回503,那麼我們加一個簡單的headers

返回200,成咯

好了我們先進行網頁內容分析並取得想要的內容

我們發現,包含ip資訊的內容在a34de1251f0d9fe1e645927f19a896e8標籤內,於是我們就能很方便的用bs進行獲取標籤內容

但是我們隨之又發現,ip、端口、協議的內容分別在提取的a34de1251f0d9fe1e645927f19a896e8標籤的第2,3,6三個b6c5a531a458a2e790c1fd6421739d1c標籤內

於是我們開始嘗試寫,一下為寫想法:

  處理頁面的時候,是先提取tr標籤,再將tr標籤中的td標籤提取

  所以運用了兩次bs操作,並且第二次使用bs操作時需要進行str處理

  因為我們獲得tr之後,我們需要其中的2, 3,6號的東西,

  但是當我們用一個for循環輸出的i並不能進行組的操作

  所以我們乾脆分別對每一個td的soup進行第二次操作之後直接提取2,3,6

  提取之後,直接加上.string提取內容即可


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)

這樣,我們每次循環都能產生對應的proxy字典,以便我們接下來驗證ip可用性所使用

字典這兒有個注意點,我們有一個將types變成小寫的操作,因為在get方法中的proxies中寫入的協定名稱要小寫,而網頁抓取的是大寫的內容,所以進行了一個大小寫轉換

那麼驗證ip可用性的思路呢

很簡單,我們使用get,加上我們的代理,請求網站:

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

這是一個神奇的網站,能返回你的外網ip是什麼



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

這裡我們需要加上timeout去除掉那些等待時間過長的代理,我設定為6秒

我們以一個ip進行嘗試,並且分析返回的頁面

返回的內容如下:


#

<html>

<head>

<meta xxxxxxxxxxxxxxxxxx>

<title> 您的IP地址 </title>

</head>

<body style="margin:0px"><center>您的IP是:[xxx.xxx.xxx.xxx] 来自:xxxxxxxx</center></body></html>

那麼我們只需要提取網頁內[]的內容即可

如果我們的代理可用,就會回傳代理的ip

(這裡會出現回傳的位址還是我們本機的外網ip的情況,雖然我也不是很清楚,但是我把這種情況排除,應該還是代理不可用)

那麼我們就能進行一個判斷,如果返回的ip和proxy字典中的ip相同,則認為這個ip是可用的代理,並將其寫入文件

我們的思路就是這樣,最後進行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 = &#39;tr&#39;,attrs = {&#39;class&#39;:re.compile(&#39;|[^odd]&#39;)})

 for i in data:

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


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

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

 f = open(&#39;E:/url/ip_proxy.txt&#39;,&#39;a+&#39;)

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

#proxy_spider()

def main():
 queue = Queue.Queue()
 for i in range(1,2288):
  queue.put(&#39;http://www.xicidaili.com/nn/&#39;+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&#39;s down,sir!"

if __name__ == &#39;__main__&#39;:
 main()

這樣我們就能把網站上所提供的能用的代理ip全部寫入檔案ip_proxy.txt檔案中了

以上是python掃描proxy並且如何取得可用代理ip的範例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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