ホームページ  >  記事  >  バックエンド開発  >  Python スキャン プロキシと利用可能なプロキシ IP を取得する方法の共有例

Python スキャン プロキシと利用可能なプロキシ IP を取得する方法の共有例

黄舟
黄舟オリジナル
2017-08-07 15:36:291650ブラウズ

次のエディターは、Python でプロキシをスキャンし、利用可能なプロキシ IP を取得する例を示します。編集者はこれがとても良いと思ったので、参考として共有します。編集者をフォローして見てみましょう

今日は、利用可能なプロキシをスキャンして取得する非常に実用的なツールを書きます

まず、Baidu で Web サイトを見つけました: www.xicidaili.com例

この Web サイトは、国内外で利用可能なプロキシの IP とポートを多数公開しています

いつものように分析します。まず国内のプロキシをすべてスキャンしましょう

国内の部分をクリックして確認し、国内のプロキシを見つけます。ディレクトリは次のとおりです。次の URL:

www.xicidaili.com/nn/x

この x には 2,000 ページ近いページがあるため、再度スレッド処理が必要と思われます。 。 。

いつものように、最も単純なrequests.get()でコンテンツを直接取得できるかどうかを試します

503を返してから、単純なヘッダーを追加します

200を返してOK

さて、Webページを分析しましょうまずコンテンツを選択して、必要なコンテンツを取得します

IP 情報を含むコンテンツが bebe940a45af741bb414162ac8391d01 タグの 2 番目、3 番目、および 6 番目の b6c5a531a458a2e790c1fd6421739d1c タグにあります。そのため、次のように記述します。 page では、最初に tr タグが抽出され、次に tr タグ内の td タグが抽出されます

つまり、 bs 演算が 2 回使用され、2 回目の bs 演算を使用するときに str の処理が必要になります なぜなら、tr を取得した後だからです。 、その 2、3、6 のいずれかが必要ですしかし、for ループによって出力された i を使用する場合、グループ操作を実行することはできません

そのため、単純に各 td のスープに対して 2 番目の操作を実行し、直接extract 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)

このようにして、ループするたびに対応するプロキシ辞書を生成できるので、それを使用して検証することができますIP の可用性

辞書はここにあります 1 つの注意点として、get メソッドのプロキシに書かれたプロトコル名は小文字である必要があり、Web ページは大文字のコンテンツをキャプチャするため、型を小文字に変更する操作があることに注意してください。が実行されます

では、IP の可用性を確認するというアイデアは何ですか


それは非常に簡単です。get とプロキシを使用して Web サイトをリクエストします:

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

これは魔法の Web サイトです。戻ることができる外部 IP は何ですか

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

ここでは、待ち時間が長すぎるプロキシを削除するためにタイムアウトを追加する必要があります。私はそれを 6 秒に設定しました

IP を取得して返されたものを分析する ページ

によって返されるコンテンツは次のとおりです:

<html>

<head>

<meta xxxxxxxxxxxxxxxxxx>

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

</head>

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

次に、Web ページの [] のコンテンツを抽出するだけで済みます

プロキシが利用可能な場合は、プロキシの IP

が返されます (ここに表示されます。返されたアドレスは依然としてマシンの外部 IP です。よくわかりませんが、この状況は除外しました。プロキシが使用できないはずです)


その後返された IP とプロキシ ディクショナリ内の IP が同じである場合、この IP は利用可能なプロキシであると見なされ、ファイルに書き込まれます。これが私たちの考えです。上記のコード:

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

このようにして、Web サイトで提供されているすべての利用可能なプロキシ IP をファイル ip_proxy.txt に書き込むことができます

以上がPython スキャン プロキシと利用可能なプロキシ IP を取得する方法の共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。