今回も Python 3.6 での Web スクレイピングです。
URLを固定化させずに、引数として受け取り、引数チェックをするプログラムを作ります。
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.1】
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.2】
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.3】
【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(find系操作)【Part.4】
【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(URLを引数で受け取る)【Part.5】
開発環境
OS : CentOS 7
Pythonバージョン : 3.6
仮想環境 : venv
各種モジュールバージョン(pipでインストールしました)
beautifulsoup4 (4.6.0) |
仮想環境に切り替える
今回も、上記記事で作成した仮想環境を利用します。
仮想環境に切り替えます。(仮想環境の有効化)
[test@SAKURA_VPS pyenv]$ source pyenv/bin/activate |
仮想環境を終了します。
(pyenv) [test@SAKURA_VPS pyenv]$ deactivate |
スクレイピングしたいURLを引数として受け取る
以前、コマンドライン引数を受け取る方法を記述していたので、これを参考にします。
【Ansible】【Python】Ansible で取得した JSON 形式のデータをパースして CSV、Excel 形式にコンバートするプログラム
コマンドライン引数を受け取るプログラム
以下のようにコマンドライン引数を受け取るプログラムを追加します。
#coding:utf-8 # コマンドライン引数を取り込み args に格納します。 |
その結果、以下のような Python プログラムになります。
#coding:utf-8 # コマンドライン引数を取り込み args に格納します。 dcap = dict(DesiredCapabilities.PHANTOMJS) # ユーザーエージェント driver = webdriver.PhantomJS(desired_capabilities=dcap) time.sleep(10) # 結果をファイルに出力する # webdriverを閉じます。 |
コマンドライン引数が足りない場合にメッセージを出力するプログラム
コマンドライン引数を忘れてプログラムを実行した場合、以下のような「list index out of range」エラーメッセージが出ます。
一瞬、「なぜエラーになったんだろう」と考えてしまうため、「引数が足りませんよ」とエラー原因を出力させるプログラムに改修します。
※もしくは多すぎてもエラーメッセージを出力させるプログラムに改修します。
(pyenv) [test@SAKURA_VPS scraping]$ python sele_test.py |
プログラムとしては
- コマンドライン引数が何個あるか調べる
- プログラム上、必要な引数の数になっているか調べる(多すぎても少なくてもダメ)
- 条件に合っていない場合は原因を教えるエラーメッセージを出力する
のようになります。
# コマンドライン引数を取り込み args に格納します。 |
コマンド実行結果です。
値が[](角カッコ)で囲まれているのでリスト型です。
(pyenv) [test@SAKURA_VPS scraping]$ python sele_test.py https://yahoo.co.jp |
リストの数を調べます。
# コマンドライン引数を取り込み args に格納します。
# リストの数を調べます。 |
プログラムを実行してどのような結果が表示されるのか確認します。
(pyenv) [test@SAKURA_VPS scraping]$ python sele_test.py https://yahoo.co.jp |
ここで、引数の数が「2」の場合のみ処理を進め、「2」以外の場合はコマンドの使い方を表示させます。
最終的に以下のようになりました。
(pyenv) [test@SAKURA_VPS scraping]$ vit sele_test.py # コマンドライン引数を取り込み args に格納します。 # リストの数を調べます。 # リストの数をチェックします。 # コマンドライン引数の2番目を取得して page_url 変数に格納します。 dcap = dict(DesiredCapabilities.PHANTOMJS) # ユーザーエージェント driver = webdriver.PhantomJS(desired_capabilities=dcap) time.sleep(10) # 結果をファイルに出力する # webdriverを閉じます。 |
動作チェックをします。
【引数を間違えた場合】
(pyenv) [test@SAKURA_VPS scraping]$ python sele_test.py
使用方法:python [プログラム.py] [URL] (pyenv) [test@SAKURA_VPS scraping]$ |
【引数が正しい場合】
(pyenv) [test@SAKURA_VPS scraping]$ python sele_test.py https://yahoo.co.jp |
参考サイト
http://sheemaa.hatenablog.jp/entry/2013/11/11/130521
トラブル解決
突然のエラーです。
今まで selenium でプログラムを動かしていたにもかからわず、突然のエラーです。
特に何もインストール&アンインストールしていないのですが、原因は何でしょうか?
(pyenv) [test@SAKURA_VPS scraping]$ python selenium.py |
ちなみにプログラムです。
#coding:utf-8 |
pipコマンドで現在インストールされているリストを表示して確認しました。
確かに「selenium」はインストールされています。
(pyenv) [test@SAKURA_VPS scraping]$ pip list |
原因解決(ファイル名をselenium.pyに変更したのが原因)
以下のエラーを見ていて原因が分かりました。
単純にimportしただけなのに、「/home/test/pyenv/scraping/selenium.py」を見に行って「seleniumがありません」とメッセージを出しています。
つまりプログラム名を「selenium.py」にしたのが原因でした。
(pyenv) [test@SAKURA_VPS scraping]$ python |
現在勉強している本&参考にしている本
Seleniumでどうすればいいのか分からなくなった時に読む本です。
サンプルプログラムは Java で書かれていますが、オプションや構文などは Python でも役に立ちます。
Pythonでどうやって Web スクレイピングをすればいいのか参考になる本です。こちらもどうすればいいのか迷った時に読む本です。
今までの連載
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.1】
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.2】
【Python】Python 3.6 & Selenium WebDriver & headless でスクレイピング【Part.3】
【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(find系操作)【Part.4】
【Python】Python 3.6 & Selenium WebDriver & PhantomJS でスクレイピング(URLを引数で受け取る)【Part.5】
まとめ
まだまだ先は長いです。
コメント