[python]ゼロから自分の爬虫類エージェントIPプールを構築する

3822 ワード

ProxyIPPool
ゼロから自分のエージェントIPプールを構築する.エージェントIPサイトに基づいて新しいエージェントIPをキャプチャする.履歴エージェントIPの有効性の検証
ソース:https://github.com/TOMO-CAT/ProxyIPPool
なぜプロキシIPを使うのか
爬虫類の過程では、多くのサイトが反爬虫技術を採用しており、その中で最もよく使われているのはIPのアクセス回数を制限することです.ローカルのIPアドレスがこのサイトに閉鎖されると、エージェントを変えて虫登りする必要があるかもしれません.その中には多くのサイトが無料のエージェントIP(www.xicidaili.comなど)を提供しています.私たちがしなければならないのは、エージェントサイトからエージェントIPをキャプチャし、エージェントIPの有効性をテストした後、適切なエージェントIPをデータベーステーブルに追加して、私たちの爬虫類のエージェントIPプールとして使用することです.
開発構想
1、ローカルIPで第一ロットの起動代理IPを掴む
エージェントIPサイトからエージェントIPをキャプチャするプロセス自体が爬虫類であり、短時間で要求回数が多すぎるとサイトにアクセスが禁止されるため、ローカルIPを利用して最初のエージェントIPをキャプチャし、エージェントIPを使用して新しいエージェントIPをキャプチャする必要があります.
2、第一ロット起動した代理IPに対して有効性を検証した後、データベースに保存する
私たちはデータベースIPにいます.dbは2つのテーブルを構築しました:proxy_ip_table(すべてのキャプチャされたIPを格納し、キャプチャIP機能が正常かどうかを確認するために使用される)とvalidation_ip_table(IP有効性を表示するために検証されたすべてのIPを格納する)第1ステップで取得したエージェントIPは、検証された後にvalidation_に格納される.ip_table、検査の実現は以下の通りである.
def ip_validation(self, ip):
    #      :    ip        ip
    anonymity_flag = False
    if "  " in str(ip):
        anonymity_flag = True

    IP = str(ip[0]) + ":" + str(ip[1]);IP
    url = "http://httpbin.org/get" ##    IP     
    proxies = { "https" : "https://" + IP}   #     https   http     
    headers = FakeHeaders().random_headers_for_validation()

    #      
    validation_flag = True
    response = None

    try:
        response = requests.get(url = url, headers = headers, proxies = proxies, timeout = 5)
    except:
        validation_flag = False
    if response is None :
        validation_flag = False
        
    if anonymity_flag and validation_flag:
        return True
    else:
        return False

3、アクセスするウェブサイトのリストを構築し、繰り返しキャプチャし、毎回キャプチャするip_List経験書後にデータベーステーブルに格納
アクセス先のURLリストを構築しました(暫定100個で走りやすい):
self.URLs = [ "https://www.xicidaili.com/nn/%d" % (index + 1) for index in range(100)] 

含まれるモジュール
1、RandomHeaders.py
異なるWebブラウザをシミュレートするためのランダム・リクエスト・ヘッダを構築します.呼び出し方法:
from RandomHeaders import FakeHeaders
#    xici        
xici_headers = FakeHeaders().random_headers_for_xici

2、DatabaseTable.py
データベースの作成テーブルと削除機能、呼び出し方法を提供します.
from DatabaseTable import IPPool
tablename = "proxy_ip_table"
#tablename    validation_ip_table
IPPool(tablename).create() #   
IPPool(tablename).select(random_flag = False)
# random_flag = True         ,        
IPPool(table_name).delete(delete_all = True) #      

3、GetProxyIP.py
コアコードには、いくつかの関数があります.
  • は、0からテーブルの作成、IPのキャプチャ、データベースへの格納機能
  • を完了する.
    from GetProxyIP import Carwl
    Crawl().original_run()
    
  • エージェントIP個数が足りない場合url_によるとListリストをキャプチャし、適切なIPをリスト
  • に格納する.
    from GetProxyIP import Carwl
    #      IP   
    url_kuaidaili = ["https://www.kuaidaili.com/free/inha/%d" % (index + 1) for index in range(10,20)]
    Crawl().get_more_run(url_list)
    
  • IPプールが長い間使われていない場合、IPの有効性を検証する必要があり、要求に合わないIPは
  • を削除する必要がある.
    from GetProxyIP import Carwl
    Crawl().proxy_ip_validation()
    

    問題&改善
  • エージェントIPサイトからエージェントIPをキャプチャすることは本質的に爬虫類であり、エージェントIPサイトにも逆爬メカニズムが設けられており、xiciが4000個のエージェントIPを取得する程度でIPが閉鎖され、エージェントを使用してエージェントIPを取得する必要がある.
  • はネット上の経験とは異なり、xiciネットの上位100ページのエージェントIPの利用率は比較的高く、基本的に9割ある.しかし、「有効なエージェントIPを検証しても使えるとは限らない」と「1回目の検証で無効になったエージェントIPは後で使えるかもしれない」という問題があるかもしれませんが、これも私がエージェントIPと有効なエージェントIPをそれぞれ2枚のテーブルに格納した理由です.
  • エージェントIPを使用する場合、httpとhttpを構築すると、まったく異なる結果になる可能性があります.同様に、ターゲットurlをhttpまたはhttpと書くと、プログラムが正常に動作し、エラーが発生する可能性があります.しばらく原因が分かりません.
  • は、プログラムがネットワークを使用しているため、ループ回数が多い.そこでcontinueジャンプループを何度も使用しましたが、有効なエージェントIPを取得することは成功率が高いです.
  • で10000個のエージェントIPを取得するには基本的に5時間かかりますが、本当に遅すぎます.その後、プログラムを改善すればマルチスレッドを試みる可能性があります.