見出し画像

Pythonによるウェブサイト情報の自動取得


この記事ではPythonを使ったウェブサイトの情報を自動的に取得する方法を紹介します。

ここで、ウェブサイトの情報を自動的に取得することをWebスクレイピングと言います。
そのためウェブサイト情報の自動取得について気になることがあれば、Webスクレイピングという単語により調べるといいでしょう。
以下、ウェブサイト情報の自動取得の代わりにWebスクレイピングという言葉を使います。

Python が何なのかわからない方はこちら
WindowsにてPythonの利用する方法がわからない方はこちら
MacにてPythonの利用する方法がわからない方はこちら

Webスクレイピングはどのようなときに役に立つのか

事例1:他社企業の情報取得
会社を経営している方は他社企業の情報をウェブサイトから取得して分析を行うことが思います。例えば、何社もある競合企業のプロモーション活動などの情報を取得して自社がどのように動くかを決めたり、他社製品の値段を取得して自社の製品の値段を決めたりすることもあるでしょう。これらの情報の取得は自動化することができます。

事例2:トレンドの分析
メディアサイトを運営する場合は、ウェブにおけるトレンドを素早く理解することが重要になってきます。SNSや有名なニュースサイトなどでどのような話題が盛り上がっているかを把握することができれば、自身のメディアにてどのような記事を発信すれば読者の増やすことができるかがわかることでしょう。このような情報取得は自動化することができます。

どのような作業であれば自動化するべきなのか
自動化を行って効果の多いのは次のようなときです。
①とても多くのウェブサイトの情報を取得するとき
③定期的に同じウェブサイトの情報を取得するとき

Python による Webスクレイピング

「ある条件の賃貸物件における面積に対する月額費用がどのくらいか知りたい」という例にて、 PythonによるWebスクレイピングの方法を紹介しようと思います。
※ Python の実行ができる状態にある方に向けて説明を行います。

必要な情報がどこに書かれているかを把握する
必要な情報がどこに書かれているかを把握します。
今回、ある条件は「大阪駅から徒歩5分以内, 築年数10年以内」として、その条件をSUUMOにより検索します。
検索されたウェブページは次のものとなります。
大阪駅から徒歩5分以内, 築年数10年以内の賃貸物件一覧

さらにこのウェブサイトから、取得したい情報、今回の場合は賃貸物件の月額費用と面積がそのウェブページ のどこに書かれているかを知る必要があります。
そのことはディベロッパーツールを使うことで知ることができます。

-> ディベロッパーツールが何なのかわからない方はこちら

ディベロッパーツールを使ったことで、class名をjs-cassette_link とするtr要素 に賃貸物件の部屋情報が入っていて、その中の2行目と4行目に、それぞれ月額費用と面積が書かれていることがわかりました。

HTMLファイルの取得
さっそくコードを書いていきます。
まずはrequests.get()関数を使うことで、カッコ内に指定したウェブページ のHTMLファイルを取得します。

loadUrl = "https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=060&bs=040&ra=027&rn=2415&ek=241505680&cb=0.0&ct=9999999&mb=0&mt=9999999&et=5&cn=10&shkr1=03&shkr2=03&shkr3=03&shkr4=03&sngz=&po1=25&pc=50"
html = requests.get(loadUrl)

HTMLファイルを情報の取得がしやすい構造に変換する
取得したHTMLファイルは、BeatifulSoupにより情報を取得しやすい形に変換します。

soup = BeautifulSoup(html.content, "html.parser")

必要な情報のみ取得
BeatifulSoupを使って必要な情報を取得していきます。
class名をjs-cassette_link とするtr要素 に賃貸物件の部屋情報が入っているのがわかっているので、次のコードによりその要素のリストを取得します。

roomElmentTrList = soup.find_all("tr", class_="js-cassette_link")

この要素のリストから月額費用と面積を取得していくのですが、その詳細については後に記述するサンプルコードを参照にしてください。

取得した情報を利用する
取得した賃貸物件ごとの月額費用と面積をグラフとして表示を行ってみました。

画像1

あくまで例ですが、このようにウェブサイトから賃貸物件のデータを取得して、データをわかりやすく表示してあげることで、賃貸物件を選ぶときの参考にする事ができます。


サンプルコード
今回作成したコードです。ぜひ参照にしてください。

import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import matplotlib as mpl
# 部屋の情報をいれるリストの生成
costList = []
areaList = []
# HTMLファイルの取得
loadUrl = "https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=060&bs=040&ra=027&rn=2415&ek=241505680&cb=0.0&ct=9999999&mb=0&mt=9999999&et=5&cn=10&shkr1=03&shkr2=03&shkr3=03&shkr4=03&sngz=&po1=25&pc=50"
html = requests.get(loadUrl)
# BeatifulSoupによりHTMLファイルを情報の取得がしやすい構造に変換する
soup = BeautifulSoup(html.content, "html.parser")
# 部屋の情報を持つ要素のリストを取得する
roomElmentTrList = soup.find_all("tr", class_="js-cassette_link")
# 部屋の情報を持つ要素ごとに
for roomElementTr in roomElmentTrList:
   # 行ごとの情報を取得
   roomElementTdList = roomElementTr.find_all("td")
   # 月額費用の情報がある要素の取得
   costElementLi = roomElementTdList[3].find_all("li")
   # 賃料の取得
   costRent = costElementLi[0].get_text()
   # 管理費の取得
   costManage = costElementLi[1].get_text()
   # 単位を[万円]にして、月額費用を計算する
   costRent = float(costRent.rstrip("万円"))
   if costManage == "-":
       costManage = 0
   else:
       costManage = float(costManage.rstrip("円"))/10000
   cost = costRent + costManage
   # 費用のListに追加
   costList.append(cost)
   # 部屋の広さの情報を取得
   area = roomElementTdList[5].find_all("li")[1].get_text()
   # 単位を[m^2]として、数字だけにする
   area = float(area.rstrip("m2"))
   # 面積のListに追加
   areaList.append(area)
# matplotlib のフォントを日本語対応にする
mpl.rcParams['font.family'] = 'AppleGothic'
# matplotlib での数式をイタリックにしない
params = {'mathtext.default': 'regular'}       
plt.rcParams.update(params)
# グラフの生成
fig = plt.figure()
plt.plot(areaList, costList, marker='.', markersize=15, linestyle='None')
plt.xlim(20, 31)
plt.ylim(6, 10.5)
plt.xlabel('面積 [$m^{2}$]')
plt.ylabel('月の費用 [万円]')
plt.grid()
# グラフの保存
fig.savefig("data/matplotlib.png")

Webスクレイピングする時の注意点

Webスクレイピングを行うときには、いくつか注意するべき点があります

利用規約をしっかりと読むこと
ウェブサイトの利用規約をしっかりと読みましょう。ウェブサイトによれば、Webスクレイピングを禁止しているものもあります。例えば、AmazonやNewsPicksなどのサービスはWebスクレイピングを禁止しています。禁止されているのにかかわらずウェブスクレイピングを行うと、損害賠償請求をされてしまう可能性があります。

ウェブサーバーに負担をかけないこと
ウェブサーバーとは、ウェブサイトのサービスを提供しているコンピューターのことです。普段 私たちはこのウェブサーバーにアクセスをして、ウェブサイトを閲覧するというサービスを受けています。今回、行ったWebスクレイピングもこのウェブサーバーにアクセスして情報を取得しているのですが、Webスクレイピングでは、プログラミングによりアクセスを行うので、短い時間に大量のアクセスをかけてしまうことによりウェブサーバーに負担をかけてしまいます。とても迷惑になる行為なので、大量のアクセスすなわち大量のデータを同一のサイトから取得するときは、プログラミンによる動作をわざと遅くすることで、サーバーの負担を軽くしましょう。

その他
他にもWebスクレイピングにて気をつけることはいくつかあります。
その詳細について知りたい方は次の記事を参考にすることをお勧めします。
スクレイピングは違法?3つの法律問題と対応策を弁護士が5分で解説

最後に

以上、Python  によるウェブサイト情報の自動取得の方法を紹介しました。Webスクレイピング はこのように簡単に行うことができます。毎日同じような作業をウェブサイトから取得しているのであれば、コードを書いて自動化してみるといいでしょう。

また記事の内容でわかりにくいところや気になる事があれば、コメント蘭もしくはTwitter のDMにて教えていただけると嬉しいです。

この記事が気に入ったらサポートをしてみませんか?