実践!PythonとSeleniumでWebの自動操作を行うコツ(後編)

Python Python入門

Selenium実践編の後編です。前編に続き技術的な解説をした後、スクレイピングの法的規制について解説します。

スポンサーリンク

ウィンドゥの切り替え

捜査対象のウィンドゥを切り替えるには、以下のコードを書きます。

driver.switch_to.window(driver.window_handles[1])

switch_to_window
ではなく
switch_to.window
というところに注意してください。
window_handlesは0からインデックスが始まります。

マウスオーバー

よく、何かにマウスをオーバーさせると大きな画像が切り替わるサイトがあります。
その場合、何かをクリックしても大きな画像は切り替わりません。
クリックとマウスオーバーは全く別のイベントだからです。

このようなサイトをスクレイピングする際、どうすればいいのでしょうか。

答えは簡単です。実際にマウスをオーバーさせれば良いのです。

下記のようなコードになります。

actions = ActionChains(driver)
actions.move_to_element(element).perform()

このコードはマウスをオーバーさせますが、ヘッドレスでないブラウザを使っていても、実際のマウスは動きません。
Seleniumの内部的にオーバーさせるということです。

JavaScriptを使うとき

Seleniumでは捜査対象のページでJavaScriptを実行させることができます。
execute_script
です。

どうしてもJavaScriptを実行させないと、処理が実行できないことがあります。
その例を3つ紹介します。

その前に、JavaScriptを実行させる際のデバッグの注意点として、重大なポイントがあります。
それは、「全てのJavaScriptのエラーがWebDriverExeptionで返ってくる」です。
書いたJavaScriptのコードのどこにバグがあるのか、エラーコードから判別できないのです。

正直、ここの作りはどうにかならないものかと思いますが、言語仕様上仕方ないのかもしれません。
だから、JavaScriptのコードは細心の注意をもって書いてください。

スクロール

画面のスクロールはJavaScriptを実行させないとできません。

次のコードは、画面の上部にある要素の縦方向のサイズを取得し、その合計分だけページを縦にスクロールさせるコードです。

e1 = driver.find_element_by_id("topAd")
e2 = driver.find_element_by_id("top-lighthouse")
e3 = driver.find_element_by_id("header")
e4 = driver.find_element_by_class_name("store-header")
e5 = driver.find_element_by_class_name("product-main")
offset = e1.rect["height"] + e2.rect["height"] + e3.rect["height"] + e4.rect["height"] + e5.rect["height"] + 200 
driver.execute_script("window.scrollTo(0, window.pageYOffset + " + str(offset) + ");")

一点注意点として、offsetを渡すとき、JavaScriptのコードとして渡すので、Pythonのコードとしてはstr型に変換して連結してください。ここを書き間違えるとWebDriverExceptionになり、極めてデバッグしにくいことになってしまいます。先述した通り、どこが間違っているのかエラーコードから判別できません。

「画面の最下部までスクロールする」は次のコードです。

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

クリックでチェックできない

稀に、クリックしてもチェックできないチェックボックスがあります。
そんなときはJavaScriptの出番です。

driver.execute_script('document.getElementById("shipping_other_check1").click();')

でチェックできます。

‘と”

JavaScriptの中に”や’が入っている場合、それはどちらかに統一しましょう。
そして、Pythonの方で、使っていない方でJavaScriptコードを囲うのです。

これは極めて分かりにくいバグになります。
注意してください。

スクレイピングの法的規制

スクレイピングは、対象となるWebサイトの動作に支障を来さない範囲で行う必要があります。

高頻度のアクセスでサイトが落ちるなどの被害を与えると、罪に問われる可能性があります。

日本でのスクレイピングの事件として有名なのは、岡崎市立中央図書館事件です。

2010年3月、岡崎市立中央図書館の蔵書検索システムにシステム障害が発生しました。
これは、ある人がスクレイピングをかけていて高負荷をかけたことが原因でした。
その人は偽計業務妨害罪で逮捕されましたが、起訴猶予で釈放されました。

そのスクレイピングシステムのアクセス頻度は1秒に1回程度でした。

しかし、この程度でも、逮捕される可能性はあるのです。

それから10年が経過し、現在のWebシステムはより堅牢になっていますが、Webシステムが同種の被害を受ける可能性は原理的にはあります。
何秒に1回のアクセスなら大丈夫とは確かな判例はないので言えないですが、常識的な範囲のアクセスに留めるようにしましょう。
逮捕とまではいかなくても、捜査対象のサイトからあなたのIPアドレスがアクセス禁止にされたりします。
そうなると、システム開発できません。

スクレイピングシステムを開発する人は、この法的規制に十分留意するようにしてください。

まとめ

前編後編に分けて、Seleniumの実践編を解説してきました。かなり具体的な事柄を解説しました。

スクレイピングの法的規制についても触れました。

スクレイピングはうまく扱えば強力な道具です。有用なスクレイピングシステムを開発し、クライアントの便宜を計りましょう。

またその際、自分でもWebシステムを開発したことがあると、よりスクレイピングしやすいかもしれません。作ったことがある人でないと構造は分からないものです。

それでは、Seleniumの実践に入ってみてください。

実践!PythonとSeleniumでWebの自動操作を行うコツ(前編)
スクレイピングやWebサイト自動操作に使われるSelenium。 便利な関数がいろいろ揃っています。 しかし、S...