Pythonのネットワークワーム

17822 ワード

文書ディレクトリ
  • 一、tesseractを使用してOCR検証コード識別
  • を行う
  • 二、プロキシサーバ設定
  • 三、逆行と逆行防止
  • 四、ページをキャプチャする関数
  • をカプセル化する
    一、tesseractを使用してOCR検証コード識別を行う
    1、cookie、sessionの役割ユーザーはかつてこのウェブサイトにアクセスしたことがあり、私たちはHTTPプロトコルの外でいくつかの追加の情報と技術を使ってこのユーザーがかつて来たことを識別する必要があります.だから私たちの爬虫類プログラムはこの抜け穴を巧みに利用してログインして情報を得る効果を達成することができます.
    2、tesseract pip install pytesseractのインストール
    3、tesseract 1)from pytesseract import*2)をテストし、captchaTest.pyプログラムには検証コードの画像3)がノイズを除去し、検証コードの色を見つける.4)背景色と前景色の区別;5)各文字を抽出する.6)コサイン類似度を用いる2文字間の類似度を算出する.https:L/blog.csdn. net/whi terbear/article/details . 7)現在の文字の最大確率が一致するサンプルセットの文字を得る
    4、検証コードに注意するという関系は机械の学习に関する内容で、中の水はとても深いので、検証コードを処理する时に必ず时間コストを考えなければなりません.画像認識技術が検証コードという関門を本当に決められない場合は、打コードプラットフォームを選択しても解決できないので、手動で入力するしかありません.
    5、打コードプラットフォームの運営方式1)まず打コードプラットフォームにアカウントを登録し、合法的なKey、IDなどの情報を取得する.2)これらのKey,IDを用いて相手のAPIを調整する:ファイルをバイトストリームに読み出し、Base 64のトランスコードを1回行い、APIインタフェースを調整し、結果を返す;3))結果まで、次のステップ操作を行う;エラーが発生した場合は、返された結果に基づいて、エラーが発生した場合を判断します.
    二、代理サーバーの設定
    1、プロキシサーバー:他人の手でアクセスを完了し、自分のipアドレスを偽装し、爬虫類がサーバーに悪意のあるアクセスを発見されない
    2、プロキシサーバーIPの設定:コントロールパネルを開くインターネットオプション、ポイント接続、設定、プロキシサーバー、対応するアドレスとポート番号(port)を入力する
    3、IPとMACアドレスの違いHTTPパケットは伝達過程において、ソースアドレスとターゲットアドレスは変わらない.IPアドレスを記入し、発注過程で各ルータがMACアドレスを使用し、異なるルータには異なる物理アドレス、すなわちMACアドレスがあるため、このMACアドレスは絶えず変化している.
    4、プロキシサーバーの使用方法
    #           :ProxyHandler          
    import urllib.request
    
    def use_http_proxy(proxy_addr, url):
        #         handler
        proxyH = urllib.request.ProxyHandler({"https":proxy_addr})
        #    Http  opener
        opener = urllib.request.build_opener(proxyH,
                                    urllib.request.HTTPHandler)
        #       opener      urllib 
        urllib.request.install_opener(opener)
        #   Http  :     6 (  6        )
        res = urllib.request.urlopen(url,timeout=6)
        #     
        data = res.read().decode("utf-8")
        return data
    
    if __name__ == "__main__":
        proxy_addr = "114.224.223.164:9999"  #      
        data = use_http_proxy(proxy_addr, "https://www.sina.com.cn/")
        print(data)
    

    三、逆登りと逆登り防止
    1、サイトで爬虫類を発見する方法
  • 単一IPの異常なアクセス頻度;
  • 単一IP非常規のデータ流量;
  • 簡単なウェブサイトの閲覧行為を大量に繰り返し、ウェブページだけをダウンロードし、後続のJS、CSS要求がない.
  • は、いくつかのトラップによって爬虫類を発見し、例えばCSSによってユーザに隠されたリンクによっては、爬虫類のみがアクセスする.

  • 2、ウェブサイトは一般的にどのように反爬虫類を行います
  • ダイナミックWebページを大量に使用すると、はい、爬虫類の爬虫類の爬虫類の難易度が増加し、重要なデータが得られなくなり、爬虫類がWeb環境でレンダリング(ブラウザ内蔵)されても、爬虫類の負担と爬虫類の時間が大幅に増加します.(ダイナミック・ロード・テクノロジーを採用すると、サーバへの負担も大幅に軽減されます).
  • トラフィックの拒否に基づいて、帯域幅制限モジュールを開き、IPあたりの最大接続数、最大帯域幅などを制限する.

  • 3、どうやって自分が逆さまに這われていることに気づいたのか
  • 頻繁検証コードの出現
  • Unusual content delivery delay非常に規則的な遅延.
  • Freguent response with HTTP 403,404, 301 or 50x error

  • 4、アンチスキップ対策1)User-Agentプール2)エージェントサーバプール3)CookieJarなどの管理4)プロトコルの詳細を考慮し、例えば:多くの実践経験をまとめる必要がある.データをキャプチャする際にCSS,JSなど,nofollow属性,cssのdisplay属性,プローブトラップ検証refer locatorなどを処理しない.5)分布式のマルチマシン戦略を使用して、ゆっくり登って、爬虫類を頻繁にアクセスするメインステーションのIPサブネットの下に置いて、例えば教育網;6)ルールを用いて一括して這い出すには,ルールを組み合わせる必要がある7)検証コードの処理:機械学習,画像認識8)できるだけRobotsプロトコルを遵守する
    四、ページをキャプチャする関数をカプセル化する
    以下は完全なコードで、それぞれの場所についての詳細な説明はコメントにあります.
    
    #     
    import logging
    import sys
    import random
    from urllib import request
    from urllib import error
    from urllib import parse
    import time
    
    #      
    #   logger   
    logger = logging.getLogger("testLogger")
    #   logger     
    formatter = logging.Formatter('%(asctime)s \t  %(levelname)s \t %(message)s')
    #   ,      
    file_handler = logging.FileHandler("testLogger2.log")
    #                 
    file_handler.setFormatter(formatter)
    console_handler = logging.StreamHandler(sys.stdout)
    #              
    console_handler.setFormatter(formatter)
    #          :INFO  DEBUG
    logger.setLevel(logging.DEBUG)
    #      、    ,   logger     
    logger.addHandler(file_handler)
    logger.addHandler(console_handler)
    
    #             
    minRangeForProxy = 1
    maxRangeForProxy = 10
    minSleepTime = 1
    maxSleepTime = 3
    
    #           
    def downloadHtml(url, headers=[],
                     proxy={}, useProxyRate=0,
                     timeout=None, decodeInfo="utf-8",
                     num_retries=5):
        """
                     
        :param url:    
        :param headers:   ,  User-Agent,Cookie,Host,Connection
        :param proxy:         
        :param timeout:    ,       
        :param decodeInfo:       
        :param num_retries:    ,       
        :return:             ,   400+       ,   500+      downloadHtml  
        """
        #             : useProxyRate==0,           
        if random.randint(minRangeForProxy,
                          maxRangeForProxy) >= useProxyRate:
            proxy = None  #           
            print("No using proxy!")
    
        #   proxy handler
        proxy_handler = request.ProxyHandler(proxy)
    
        #   opener
        opener = request.build_opener(proxy_handler)
    
        #  proxy_handler   urllib 
        request.install_opener(opener)
    
        #   http request   
        opener.addheaders = headers
    
        #     
        html = None  #        ,            html  ,       (      )
        try:
            res = request.urlopen(url)  #       timeout,  socket     
            html = res.read().decode(decodeInfo)
        #     ,        
        except UnicodeDecodeError:
            logger.error("UnicodeDecodeError")
        #             ,     
        except error.URLError or error.HTTPError as e:
            logger.error("Download Error")
            #   300+               
    
            #    400+    ,403    ,         ,       
            logger.error("Client Error!")
            return html
    
            #    500+    ,         500+(      ),          
            if num_retries > 0:
                #           ,   :    1-3 
                time.sleep(random.randint(minSleepTime, maxSleepTime))
                if hasattr(e, 'code') and 500 <= e.code < 600:
                    #         ,        
                    html = downloadHtml(url, headers,
                         proxy, useProxyRate,
                         timeout, decodeInfo, num_retries-1)
    
        return html
    
    #      
    headers = [("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36",)]
    proxy_addr = {"http": "114.224.223.164:9999"}
    
    #     
    print(downloadHtml("http://www.baidu.com/",headers=headers,
                 proxy=proxy_addr))
    
    #       ,     
    logger.removeHandler(file_handler)
    logger.removeHandler(console_handler)