python爬虫類のベストプラクティス(5)--selenium+PhantomJSの簡単な使用

4245 ワード

Ps:また私たちのpsコーナーに来て、前回みんなが試したのはどうだったか分かりませんが、今回はselenium+PhantomJSを使って非同期でロードしたページデータ情報をキャプチャする方法を簡単に紹介します.もちろん、seleniumは非常に強力な自動化ツールであり、非常に多くのことをすることができ、興味のある学生は自分で理解することができます.
今回は配置環境にかかわるので、順番を少し変えます.
環境設定
  • selenium pip install -U selenium pycharmインストールを推奨します.この強力なIDE
  • を忘れないでください.
  • PhantomJSこの異なるオペレーティングシステムにはそれぞれ対応するバージョンがあり、これは公式サイトのダウンロードページです.http://phantomjs.org/download.htmlああ、オペレーティングシステムのバージョンに対応するphantomjsをダウンロードしてから、フォルダのbinディレクトリの下に対応するphantomjsの実行可能ファイルが表示されます.1部をコピーして1つの環境変数が検索できる場所に入れるか、phantomjsのbinディレクトリを直接環境変数に加えるだけでよい~
  • 簡単にPhantomJSを紹介します.これはwebkitベースのインタフェースのないブラウザです.つまり、ブラウザのようにページを解析することができ、機能が非常に強いです.しかし、私のテストによると.の解析の結果は必ずしも火狐やchromeと同じではないが、私たちが使うのに十分だ.簡単にseleniumを紹介します.これはwebの自動テストツールで、人の操作をシミュレートすることができます.市販のほとんどの主流ブラウザをサポートし、PhantomJSというインタフェースレスブラウザもサポートしています.
    selenium+FirefoxかChromeが遅すぎるので、selenium+PhantomJSを選びます.selenium+Firefoxの学友を试みて直接最新版のFirefoxをダウンロードして、プラグインを必要としないで、しかしchromeの话は1つのプラグインを必要としてchromedriverを叫んで、私は群の中に置いて、余谈は多く言わないで、gogogo!
    コードプレビュー
    #coding:utf-8
    import unittest
    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    
    class seleniumTest(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.PhantomJS()
    
        def testEle(self):
            driver = self.driver
            driver.get('http://www.douyu.com/directory/all')
            soup = BeautifulSoup(driver.page_source, 'xml')
            while True:
                titles = soup.find_all('h3', {'class': 'ellipsis'})
                nums = soup.find_all('span', {'class': 'dy-num fr'})
                for title, num in zip(titles, nums):
                    print title.get_text(), num.get_text()
                if driver.page_source.find('shark-pager-disable-next') != -1:
                    break
                elem = driver.find_element_by_class_name('shark-pager-next')
                elem.click()
                soup = BeautifulSoup(driver.page_source, 'xml')
    
        def tearDown(self):
            print 'down'
    
    if __name__ == "__main__":
        unittest.main()
    

    今日のコードが少し違うことに驚いたのではないでしょうか.今日は爬虫類以外に、pythonの小さな知識を教えてあげましたから.
    コードプロファイリングimport unittest unittestとは何ですか?字面の意味を見ると、ほとんどの人が知っていると思います.ユニットテストの意味です.このライブラリはpythonが持ってきたテスト用のライブラリで、使いやすいです.今日はついでにこのライブラリの簡単な使用を紹介します.今日のこのコードは、単純なテスト例class seleniumTest(unittest.TestCase):がTestCaseクラスを継承し、テストクラスであることを示しています.setupメソッドは初期化メソッドであり、unittestのmainメソッド呼び出しの最初に実行され、tearDownはテストが完了したときに実行され、中間の各メソッドはtestで始まる必要があります.これはいくつかの簡単なルールで、大体理解してから私たちは楽しくユニットテストを使うことができます~
    def setUp(self):
          self.dirver = webdriver.PhantomJS()
    

    まず私たちのsetupメソッドで私たちのwebdriverを初期化します.pycharmを使うと、webdriverの後ろにいろいろな方法があります.火狐の、chromeなどのブラウザのwebdriverを作成することができます.
    初期化が完了して解析を開始し、今日は闘魚tvの部屋情報をキャプチャし、ブラウザで開きます.http://www.douyu.com/directory/allああ、それからホームページのソースコードを见て、意外にも直接ソースコードの中で部屋の情报を见ることができることを発见して、心の中で喜んで、非同期の方式ではありませんか?これはいいですね.直接requestsに頼んで分析すればいいでしょう.次に2ページ目を開き、Webソースコードを表示します.意外にも第1ページとそっくりであることを発見して、急に失望して、依然としてjsの非同期の方式を採用してデータをロードして、ただ今回帰ってくるのはjsonフォーマットではありませんて直接htmlです.前章のようにする必要がありますか?Nono、今日はPhantomJSを直接使用してブラウザのアクセスプロセスをシミュレートし、dirver.getの方法でブラウザのロードが完了したソースコードを取得します.このように非同期であるかどうかにかかわらず、私たちが取ったsourceはブラウザで見たのと全く同じです.ずいぶん簡単になったような気がしますか?
    dirver.get('http://www.douyu.com/directory/all')
    soup = BeautifulSoup(dirver.page_source, 'xml')
    

    この2つの文はきっとみんなも理解することができて、実は1つの方式を変えてホームページのソースコードを取得しました.今回はjsがレンダリングしたページも手に入れました.次の
     titles = soup.find_all('h3', {'class': 'ellipsis'})
     nums = soup.find_all('span', {'class': 'dy-num fr'})
     for title, num in zip(titles, nums):
          print title.get_text(), num.get_text()
    

    このコードはソースコードの中で私たちが望んでいる情報を取り出して、学生たちも発見したかもしれませんが、これは私たちの第3節で話したのとは違います.これは私たちの解析方式が元のlxmlではなくxmlに変わったからです.lxmlはもっと効率的な解析モードに属していますが、私はどうして交換しますか.私がこのコードを書いている間にエピソードがあったので、もともと私もlxmlで解析していましたが、毎回32の情報しか解析できないことに気づきましたが、闘魚は小さなページごとに少なくとも100以上の部屋があるのは明らかで、driverが返したpage_を見ました.source、問題がないことを発見して、そこで私はbeautifulsoupの解析が問題を出したのかもしれないと思って、soupを印刷して、ソースコードの半分しかないことを発見して、後ろの半分は不思議に失いました.ページの中に複数あると思っていたのですが