質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

934閲覧

検収条件が合いません

Taka787

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/11/21 02:15

編集2019/11/21 02:53

__イタリックテキスト__度々、投稿失礼いたします。
Pythonでスーモから、クローリングした物件情報を、必要な情報だけをスクレイピングしてCSVに書きだす作業を行っています。
しかし、web上で検索した結果の物件数(286795件)とCSVに書き出された物件数(60916件)が一致しません。
ネット上に上がっていたサンプルコードでしたので、うまくいくはずなのですが・・・

試したこと
len(num) == len(df)←これ条件式ですが、実際にnum,dfの長さの値が何なのか標準出力して確認中です。

どなたかご教授お願いいたします。

スクレイピングコードは以下です。

python

1# coding: UTF-8 2import requests 3from bs4 import BeautifulSoup 4import os 5import csv 6import pandas as pd 7 8#通学時間20分、40分、60分場合分け 9for folder in 20, 40, 60: 10 if folder == 20: 11 num_html = 1079 #通勤時間が20分以内の取れたhtml数 12 if folder == 40: 13 num_html = 3630 #通勤時間が40分以内の取れたhtml数 14 if folder == 60: 15 num_html = 4608 #通勤時間が60分以内の取れたhtml数 16 for i in range(num_html + 1): 17 #取れたhtml数だけループ 18 if i == 0: 19 #0番目、つまり一番最初はcsvに項目だけ書きこむ 20 with open('sumodata{}.csv'.format(folder), 'w', encoding='CP932',newline="") as file: 21 writer = csv.writer(file) 22 writer.writerow(["subtitle", "location", "station", "times", "years", "heights", 23 "floor", "rent", "admin", "deposit", "gratuity", "madori", "menseki"]) 24 else: 25 with open('htmlbox{}/page{}.html'.format(folder, i), 'r', encoding='utf-8') as file: 26 read = file.read() 27 soup = BeautifulSoup(read, "lxml") 28 cassetteitems = soup.find_all("div", class_="cassetteitem") 29 #soupに入っているlxmlデータからクラスがcassetteitemのdivタグ要素を返す 30 # 建物自体からスクレイピング 31 for cas in range(len(cassetteitems)):#配列cassetteitemsの配列数までループ 32 tbodies = cassetteitems[cas].find_all('tbody')#階・賃料・管理費・敷金・礼金・間取り・専有面積のひとまとまりの情報 33 times1 = cassetteitems[cas].find("ul", class_="cassetteitem_transfer-list")#乗り換え回数・所要時間 34 yearsheights = cassetteitems[cas].find("li", class_="cassetteitem_detail-col3") #築年数 高さ 35 subtitle = cassetteitems[cas].find("div", class_="cassetteitem_content-title").string#物件名 36 location = cassetteitems[cas].find("li", class_="cassetteitem_detail-col1").string#住所 37 station = cassetteitems[cas].find("div", class_="cassetteitem_detail-text").string#最寄り駅 38 times = times1.find("li").string#乗り換え回数・所要時間 39 years = yearsheights.find_all('div')[0].string#築年数 40 heights = yearsheights.find_all('div')[1].string#階数 41 # 一つの建物のうちの部屋数をスクレイピング 42 for tbody in tbodies:#tbodyにtbodiesのデータをひとつづつ取り出す 43 cols = tbody.find_all("td") 44 #colsにtbodyの中のtdタグを全て代入 45 for col, floor1 in enumerate(cols):#インデックス番号, 要素の順に取得できる。 46 if col == 2:#インデックス番号が2の場合 47 floor = floor1.string#floorに物件の階数を代入 48 rent = tbody.find(class_="cassetteitem_price cassetteitem_price--rent").string 49 #リストrentには、物件の家賃を代入 50 admin = tbody.find(class_="cassetteitem_price cassetteitem_price--administration").string 51 #リストadminには、管理費を代入 52 deposit = tbody.find(class_="cassetteitem_price cassetteitem_price--deposit").string 53 #リストdepositには、敷金を代入 54 gratuity = tbody.find(class_="cassetteitem_price cassetteitem_price--gratuity").string 55 #リストgratuityには、礼金を代入 56 madori = tbody.find(class_="cassetteitem_madori").string 57 #リストmadoriには、間取りを代入 58 menseki = tbody.find(class_="cassetteitem_menseki").text 59 #リストmensekiには、専有面積を代入 60 with open('sumodata{}.csv'.format(folder), 'a', encoding='CP932',newline="") as file :#sumodata{}.csvに追記 61 writer = csv.writer(file) 62 writer.writerow([subtitle, location, station, times, years, heights,floor, rent, admin, deposit, gratuity, madori, menseki]) 63 # リストの中身を格納していく 64 #検収条件 65 df = pd.read_csv("sumodata{}.csv".format(folder), encoding="CP932") 66 with open('htmlbox{}/page1.html'.format(folder), 'r', encoding='utf-8') as file: 67 url = file.read() 68 #掲載物件数をスクレイピング 69 soup = BeautifulSoup(url,"lxml") 70 pages = soup.find("div", class_="paginate_set-hit") 71 #変数pagesにヒットした物件情報の数を代入 72 pages_text = str(pages) 73 #変数pagesを文字列型の変換 74 pages_split = pages_text.split('\n') 75 #リストpages_splitに、改行文字で区切った要素を代入 76 pages = pages_split[1] 77 #変数pagesには、「288669<span>件</span>」を代入 78 num_text = pages.split("<span>") 79 #リストnum_textには、<span>で区切った要素を代入 80 num = num_text[0] 81 #変数numには、ヒットした物件数の数値のみを代入 82 if len(num) == len(df): 83 #スクレイピングしたcsvデータの物件数と実際の検索結果物件数が一致しているか確認 84 print("Clear") 85 #もし、一致していた場合、clearを表示 86 else: 87 print("データが欠損") 88 #データが欠損していた場合、データが欠損と表示 89

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2019/11/21 02:38

ネットに上がっているからという理由だけで、コードを信用するのは危険です! また、webページは不定期に改修が行われるので、ある時に動作したコードであったとしても、今正常に動作するとは限りません。
Taka787

2019/11/21 02:40

失礼いたしました
guest

回答1

0

自己解決

スーモのサイトに以下が記載されていました。大変失礼いたしました。

不動産会社が掲載している物件総数です。

SUUMOでは、同一と思われる物件を1つにまとめて表示しているため、
掲載物件総数と物件一覧に表示されている件数が異なる場合があります。

投稿2019/11/21 06:22

Taka787

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問