Pythonにできることは自動化しよう!【第11回 webスクレイピング(Selenium編)】

こんにちは、unogram管理人のうのちゅ〜です。

【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って学習し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



Webスクレイピングを実践してみよう(Selenium編)

前回は、Webスクレイピングの実践編その2として、Beautiful Soupの使い方について、実際のコードを見ながら学習しました。

Beautiful SoupではHTMLの解析がメインでしたが、今回学習するSeleniumでは、Webサイト上でクリックして画面遷移したり、フォームにユーザネームなどを入力してログインするといった、Beautiful Soupだけでは難しい処理を実現することが可能です。

前回学習したHTMLの最低限の知識も復習しながら、Seleniumを使ったwebスクレイピングのやり方を見ていきましょう!

Webサイトによってはスクレイピングを禁止しているものもあります。スクレイピングをする際は、あらかじめサイトの利用規約などを確認するようにしましょう。

Seleniumを使用する前に

Seleniumを使用する前に、2つやることがあります。ちなみに今回使用するはGoogle Chromeとします。

  1. まずはSeleniumをpipでインストールします。
  2. Seleniumを使用するためには、ドライバと呼ばれるものが必要になります。Google Chromeの場合はChromeDriver – WebDriver for Chromeから実行環境に合わせてドライバをインストールしましょう。この記事ではMac環境を想定して解説します。

Seleniumの導入

Seleniumとドライバをインストールしたら、さっそくインポートして使用していきましょう。Seleniumは次のようにimportします。

Chromeドライバを正しくインストールできていないとエラーが起きてしまいます。うまくいかないときはPATHがきちんと通っているかなど確認しておきましょう。

from selenium import webdriver

Seleniumでブラウザを起動し、webページを開いてみる

Seleniumを使ってChromeのドライバを生成し、webページを開いてみます。webdriver.Chrome()によってWebDriverオブジェクトが生成されると、新しくブラウザのウインドウが開きます。

そして、WebDriver型の変数driverのメソッドget()の引数に開きたいページのURLを渡すと、起動したブラウザ上でそのページが開かれます。

driver = webdriver.Chrome()
url = 'https://www.google.com/'
driver.get(url)



Seleniumを使ってwebページの入力フォームに記入する

Seleniumを使って新しくブラウザを起動し、好きなwebページを開くことができるようになりました。次は、webページ上の入力フォームに文字列を記入・送信する方法について見ていきます。

フォームに記入するためには、まずwebページ上の入力フォームを示す要素を見つける必要があります。まずは実例を見てみましょう。今回はさきほど開いたGoogleのトップページの検索フォームに、Seleniumを使って検索文字列を記入してみます。

driver = webdriver.Chrome()
url = 'https://www.google.com/'
driver.get(url)

search_elem = driver.find_element_by_css_selector('input[type="text"]')
search_elem.send_keys('python')
search_elem.submit()

上のコードを実行すると、’python’という文字列で検索した画面が表示されます。

どのような操作が行われたのか?

Google検索画面で’python’という文字列を検索するコードではどのような操作が行われたのでしょうか?下の画像のGoogle検索画面のデベロッパーツールを参考に、順に解説していきます。

まず、search_elem = driver.find_element_by_css_selector('input[type="text"]')では、webページ上の検索フォームを指定しています。driver.find_element_〇〇というメソッドには様々な種類がありますが、ここでは〇〇の部分はby_css_selectorとしています。このメソッドでは、要素を選択する上でCSSセレクタを用いています。CSSセレクタに関しては前回学習しましたね。ここでは、type属性の値が'text'であるinput要素を指定しています。

次に、search_elem.send_keys('python')ではフォームに記入する内容に'python'という文字列を指定しています。もちろん、'python'ではなく他の文字列を指定すれば、その文字列について検索できます。

最後に、search_elem.submit()でフォームへの記入内容を送信しています。

この例を応用すれば、検索フォームだけでなく、ユーザ名とパスワードを所定のフォームにそれぞれ指定して送信し、自動でログインするというようなことも可能になります。このようなコードを作成すると、日々更新されるマイページ上の情報を毎日自動で取得してデータを蓄積するというような応用も可能になります。

Seleniumを使って検索結果の一番上のページをクリックして開く

Seleniumを使うと、webページ上の要素を指定してクリックすることも可能です。ここでは、検索結果画面の一番上の要素をクリックして開く例を通して実践してみます。

検索結果画面のデベロッパーツールを見ると、次の画像のようになっています。

さきほどと同様にCSSセレクタを用いて要素を指定することを考えると、引数に'div #search a'を指定することで、一番上の検索結果を開けそうだということがわかります。

要素を指定できたら、その要素に対してclick()メソッドを呼び出すことでクリックすることができます。これで、検索結果の一番上のページをクリックして開くことができます。

search_elem2 = driver.find_element_by_css_selector('div #search a')
search_elem2.click()

その他Seleniumでできること

今回は、次のような操作をSeleniumで自動的に実行する方法について具体例を使って解説しました。

  1. Google Chromeのブラウザを起動する
  2. Google検索のページを開く
  3. 検索フォームを表す要素を指定する
  4. 検索フォームに入力する文字列を指定する
  5. 指定した文字列を送信して検索結果を表示する

その他にも、Seleniumには次のような機能があります。

  • ウインドウのサイズ変更・開閉などの操作
  • ウインドウの位置やサイズの取得
  • スクリーンショットの取得
  • 要素のドラッグ&ドロップ

これらの詳しい操作方法に関してはSeleniumクイックリファレンスを参照してください。



まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第11回として、Seleniumの具体的な使用方法について解説しました。GUI上でマウスやキーボードを使って人間が操作しているかのような操作をPythonで自動的に実行できることがわかったのではないかと思います。紹介したログイン処理のような、頻繁にやっているけど自分でやるのはちょっと面倒なことをぜひPythonにやらせてみてください。

さらに追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。