request, beautifulsoupを使って不動産データを抽出する

pythonでwebスクレイピング

以下の本を使って進めています。

不動産データのスクレイピング

今回もイメージをつかもうの続き。udemyで触れてなかった講座のスクレイピング実践の部分をやる。

コードと解説

まず手始めにこのwebサイトの一番上に書かれている価格を抽出してみる。

getリクエストでwebページの情報を取ってきて、cに中身を代入。beautifulsoupクラスからオブジェクトを生成し、そこからpropertyRowクラスの物だけを取り出す。さらに、そのリストの一つ目からh4をfindで取ってくる(find_allではリスト形式で取ってくるが、findだと一番上の物だけを取ってくるため、わざわざリスト番号を指定する手間が省けて少々便利)。取り出すが、\nがたくさんあってテキストにできないので、replaceメソッドを用いてスペースに変更。これで一番トップの価格を取ってこれた。

次にfor文を回して全部の価格を取ってくる。

こっちでもいい。find_allは全てをリストで返すのでそのリストの中のh4は何番?というのを指定しなくちゃいけないけど、findだけであれば繰り返し処理の中で最初に見つけたh4, 次に見つけたh4、、みたいになる。

上記が基礎的なやり方。次に住所、ベッドの個数、バスルーム、面積、ハーフバスルーム、ロットサイズ、を抽出してくる。コードの下で解説する。

まず最初の一行目は先ほどの価格をだすやつ。次が住所を表示するものだが、住所を指定するspanタグのクラスが二つとも同じなので、この場合はfind_allで取得してリストのインデックスを指定して取り出してあげる。次がベッドの個数からハーフバスルームの個数まで。しかし、ここで問題が一つ。もしそもそも情報がない場合、Noneと表示され、これはtext型に変換が不可能。

なのでtry-except構文を用いて、text変換できる場合は変換する、例外の場合はNoneを表示するというように例外分岐をしてあげる。最後はロットサイズというものを知る方法。column_groupというクラスをリストで取ってきて、さらにその中のfeatureGroupクラスとfeatureNameクラスをfor文で繰り返し取ってあげる。ここでzip構文は二つ以上のリストを回したいときに使うもの。find_allでfeature_group, feature_nameにそれぞれ代入をし、もしロットサイズがfeature_nameにあるならテキスト表示してね。という感じ。

全部載せると汚いので一例だけ。こんな感じで取れる。

$252,900
1302 Veteran’s Drive
Rock Springs, WY 82901
4 Beds
2 Full Baths
1,932 Sq. Ft
None
0.27 Acres

シェアする

  • このエントリーをはてなブックマークに追加

フォローする