Python

毎日Python_12日目

2020年10月3日


【ページ更新日:2020年10月4日】

毎日Pythonでは、毎日簡単なPythonのプログラムコードを紹介していきます。

今日は「スクレイピング」の簡単な手順を紹介します。

今日のプログラム

コードは次の通りです。

どのようなプログラムか考えてみてください。

from bs4 import BeautifulSoup
import requests

url="https://weather.yahoo.co.jp/weather/jp/13/4410.html"

r = requests.get(url)

soup=BeautifulSoup(r.text,'html.parser')

high = soup.select(".high")[0].text[0:3]

low = soup.select(".low")[0].text[0:3]

print("今日の東京の最高気温は {} 、最低気温は {} です".format(high,low))

Pythonはインテンド(行頭のスペース)がズレるだけでエラーの原因になります。

コピペする場合は次のコードからしてください。

コードのURLはコチラです。

今日のポイント

  • from
  • import
  • bs4
  • BeautifulSoup
  • requests.get(url)
  • BeautifulSoup(r.text,'html.parser')
  • select(".high")[0].text[0:3]

今日の出力

今日の出力は次の通りです。

今日のコードの説明

まず、今日のポイントについて説明します。

fromとimport

  • fromとimportはモジュールをインポートするときに使用します
  • モジュールとは、関数やクラスを1つのファイルにまとめたものです
  • モジュールをインポートすることで便利な関数やクラスを使うことができるようになります
  • インポート方法は次のとおり、コードの最初に書きます
from モジュール名 import 関数/クラス等

bs4

  • bs4は、スクレイピングなどのhtmlファイルを処理する関数がセットになったモジュールです

requests.get(url)

  • Python の HTTP ライブラリ
  • requests.get('URL') で GET リクエストができる.
  • レスポンスに対して .text とすることで, レスポンスボディをテキスト形式で取得できる
レスポンスボディ
  • HTTPレスポンスを構成する部品のひとつ
  • 欲しがってたファイルの中身

参考ページ:「「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典」さん

Jupyter Labによる実行結果

上記のとおり、r.text とすると、指定したURLのhtmlファイルの内容をテキスト形式で取得することができます。

ただし、これだと文字が羅列しているだけなので、次に説明するBeautifulSoupを使用してhtml形式に整形します。

BeautifulSoup(r.text,'html.parser')

  • BeautifulSoup( テキスト , 'html.parser')とすることでテキストをhtmlの形式で整形します
  • 今回テキスト部分には「 r.text 」が入っていますが、これは前述にあるとおり指定したURLのファイルの内容をテキスト形式で取得したものになります
Jupyter Labによる実行結果

上記のとおり、html形式に整形することができました。

どこかのWebページから情報を取得する、いわゆるスクレイピングをするためには、この形式のデータを準備する必要があります。

スクレイピングの手順
  1. Webページのレスポンスボディを取得する
  2. レスポンスボディをテキスト形式に変換する
  3. テキストをhtml形式に整形する(いまココ!
  4. html の class名を指名して、その内容を取り出す
  5. スライスを使用して特定のデータを取り出す

select(".high")[0].text[0:3]

select(".high")まで

  • select は、クラス名を指定することで、そのクラス内のテキストを取得することができます
  • 以下のように、selectはリストで返してくれます
Jupyter Labによる実行結果

上記のとおり、リストの要素数が2つなので、class名が「high」の要素は2つあるようです。

実際に、指定しているURLのWebページを確認してみましょう。

指定しているURLのWebページ(検証ツール)

上記のとおり、Webページには当日の最高気温と翌日の最高気温が表示されています。

そのため、リストの要素数も2つ返ってきました。

ちなみに、ほしい情報をもつ要素のクラス名を調べるにはGoogle chromeの検証ツールが便利です。

[0]

select(".high")は、リストが返ってきました。

今回使用したいのは、当日の最高気温のため、リスト内の最初の要素を使用します。

そのためリストの最初の要素をとってきています。

翌日の最高気温を使用したいときは、[1] に変更すればOKです。

.text

.text をつけることで、タグを取り除いた文字列を取得することができます。

今回は、タグを取り除くと「26℃[0]」が取得されます。

この [0] は先ほどのリストから要素を取り出す時の [0] とは違うものなので注意してください。

この [0] はWebページの気温差を表す表示です。

Jupyter Labによる実行結果

[0:3]

これはスライス操作です。

リスト、文字列、タプル、バイト列などの一部分をコピーして返してくれる仕組みを「スライス」と呼びます。

今回は、上記の '26℃[0]'の「26℃」の部分を使いたいので、インデックス番号0から2をコピーして使用します。

Jupyter Labによる実行結果

このデータを使用して、出力します。

Jupyter Labによる実行結果
  • この記事を書いた人
  • 最新記事

Maita Tomoya / yone

2020.4~Webアプリケーションエンジニアとして都内の企業で働き、空いている時間でブログを運営している29歳男です。本ブログは情報の整理をするため、文章を書く機会を作るために始めました。1記事でも多く「誰かのためになる記事」を書けるように頑張ります!転職前は地方の高校で働いていました。教育関係の記事も定期的に書いていきたいと思います。

-Python