ホームページ  >  記事  >  バックエンド開発  >  プロキシIPを取得するPythonの共有例

プロキシIPを取得するPythonの共有例

不言
不言オリジナル
2018-05-07 14:08:292199ブラウズ

この記事では、Python によるプロキシ IP の取得に関する例の共有を主に紹介します。これは、必要なデータをクロールする必要があるときに、常に共有します。一部の Web サイトでは、同じ IP からの繰り返しの訪問を禁止しています。このとき、「敵」がそれを検出できないように、毎回訪問する前にプロキシ IP を使用して自分自身を偽装する必要があります。

おおおおおおおおおおおおおおおおおおおおおおおお、楽しく始めましょう!

これは、プロキシ IP を取得するためのファイルであり、それらをモジュール化して 3 つの関数に分割しました 注: コードを記述するため、テキスト内にいくつかの英語のコメントが含まれています。 2 つの英単語で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)

1. getIP(url_target): メイン関数の受信パラメータは次のとおりです: プロキシ IP が利用可能であることを確認するための URL。ipchina からプロキシ IP を取得することをお勧めします。 、http://www.xicidaili.com/nn/ Web サイトから入手、無料のプロキシ IP を提供する Web サイトですが、その中のすべての IP を使用できるわけではなく、実際の地理的位置、ネットワークの状態、ターゲットに基づいてアクセスしたサーバーなど、使用できるのは20%未満、少なくとも私の場合はこんな感じです。

通常の方法を使用して http://www.xicidaili.com/nn/ Web サイトにアクセスします。返された Web ページのコンテンツは、通常のクエリを通じて必要な IP と対応するポートを取得します。コードは次のとおりです。正規表現については、他の記事を参照してください:

取得された IP は findIP に保存され、対応するポートはインデックスによって相互に対応します。通常、ページ上で取得される IP の数は 100 です。

次に、IP とポートを結合します

最後に、可用性をチェックします

2. check_one(url_check,i): スレッド関数

今回は、Web ページにアクセスするときに url_check が通常の方法でアクセスされます。これは、プロキシ IP が利用可能であり、現在のインデックス値が記録されていることを意味します。これは、後で利用可能なすべての IP を抽出するために使用されます。

3. mul_thread_check(url_mul_check): マルチスレッド生成

この関数は、プロキシ IP の可用性をチェックするためのマルチスレッドを有効にし、各 IP がチェック用のスレッドを開始します。 このプロジェクトは getIP() を直接呼び出し、可用性の確認に使用される URL を渡します。これにより、可用性が確認された 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))

の形式で返されます関連推奨事項:

Python クローラーキャプチャ プロキシ IP を取得して利用可能かどうかを確認する例

プロキシ IP を収集し、利用可能かどうかを判断し、定期的に更新する Python メソッド

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

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