テストエンジニアが機械学習してみた備忘録

広島とジト目が好きなテストエンジニアが機械学習に手を出した備忘録。

「機械学習を使って東京23区のお買い得賃貸物件を探してみた」を京都駅周辺でやってみる 〜スクレイピング編〜

www.analyze-world.com

www.analyze-world.com

www.analyze-world.com

そうそうこういうのがやってみたいんだよ!

ということで、私が現在住んでいる京都でやってみます。 やることはShoさんがご紹介されていることをなぞるだけ(のつもり)なので、 細かい部分の解説等は本家本元をご参照くださいということで、 初学者が詰まる部分をお伝えできればと思います。

実行環境

BeautifulSoup4

いきなり話が若干脱線しますが、Webページの情報をパースする際は、BeautifulSoup4を使うとめちゃくちゃ便利みたいですね。知らなんだ。

qiita.com

BeautifulSoup3のころにその存在だけは知っていたのですが、スクレイピングに役立つとはつゆ知らず… 便利なものはガンガン使用させてもらいます。

取得する物件情報の検討

閑話休題。 Shoさんのブログでは東京23区の全ての物件情報を収集してきています。その数約20万件。 一方で、一口に「お買い得物件」と言っても単身者がファミリー向けのお買い得情報を受け取っても仕方ないです。 というわけで、早く試してみたいということもあるので、一定条件で絞り込んでしまおうと思います。 そういえば、そろそろ来年度新卒として京都に来る大学生が家を探し始める時期な気がするので、 とりあえず「単身者向け」ということで以下の条件で絞り込んでみます。

  • 最寄駅まで徒歩15分以内、最寄駅から京都駅まで30分以内
    • これであればだいたい1時間以内に通勤できるはず
  • 家賃10万円以内(共益費込み)
    • 単身者で10万出す人はなかなかいないと思うけど、まぁ区切りがいいので
  • 間取り
    • 2部屋(2K、1LDK)くらいまでにしとく

これで絞り込むと約25万件

…東京23区より多いぞ?そんなもんなのか…?

と思いきや、SUUMOでは複数の不動産屋が同一物件を掲載している場合、 検索結果のカウント数が重複するが物件一覧では重複しないそうなので、 実際に収集して来るデータはこれより少なくなりそうです。 どのくらいのデータになるかはページ数で見積もった方が良さそうです。 上記の条件だとだいたい500ページ、1ページ辺り待機時間込みで5秒強かけるとすると40〜50分ですね。

もう少し条件を絞って

  • 家賃5万以上
  • 築15年以内

といった辺りを追加してみます。閾値は個人の感覚です。これで検索すると136ページになりました。 10分ちょいでいけそうなのでこれでやってみます。

データを取ってきてみる

Shoさんのコードを拝借してとりあえず1ページ取ってきたところ、以下のような結果に…

f:id:gratk:20171119164111p:plain

  • 築年数と建物の高さだけデータを多く取ってきている…?
  • 「築12年」「7階建」というデータが多くの物件に入力されてしまっている…?

よくコード見てみると「for i in range(len(cassetteitems))」で回しているループの中で

    #立地は、1つ目から3つ目までを取得(4つ目以降は無視)
    for x in sublocations:
        cols = x.find_all('div')
        for i in range(len(cols)):
            text = cols[i].find(text=True)
            for y in range(len(tbodies)):
                if i == 0:
                    locations0.append(text)
                elif i == 1:
                    locations1.append(text)
                elif i == 2:
                    locations2.append(text)

   #築年数と建物高さを取得
    tbodies = cassetteitems[i].find_all('tbody')
    col3 = cassetteitems[i].find_all("li",{
        'class':'cassetteitem_detail-col3'})

というように i を用いたループが入れ子になっているため、 築年数と建物高さを取得する際のcassetteitems[i]が意図した要素を指さなくなっている模様。 上記のループの i を j に置き換えたところ、無事にデータ取得できました。

収集件数と収集時間

20分ほどで約12000件のデータを取ってきました。 収集する度に取得数が異なるのは気になりますが、とりあえず細かいことは置いといて次に行こうと思います。

(つづく)