__イタリックテキスト__度々、投稿失礼いたします。
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
回答1件
あなたの回答
tips
プレビュー