前回まで「退屈なことはPythonにやらせよう」を読み(書き)進めていきましたが、ようやくWebスクレイピングに辿りつきました。
今回もWebスクレイピングですが、Python+Seleniumでやってみます。
因みに、動作は前回作ったものと同じ
1.Googleでキーワード(コマンド引数または入力値)検索をする。
2.検索結果の画面からリンク先URLを収集する。
3.リンク先URLを新規タブで開く。
SeleniumとChromeDriverを準備
まずは、PythonでSeleniumを使うのと、SeleniumでGoogle Chromeを操作できる様にChrome Driverを準備していきます。
Seleniumはpip使ってインストールするだけなので、
1 |
pip install selenium |
をコマンドプロンプトで終わり。
次にChromeDriverですが、別件でダウンロード済みだったChromeDriver.exeをワークスペースにコピペしてしまいました。
本来はPathを通すか、パス指定をPython側に書くらしいですが、
ワークスペースはPath通っているので、手順省略です。
ChromeDriver.exeが無いか、パス通っていない状態で下にあるコードを実行すると、
selenuim.common.exceptions.WebDriverException
‘chromedriver’ executable needs to be in PATH.
と例外発生します。
Pythonで書いてみた
1 |
#! Python3<br># web-sele.py seleniumでWebスクレイピング<br>import sys<br>from selenium import webdriver<br><br>#1・・・検索キーワード<br>if len(sys.argv) > 1:<br> keyword = sys.argv[1]<br> else:<br> keyword = input('input keyword…')<br><br>#2・・・Google検索を実行<br>browser = webdriver.Chrome()<br>browser.get('https://www.google.com/search?q=' + keyword)<br>link_urls = []<br><br>#3・・・検索結果URLを収集<br>for elem in browser.find_elements_by_css_selector('.r a'):<br> href_url = elem.get_attribute('href')<br> urls.append(href_url)<br><br>#4・・・収集したURLを全て新規タブで開く<br>for url in link_urls:<br> browser.execute_script('window.open()')<br> browser.switch_to.window(browser.window_handles[-1])<br> browser.get(url) |
#1・・・検索キーワード
コマンド引数か、実行後の入力値で検索するワードを指定。
前回記事と全く同じ。
#2・・・Google検索を実行
webdriver.Chrome() でGoogleChromeを操作していきます。
冒頭で言っていた例外発生はこの時点で発生します。
get(~)で指定したURLをchromeで表示させます。
#3・・・検索結果URLを収集
Googleの検索結果ページから、各検索結果のリンク先URLを収集してます。
cssセレクタも前回と全く同じのを使って書けました。
<a>タグ内のhrefの値取得や、要素取得の関数はSeleniumの関数になってますが、それほど違いは無いかな?
#4・・・新規タブで検索結果を開く
新規タブでURL(リンク)を開くのはいくつか方法がありますが、
今回はjavascriptで新規タブを作らせて、そのタブでURLを開かせる事にしました。
execute_script()でjavascriptを実行させているのと、
switch_to.windowで操作対象を切り替えているところがポイントでしょうか。
これだけだったら、Selenium要らない
前回のRequests + webbrowser でやった事をSeleniumで書いてみたのですが、
これをやるくらいなら、Requests + webbrowserの方が良いです。
処理が早いです。
seleniumは人が操作しているのと同様の操作ができるのが特徴だと思うので、
文字入力とか、ボタン操作などをやるのでないと勿体ない感じですね。
プログラム実行中だけChromeが表示されていて、プログラム終了時に全部消えちゃうので、全く実用性もないコードになってます。
コメント