←前回「Pythonでスクレイピング(メモ3:スクレイピング実行)
こんばんは。
Pythonでスクレイピングするまでの試行錯誤メモです。
今回は、前回すんなり出来たように見えたスクレイピングは、実はなかなか試行錯誤していたよっていうメモです。
※動作環境
macOS High Sierra 10.13.6
プロセッサ 2.7 GHz Intel Core i5
メモリ 8 GB 1867 MHz DDR3
Python 3.6.0 :: Anaconda custom (x86_64)
コマンド実行は「ターミナル」、.py編集は「Xcode」を使用
※参考文献「Python エンジニア ファーストブック」(142ページ以降中心)
※参考URL
https://note.nkmk.me/python-scrapy-tutorial/
以下試行錯誤メモ。
スクレイプするためには、htmlのコードを見てタグを正しく指定しなければならない。
正しく指定できているかの確認のために.pyファイルをイジっていちいちクロールするのは効率が悪い。
そこで対話式にスクレイピングを試行できるコードがある。
scrapy shell <URL>
例えば<URL>の箇所に、http://www.jra.go.jp/datafile/seiseki/replay/2018/jyusyo.htmlを入力して実行する。
scrapy shell http://www.jra.go.jp/datafile/seiseki/replay/2018/jyusyo.html 2018-08-25 23:50:53 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: scrapybot) ・・・(省略) [s] view(response) View response in a browser In [1]:
これで該当ページのスクレイプが可能。
例えば重賞の開催日(長くなるので初回だけ)を取得する。
該当するソースはこれ。
・・・ <tr> <td class="date">1月6日<span class="sat">土曜</span></td> <td class="race"><span class="grade_icon g3">GⅢ</span>中山金杯</td> <td class="place">中山</td> <td class="age">4歳以上</td> <td class="course"><span class="type">芝</span>2,000<span class="unit">メートル</span></td> <td class="winner">セダブリランテス</td> <td class="jockey">戸崎 圭太</td> <td class="result"><a href="/datafile/seiseki/replay/2018/001.html" class="btn-def btn-xs"><i class="fa fa-chevron-circle-right" aria-hidden="true"></i>レース結果</a></td> </tr> ・・・
月日は<td class=”date“>にありました。
In [1]: date = keiba.css('td.date::text').extract_first()
おっと、これは.pyファイルからコピペしたので以下のようなErrorが。
NameError: name 'keiba' is not defined
「keiba」って何?定義してないじゃん!
すみませんということで、月日などの情報は各<tr>タグ内にあるので以下のようにkeibaを定義。
In [2]: keiba = response.css('tr)
あ、「’」を挟み忘れてのでまたErrorが。
File "<ipython-input-2-15a0127f7b11>", line 1 keiba = response.css('tr) ^ SyntaxError: EOL while scanning string literal
いわゆる文法Errorですね。必要なものが無いぞ、と。
ということでリベンジ。
In [3]: keiba = response.css('tr') In [4]:
うまくいくと何も出ない。
気を取り直して月日を取得し、それをprint(出力)します。
In [4]: date = keiba.css('td.date::text').extract_first() In [5]: print(date) 1月6日 In [6]:
これはつまりkeibaでの指定タグ<tr>も月日を取得するための指定タグ<td class=”date”>もOKということです。
もちろんdateを定義する前にprint(keiba)を実行すれば、keibaがこちらの欲しいタグを見ているかも分かります。
以上の過程を経て前回の.pyファイルが出来上がったわけです。
今回は対象ページのhtmlがわかりやすかったのでラッキーでした。
おっと、書き忘れてたけど終了したい場合はquit()でOK。
さて、今までは単独ページのスクレイプのみでしたが、今度は各リンク先でスクレイピング(つまりクローリング)させたいと思います。
実はここでかなり詰まりました・・・
次回はそれについてメモします。
次回の内容はリンク先のスクレイピングコードだけで苦戦したり改善したりしたメモでいっぱいになりました笑
クロール実施は次次回へ持ち越し。