Python爬虫類はどのように入門しますか?

8072 ワード

「入門」は良い動機ですが、作用が遅い可能性があります.手や頭の中にプロジェクトがあれば、実際には学習モジュールのようにゆっくり勉強するのではなく、目標に駆動されます.
また,知識体系の各知識点が図の中の点であり,依存関係が辺であるとすれば,この図は必ずしも有向無環図ではないに違いない.Aを勉強した経験がBを勉強するのに役立つからです.そのため、どのように「入門」するかを学ぶ必要はありません.このような「入門」点は存在しないからです.どのように大きなものを作るかを学ぶ必要があります.この過程で、あなたはすぐに学ぶ必要があることを学ぶことができます.もちろん、pythonを先に理解する必要があると論争することができます.そうしないと、pythonを爬虫類にすることをどのように学ぶことができますか.しかし実際には、この爬虫類を作る過程でpython:Dを学ぶことができます.
前の多くの答えが言った「術」--どんなソフトウェアでどのように登るかを見て、私は「道」と「術」を話しましょう--爬虫類がどのように仕事をするか、pythonでどのように実現するかを話します.
まずsummarizeを短く話します.
勉強が必要だ
  • 基本的な爬虫類の動作原理
  • 基本的なhttpキャプチャツール、scrapy
  • Bloom Filter: Bloom Filters by Example
  • 大規模なWebページのキャプチャが必要な場合は、分布型爬虫類の概念を学ぶ必要があります.すべてのクラスタマシンが効率的に共有できる分散キューをどのように維持するかを学ぶだけでいいのではないでしょうか.最も簡単な実装はpython-rqです.https://github.com/nvie/rq
  • rqとScrapyの結合:darkrho/scrapy-redis・GitHub
  • 後続処理、ウェブページ抽出(grangier/python-goose・GitHub)、記憶(Mongodb)
  • 以下は短い話です.
    最初に書いた集団が豆弁全体を登った経験を話しましょう.
    1)まず爬虫類がどのように働くかを理解しなければなりません.
    あなたがクモであることを想像して、今あなたは相互接続の「網」の上に置かれています.では、すべてのページを一度見る必要があります.どうしようかな?大丈夫ですよ.どこかから始めてください.例えば人民日報のトップページです.これはinitial pagesと言います.$で表しましょう.
    人民日報のトップページでは、そのページが導いた様々なリンクを見ています.そこであなたは「国内ニュース」のページに登ったことを喜んでいます.よかったですね.これで2ページ(トップページと国内ニュース)を登り終えました.登ったページがどう処理されているかはともかく、このページを完全にhtmlにしてあなたの体に置いたことを想像してみてください.
    突然、国内のニュースというページに、リンクチェーンが「トップページ」に戻っていることに気づきました.賢い蜘蛛として、あなたはきっとあなたが登って帰らなくてもいいことを知っているでしょう.あなたはもう見たことがあるからです.だから、あなたの頭を使って、あなたが見たページのアドレスを保存する必要があります.このように、登る必要があるかもしれない新しいリンクを見るたびに、このページのアドレスに行ったことがあるかどうかを調べてみましょう.行ったことがあるなら、行かないでください.
    はい、理論的にはすべてのページがinitial pageから達成できれば、すべてのページを登ることができることを証明することができます.
    ではpythonではどのように実現しますか?
    簡単だ
    import Queue
    
    initial_page = "http://www.renminribao.com"
    
    url_queue = Queue.Queue()
    seen = set()
    
    seen.insert(initial_page)
    url_queue.put(initial_page)
    
    while(True): #          
        if url_queue.size()>0:
            current_url = url_queue.get()    #         url
            store(current_url)               #   url        
            for next_url in extract_urls(current_url): #     url    url
                if next_url not in seen:      
                    seen.put(next_url)
                    url_queue.put(next_url)
        else:
            break
    

    もう偽のコードが書かれています.
    すべての爬虫類のbackboneはここにあります.次に、爬虫類が実際に非常に複雑なものである理由を分析します.検索エンジン会社は通常、チーム全体を維持し、開発しています.
    2)効率
    上のコードを直接加工して直接実行すると、豆弁全体の内容を登るには1年かかります.Googleのような検索エンジンは言うまでもなく、ネット全体の内容を登る必要があります.
    問題はどこですか.登る必要があるページが多すぎて、上のコードが遅すぎて遅すぎます.全網にN個のサイトがあることを想定すると,重み判定の複雑さを分析するとN*log(N)であり,すべてのページを1回遍歴するためsetを重用判定するたびにlog(N)の複雑さが必要となる.OK、OK、pythonのset実装はhashだと知っていますが、これは遅すぎて、少なくともメモリの使用効率は高くありません.
    通常の判定方法はどうですか?
    Bloom Filter
    .簡単に言えばhashの方法であるが、urlの数に伴って増加しない固定メモリを使用して、O(1)の効率でurlがsetに存在するか否かを判定できることを特徴とする.残念なことに、世の中には無駄な昼食はありません.その唯一の問題は、このurlがsetになければ、BFはこのurlが見たことがないことを100%確定することができます.しかし、このurlがsetにあると、このurlはすでに現れたはずですが、私は2%の不確実性を持っています.ここの不確実性に注意すると、割り当てられたメモリが十分に大きい場合、小さくなります.簡単なチュートリアル:Bloom Filters by Example
    この特徴に気づいてurlが見られたら、小さな確率で繰り返し見るかもしれません(大丈夫です.たくさん見て疲れません).しかし、見られなかったら、必ず見られます(これは重要です.そうしないと、私たちはいくつかのページを漏らします!).[IMPORTANT:この段落は問題がありますので、しばらく省略してください]
    はい、今では重さの判断が最も速い方法に近づいています.もう一つのボトルネックは、あなたには機械が1台しかありません.あなたの帯域幅がどんなに大きくても、あなたの機械がホームページをダウンロードする速度がボトルネックであれば、この速度を速めるしかありません.1台の機械で足りなければ--たくさんの台を使いましょう.もちろん、各マシンに最大の効率が入っていると仮定します.マルチスレッド(pythonの場合、マルチプロセスでしょう).
    3)クラスタ化キャプチャ
    豆弁を這い出す時、私は全部で100台以上の機械を使って昼夜1ヶ月間運行した.1台の機械だけで100ヶ月も運転しなければならないことを想像してみてください.
    では、もしあなたが今100台の機械が使えるとしたら、pythonで分布式の登りアルゴリズムを実現するにはどうすればいいのでしょうか.
    この100台のうち99台の演算能力の小さい機械をslaveと呼び、もう1台の大きな機械をmasterと呼びます.では、上のコードのurlを振り返ってみましょう.Queue、もし私たちがこのqueueをこのmasterマシンに置くことができたら、すべてのslaveはネットワークを通じてmasterと連通することができて、1つのslaveが1つのホームページをダウンロードするたびに、masterに新しいホームページを要求して捕まえることができます.slaveが新しいページを捕まえるたびに、このページのすべてのリンクをmasterのqueueに送ります.同様に、bloom filterもmaster上に配置されますが、masterはアクセスされていないことを確認したurlだけをslaveに送信します.Bloom Filterはmasterのメモリに格納され、アクセスされたurlはmaster上で実行されるRedisに格納され、すべての操作がO(1)であることを保証します.(少なくとも屋台はO(1)であり、Redisのアクセス効率はLINSERT–Redisを参照
    )
    pythonで実装する方法を考えます.
    各slaveにscrapyを装着すると、各マシンはキャプチャ能力のあるslaveになり、masterにRedisとrqを分散キューとして装着します.
    コードは
    #slave.py
    
    current_url = request_from_master()
    to_send = []
    for next_url in extract_urls(current_url):
        to_send.append(next_url)
    
    store(current_url);
    send_to_master(to_send)
    
    #master.py
    distributed_queue = DistributedQueue()
    bf = BloomFilter()
    
    initial_pages = "www.renmingribao.com"
    
    while(True):
        if request == 'GET':
            if distributed_queue.size()>0:
                send(distributed_queue.get())
            else:
                break
        elif request == 'POST':
            bf.put(request.url)
            
    

    はい、実は誰かがあなたに必要なものを書いてくれたと思います.darkrho/scrapy-redis・GitHub
    4)展望及び後処理
    上には「簡単」がたくさん使われていますが、ビジネス規模で利用できる爬虫類を実現するのは容易なことではありません.上のコードは全体的なサイトに登るのにほとんど問題がありません.
    しかし、これらの後続の処理が必要な場合は、例えば
  • 効率的なストレージ(データベースの配置方法)
  • 有効に重い判決を下す(ここではウェブページの重い判決を指し、人民日報とそれをパクリした大民日報を一度も登りたくない)
  • 有効な情报抽出(例えばどのようにホームページの上のすべての住所を抽出して抽出して、"朝阳区奋进路中华道")、検索エンジンは通常すべての情报を保存する必要はありません.例えば、画像は私が保存して何をしますか...
  • タイムリーに更新(このページがどのくらい更新されるか予測)
  • あなたが考えているように、ここのすべての点は多くの研究者に10数年の研究を提供することができます.それでも、
    「道は遠くて、私は上下して求めます」.
    だから、入門方法を聞かずに、そのまま出発すればいいのです:)
    転載先:https://www.cnblogs.com/zsw-1993/p/4879320.html