爬虫類編:動的Webページの扱い(下)――ブラウザの動作をシミュレート

5692 ワード

爬虫類編:動的Webページの扱い(下)――ブラウザの動作をシミュレート


前言:


前述の例では、WebKitライブラリを使用して、ブラウザレンダリングエンジンをカスタマイズすることで、実行したい動作を完全に制御できます.それほど柔軟性が必要でない場合は、ブラウザを自動化するAPIインタフェースを提供する良い代替品Seleniumを選択することができます.

Seleniumの概要:


Seleniumは、Webアプリケーションのテストに使用されるツールです.Seleniumテストは、本物のユーザーが操作しているようにブラウザで直接実行されます.市販のほとんどの主流ブラウザをサポートします.
本来はselenium+PhantomJSの組み合わせを使う予定でしたが、ChromeやFireFoxも相次いでヘッドレス(headless)ブラウザモードを発売しており、個人的にはChromeに傾いていることがわかりました.ここではSelenium+Chromeの組み合わせを採用しています.

例:


爬虫類に応用する考え方は:
  • Seleniumを使用してWebページをレンダリングし、レンダリングされたWebソースを解析するか、Seleniumインタフェースを使用してページの要素を直接取得します.

  • やはり新浪読書--このサイトを例にとると、リストの各文章の詳細ページのアドレスを取得し、サンプルコードを直接見ることを目標としています.
    # coding=utf-8
    
    import time
    
    from selenium import webdriver
    
    
    class SinaBookSpider(object):
    
        #  Chrome ,  
        driver = webdriver.Chrome()
    
        #  Chrome 
        # opt = webdriver.ChromeOptions()
        # opt.set_headless()
        # driver = webdriver.Chrome(options=opt)
    
        driver.implicitly_wait(10)
    
        total = 1526  #  
        count = 0  #  
    
        #  
        location = 0
        click_times = 0
    
        def run(self):
            """
             
            :return:
            """
            # get 
            self.driver.get("http://book.sina.com.cn/excerpt/rwws/")
    
            self.parselist()
    
            while self.count < self.total:
                if self.click_times is 2:
    
                    self.driver.find_element_by_css_selector('#subShowContent1_page > span:nth-child(6) > a').click()
    
                    #  
                    time.sleep(5)
                    self.click_times = 0
                    self.location = 0
                else:
                    self.driver.find_element_by_css_selector('#subShowContent1_loadMore').click()
    
                    #  
                    time.sleep(3)
                    self.click_times += 1
    
                #  , location 
                self.parselist()
    
            self.driver.quit()
    
        def parselist(self):
            """
             
            :return:
            """
            divs = self.driver.find_elements_by_class_name("item")
    
            for i in range(self.location, len(divs)):
                link = divs[i].find_element_by_tag_name('a').get_attribute("href")
                print link
    
                self.location += 1
                self.count += 1
            print self.count
    
    
    if __name__ == '__main__':
        spider = SinaBookSpider()
        spider.run()
    

    コードアドレス:dynamic-web-process-GitHub上記のコードを実際に実行したい場合は、実行前にブラウザバージョンに対応するドライバがインストールされ、環境変数に正しく追加されていることを確認してください.
  • seleniumを使用する場合も、Webページのロードが完了したかどうかを特定する方法には、3つの方法があります.
  • 強制待ち
  • ステルス待ち
  • 顕性待ち

  • この3つの方法についての説明はここを見ることができます:Python selenium--必ずseleniumの待ち方、3つの待ち方で解読します--灰色のブログ

    まとめ:


    ここでは、ダイナミックページ処理の2つの考え方を紹介します.
  • 逆方向工事
  • ダイナミックページのレンダリング
  • PySideまたはghost.py
  • を使用する.
  • seleniumアナログブラウザ

  • 簡単な比較をしてみましょう.
  • の前者は、実行がより速く、オーバーヘッドがより小さい.実際の状況では、多くのページが逆方向になることができますが、複雑な逆方向に十分なページもあります.
  • 後者は構想的により直感的で、受け入れられやすく、理解されやすい.ブラウザレンダリングエンジンは、Webサイトのバックエンドの動作原理を理解する時間を節約できますが、Webページをレンダリングすると、単純にHTMLをダウンロードするよりもコストがかかります.また、後者を使用するには、通常、必要なHTML要素がすでに得られているかどうかを確認するために、Webページを輪訓する必要があります.この方法は非常に脆弱で、ネットワークが遅い場合に失敗することがよくあります.

  • どの方法を採用するかは、爬虫類の活動の具体的な状況によって異なります.
  • 逆方向で、速度と資源に対する要求が高い場合は、前者を使用するべきである.
  • リバースが困難で、工程上の最適化の要求がない場合は、後者を用いることができる.

  • 個人的にはブラウザをシミュレートする方法はできるだけ避けるべきだと思います.ブラウザ環境はメモリとCPUに対する消費が非常に多く、短期的な決断案とすることができます.この場合、長期的な性能と信頼性は重要ではありません.長期的なソリューションとして、Webサイトの逆工程に最大限の努力をします.
    本文は何か間違いや不足点があったら、指摘してください.