4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

中古マンションの価格をスクレイピングしてみた

Last updated at Posted at 2022-08-09

目次

  • 概要
  • 本題
  • あとがき

概要

こんにちは中学校の先生です。
先日縁あって不動産を買う機会がありました。
その中で『業者さんの情報って忖度入ってるよなあ』と感じたので、自分で情報収集したくなりました。
ただどのサイトも非常に情報が多く、pythonを活用してみよう!と思い立ちました。
プログラミング初心者としての備忘録になりますので、苦労した点が多めです。

本題

  • コードの内容
  • 早速本題。作ったものはこちらになります。
    不動産価格参照ツール
    from re import T
    from ssl import SSL_ERROR_WANT_X509_LOOKUP
    from retry import retry
    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    #対象サイトのURL
    want_url = "(省略)"
    #10秒おきに3回リトライ
    @retry(tries=3,delay=10,backoff=2)
    
    #html取得関数を定義
    def get_html(url):
      r = requests.get(want_url)
      soup = BeautifulSoup(r.content,"html.parser")
      return soup
    #データの代入先を定義
    all_data=[]
    #最後のページを求める(現在は手作業)
    max_page=2
    
    #最後のページまで繰り返し
    for page in range(1,max_page+1):
      #urlを取得
      url=want_url.format(page)
      #htmlを取得
      soup=get_html(url)
      #物件の数を取得
      items=soup.select("div.click_Row")
      #物件の数だけ情報を収集
      for item in items:
        item_data={}
        item_data["名称"]=item.select(".click_R_link")
        item_data["所在地"]=item.select("item_location")
        item_data["価格"]=item.select("p.item_price")
        item_data["アクセス"]=item.select("p.item_access")
        item_data["築年数"]=item.select(".item_5")
        item_data["面積"]=item.select(".item_4")
        #データを代入し一時保管
        all_data.append(item_data)
    
    #データフレームを作成
    df=pd.DataFrame(all_data)
    print(df)
    
  • 利用したライブラリ
    • retry
    • 色んな人が使ってたのでとりあえず入れました。効果は実感できてないです。
    • requests
    • htmlの取得に使用。
    • Beautifulsoup
    • htmlから特定のデータを抜き出します。まじ便利。ここでクラスをちゃんと見て情報を抜き出すのに時間がかかりました。
      サイトによってクラスのつけ方が変わってくるので、センスの違いが見え隠れして楽しかったです。
    • pandas
    • データを整理してくれる賢い子。ついでにcsvで出力までしてくれる(予定)。
  • 先行研究との差異
  • ググると多くの方が賃貸物件の検索にスクレイピングを利用されていました。今回私は購入のために相場観が知りたかったので、中古マンションの購入に焦点を当てています。
    そうなると必要な情報が少なくなるので、コードがすっきりしました。
  • 苦労したこと
    • スクレイピング対策の対策
    • 現在はURLに中括弧を入れると、さまざまなサイトで弾かれてしまうようです。
      最初は何度やってもうまくいかず、原因究明と対策に数時間かかりました。
      Beautifulsoupでh1タグやdivタグでおおまかに抽出→print→ログを見て判断、の繰り返しでスクレイピングできるサイトを必死に探しました。
    • クラスの選定
    • htmlを見慣れていなかったので、タグが多くて目が疲れました。
      またfindとselectのどっちを使ったらいいかわからず、右往左往したので、括弧の中身も何度も書き直してしまいました。

あとがき

今後の課題は
  • データ出力
  • 今後はcsvで出力したものを整理し、グラフにしたいと思っています。
    同時に平均値と中央値を求め、購入する上での参考にしたいです。
  • ページ数の自動取得
  • 最後のページを手作業で入力していたため、これを自動で取得できるようにしたいです。
  • 操作ページの作成
  • VSCode上でしか動作していないため、htmlで操作できるページを作りたいなあと思っています。
  • 他ページへの対応
  • 中古マンションの23区付近で絞って検索をかけました。URLの規則性を見て、地域や他条件も勝手にいじってくれるといいなあ。

(実動3日、20時間程度)

今回は以上になります。最後まで閲覧いただきありがとうございました。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?