爬虫類編:動的Webページの扱い(下)――ブラウザの動作をシミュレート
5692 ワード
爬虫類編:動的Webページの扱い(下)――ブラウザの動作をシミュレート
前言:
前述の例では、
WebKit
ライブラリを使用して、ブラウザレンダリングエンジンをカスタマイズすることで、実行したい動作を完全に制御できます.それほど柔軟性が必要でない場合は、ブラウザを自動化するAPIインタフェースを提供する良い代替品Seleniumを選択することができます.Seleniumの概要:
Seleniumは、Webアプリケーションのテストに使用されるツールです.Seleniumテストは、本物のユーザーが操作しているようにブラウザで直接実行されます.市販のほとんどの主流ブラウザをサポートします.
本来はselenium+PhantomJSの組み合わせを使う予定でしたが、ChromeやFireFoxも相次いでヘッドレス(headless)ブラウザモードを発売しており、個人的にはChromeに傾いていることがわかりました.ここではSelenium+Chromeの組み合わせを採用しています.
例:
爬虫類に応用する考え方は:
やはり新浪読書--このサイトを例にとると、リストの各文章の詳細ページのアドレスを取得し、サンプルコードを直接見ることを目標としています.
# 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
簡単な比較をしてみましょう.
どの方法を採用するかは、爬虫類の活動の具体的な状況によって異なります.
個人的にはブラウザをシミュレートする方法はできるだけ避けるべきだと思います.ブラウザ環境はメモリとCPUに対する消費が非常に多く、短期的な決断案とすることができます.この場合、長期的な性能と信頼性は重要ではありません.長期的なソリューションとして、Webサイトの逆工程に最大限の努力をします.
本文は何か間違いや不足点があったら、指摘してください.