pythonでwebスクレイピング

pythonでwebスクレイピング

ハッカソンの開発の一端でpythonでwebスクレイピングを行い、

取得した情報をテンプレートに表示するということを行いました。

まず開発環境情報です。

・pipenvでパッケージ管理

・Python 3.6.5

・Django 2.1.3

スクレイピングを行うにあたって、まずネット上のリソース取得のためと、スクレイピングを行うためにライブラリ(パッケージ)が必要になります。

  • requests : HTTP通信のライブラリ
  • beautifulsoup4 : html解析のライブラリ
  • lxml : html解析(beautifulsoup4内で使うことになります)

ではまず次のように追加していきましょう!

このスクレイピングのためのBeautifulSoupですが、これを利用するためには

pipを使ってパッケージをインストールしなければならないのでインストールします。

また後程出てくるlxmlもパッケージが必要になりますので一緒にインストールします。

pipenvを使った仮想環境で開発しているので

Pipfileがおいてあるディレクトリに移動して、仮想環境のシェルに入るために

を行ったあとに

を行います。

pipenvを使ってない方は

で大丈夫ですね。

もしインストールに失敗したらpythonのバージョンとパッケージのバージョンが対応してないという可能性があります。python3だとpipの代わりにpip3 とすればインストール出来たりもありますので試してみてください。

それからlxmlもインストールしておきます。

今回のハッカソンでの開発テーマが「防災」で

スクレイピングで緊急地震速報がほしかったので 気象庁からその情報をとってきます。

偶然で驚いたのですが、気象庁からデータを取ってくるというのをすでにやられている方が

いたので参考にさせて頂きました。(https://algorithm.joho.info/programming/python/beautifulsoup4-quake-sindo/)

コードが以下になります。

resourceでwebページの情報を取得して、BeautifulSoupでhtml情報を取得しています。

ここからページの情報を取りたい部分を抽出するのにfind()やfind_all()メソッドを利用します。

取得の方法はいろいろありますが、ここでは、3行目のとおりfind_allメソッドで

「div」タグの「idはinfo」で「class名がinfotable」の部分をとってきています。

取得した情報をprintで出力して見てみますと特殊な型になっているのが確認できますね。

中身はどうなっているかというと

タグがきちんと取得できているのが分かります。

特殊な型のオブジェクトですがlistのように使えて、情報が0番目に入っているので、

info[0]とし、.textとすることでhtmlタグを除いて中身のテキスト部分が取得できます。

しかし直接[0]要素を指定するのではなく、よく見かけるのはfor文で取得する方法なのでfor文で取得する場合も載せておきます。

では試しにprint(text)で出力してみますと、タグを除いた中身だけきちんと取得できていることが確認できました。

ここで一つ少し厄介なのが、変数textにこれだけの文字列が全て入ってることですね。

文字列操作を駆使して扱いやすい形にカスタマイズしましょう!

話を戻しまして、気象庁のこの緊急速報を取ってくることには上のように成功したのですが、

どこで起こった地震なのか、などの詳細情報がありません。そこで気象庁のページをみると、

検知時間のところがリンクになっててこれに飛ぶと

詳細情報が載っていました!

さっきのよりもほしい情報はこちらなので、こちらの情報も取得していきます。

そのためには

・詳細ページのリンクの情報が必要となるので

で取得します。

info[0]に入っているタグを取得するのは「ドット+タグ名」です。

それからタグ内の属性を取得するのに.get(“属性名”)とします。

ちなみに複数aタグがあってもこれで得られるのは最初のaタグになります。

これで得たURLを確認してみますと、

相対パスなのでこのままでは使えませんね。

ですので、あらかじめ気象庁のこのページより上の階層のリンクの部分を用意しておき、

余分なドットを消してつなげることで正しいリンクが得られますね。

リンクが得られたので、また最初と同様に

としていくことで情報が取得できました。

こんな感じであとはフロントで綺麗にしてやると以下のようにできました。

以下は参考サイトと自分が見返したいサイトです。

pipenvの参考↓

BeautifulSoupのタグの取得方法の参考↓

【Qiita】PythonとBeautiful Soupでスクレイピング

BeautifulSoupで取得した内容の処理の参考↓

【Qiita】webスクレイピングで今日の天気と気温を取得

Pythonカテゴリの最新記事