この記事では、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'(?<=<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)
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'(?<=<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))
の形式で返されます関連推奨事項:
Python クローラーキャプチャ プロキシ IP を取得して利用可能かどうかを確認する例
プロキシ IP を収集し、利用可能かどうかを判断し、定期的に更新する Python メソッド
以上がプロキシIPを取得するPythonの共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。