こんにちは。とりりんです。
今回はスクレイピングについて紹介したいと思います。
こんなことが知りたい方向けです。
- スクレイピングって何?な方
- データ収集をしたい方
- プログラミングに興味がある方
- Python学習中の方
是非最後までご覧ください。
スクレイピングとは
スクレイピングとは、Webサイトなどからデータを取得することを言います。
scrapingと書き、他に削るや剥離などの意味があるそうです。
よくわかりませんが、Webサイトから情報を削り取ることから本来の意味として使われてきたんですかね。
そんなスクレイピングですが、Webサイトから情報を取るということで、当然違法になるケースやマナーがあります。
取得したデータをそのままの形で無断で公開したり、相手先サイトに負荷をかけないようにしましょう。
また、スクレイピングを禁止しているサイトでは絶対にしないようにしましょう。
因みに当サイトでもスクレイピングは禁止しています(スクレイピングするような情報はありませんが…)。
スポンサーリンク
Pythonで実装
そもそも私がスクレイピングをしたかったのは、解析用データを簡単に取得したかったためです。
気象庁の過去データをよく使わせてもらっていますが、ダウンロードが意外と大変で…。
気象庁のデータは表形式で表示されます。
当サイトも含めWebサイトは基本的にHTMLという言語で書かれていますが、表はHTMLでこのように書くことができます。
<table border="2"> <tbody> <tr> <td>エルニーニョ</td> <td>SSTがいつもより0.5度以上高い</td> </tr> <tr> <td>ラニーニャ</td> <td>SSTがいつもより0.5度以上低い</td> </tr> </tbody> </table>
このコードは実際にこう見えます。
エルニーニョ | SSTがいつもより0.5度以上高い |
ラニーニャ | SSTがいつもより0.5度以上低い |
表の中身はtrで囲まれているtdなのがわかりますよね。
そのため、やりたいことはtdで囲まれた箇所を取得することです。
今回は結構長いソースコードになったため、必要なところのみピックアップして説明します。
こちらのサイトを参考にさせていただきました。ありがとうございました。
なおソースコードはGitHubに載せています。
import urllib.request from bs4 import BeautifulSoup url = "https://..." html = urllib.request.urlopen(url).read() soup = BeautifulSoup(html, "lxml") tbl = soup.find("table", { "class" : "data2_s" }) for tr in tbl.findAll('tr'): tdList = tr.findAll('td')
今回はHTMLコードの解析ができるBeautifulSoupというモジュールを使いました。
まず、urllib.requestを使ってHTMLコードを取得します。
取得できるコードはこんな感じのコードです(何も変換されていないHTMLでした)。
print(html) # b'<!doctype html>\n<html>\n<head>\n<meta charset="UTF-8">\n ...
次にBeautifulSoupを使ってコードを解析します。
第一引数はHTMLコード、第二引数は解析機(パーサー)です。
第二引数にはlxml、html.parser、xml、html5libがあるみたいです。
それぞれ必要なライブラリがある(html.parserはない?)ので、入っていない場合はエラーになります。
これをすると綺麗なHTMLコードが出てきます。
print(soup) # <!DOCTYPE html> # <html> # ...
BeautifulSoupで綺麗になったHTMLコードから表を取得します。
今回取得したい表のクラスはdata2_sという名前でした。
print(tbl) # <table class="data2_s" id="tablefix1"> # <tr class="mtx">...
表まで絞り込めたので、ここからは変数tbl内のtrを抜き取ってtdを取得するのみです。
ソースコードではfindAllでtrをリストとして取り出し、trの中からtdを取っています。
変数tr及びtdListとして取り出せるHTMLはこんな感じ。
print(tr) # <tr class="mtx"><th rowspan="4" scope="col">日</th>... print(tdList) # <td style="white-space:nowrap"><div class="a_print"><a href=...
printで全て記載しませんでしたが、この処理によって変数tdListは変数tr内にあるHTMLコードtrを取り出せます。
このリストに格納されるのはHTMLコードなので、stringを使って文字列に変換すれば取得完了です。
取得した文字列は、場合によってfloat()やint()などを使って型変換してください。
print(tdList[0]) # <td style=... print(tdList[0].string) # 1 print(type(tdList[0].string)) # <class 'bs4.element.NavigableString'> print(type(float(tdList[0].string))) # <class 'float'>
スポンサーリンク
取得したデータはファイルなどに書き込む必要があります。
今回はcsvモジュールを使ってcsvファイルにしました。
csvファイルへの保存方法は過去記事と同じなので割愛します。
ヘッダ行も加えてこのようなファイルになりました。
うまくできていそうですね。
まとめ
今回はPythonでスクレイピングの実装をしました。
スクレイピングはすごく便利ですが、悪用は絶対に禁物です。
これで気象データを簡単に使うことができるので、解析効率が少し良くなると期待しています。
今回の実装はこちらを参考にさせていただきました。感謝申し上げます。
最後までご覧いただき、ありがとうございました!
Python
↓とりりんを応援して頂けると嬉しいです!↓
にほんブログ村
コメント