房天下数据爬取及简单数据分析
總第64篇
01|明確本次爬蟲以及目的:
我是想看看太原的房地產(chǎn)情況,包括樓盤名稱、價(jià)格、所處區(qū)域、評論數(shù)(一定程度上可以反映出該樓盤受歡迎程度)。
明確了目的以后就該去尋找這些數(shù)據(jù)的出處,也就是網(wǎng)站,由于太原互聯(lián)網(wǎng)環(huán)境欠發(fā)達(dá),所以好多房產(chǎn)APP上都沒有太原,有的APP有,但是也只有幾十家樓盤,最后在搜索的過程中鎖定了房天下。這個(gè)樓盤數(shù)量還是可以的,也有我們需要的數(shù)據(jù),所以就他了。
02|目標(biāo)網(wǎng)頁分析:
通過查看網(wǎng)頁,我們知道目標(biāo)數(shù)據(jù)存儲在17頁中,這就不是普通的靜態(tài)網(wǎng)頁爬取,這種需要翻頁的數(shù)據(jù)爬取,我們一般有兩種方法:一是通過修改url參數(shù)進(jìn)行網(wǎng)頁的切換,二是通過調(diào)用selenium模擬瀏覽器進(jìn)行下一頁的點(diǎn)擊。
上面兩個(gè)截圖一個(gè)是17頁,一個(gè)是9頁對應(yīng)的url,我們發(fā)現(xiàn)在參數(shù)上并沒有明確的規(guī)律,看來利用修改參數(shù)的方法是行不通了,只能使用selenium,在使用selenium實(shí)現(xiàn)的過程中,我無意間發(fā)現(xiàn)了事情:
在進(jìn)行元素審查時(shí),我發(fā)現(xiàn)頁面對應(yīng)的href,即鏈接網(wǎng)站是有規(guī)律的,而且不是那么雜亂無章的,我就把href里面的對應(yīng)鏈接粘貼到搜索框,發(fā)現(xiàn)真能跳轉(zhuǎn)到相應(yīng)的頁面,看來是不需要使用selenium了,用修改參數(shù)的方法進(jìn)行循環(huán)即可。
03|數(shù)據(jù)的抓取:
#導(dǎo)入常用的庫 import random import requests import pandas as pd from bs4 import BeautifulSoup#建立a,b,c,d四個(gè)空列表用來存放一會抓取到的數(shù)據(jù) a_name=[] b_adress=[] c_price=[] d_comment_value=[]#開始url參數(shù)循環(huán),即網(wǎng)頁的循環(huán) for i in range(1,18):url="http://newhouse.taiyuan.fang.com/house/s/b9"+str(i)+"/"html=requests.get(url)html.encoding="GBK"#解決中文亂碼問題soup = BeautifulSoup(html.text, 'lxml')#使用lxml解析方式#開始抓取樓盤名稱的循環(huán)first=soup. find_all(class_='nlcd_name')#抓取class屬性為=“nlcd_name”對應(yīng)的內(nèi)容for name in first:#依次取出first里面的每一條內(nèi)容name1=name.find_all("a")#把從first里面取出來的內(nèi)容進(jìn)行再次查找其中a標(biāo)簽的內(nèi)容for name2 in name1:#依次取出name1里面的每一條內(nèi)容name2a_name.append(name2.get_text().strip())#通過get_text()獲取name2的內(nèi)容,并添加到a_name列表里面。print (i,len(a_name))#打印出每一次循環(huán)以后a_name列表的長度,每一次循環(huán)對應(yīng)一頁的內(nèi)容,該長度代表每一頁抓取到的數(shù)量#開始抓取樓盤地處區(qū)域的循環(huán)Adress=soup. find_all(class_="address") ? ? for adress in Adress: ? ? ? ?for adress1 in adress.select("a"):#通過select選擇器選擇adress里面的a標(biāo)簽。b_adress.append(adress1.text.strip()[0:5].strip()) ? ? print (i,len(b_adress)) ? #開始抓取樓盤價(jià)格的循環(huán),循環(huán)注釋與前面類似Price=soup. find_all(class_="nhouse_price") ? ? for price in Price: ? ? ? ? for price1 in price.select("span"):c_price.append(price1.get_text()) ? ? ? ? ? ? print (i,len(c_price)) ? ?#開始抓取樓盤對應(yīng)評論數(shù)量的循環(huán),循環(huán)注釋與前面類似value_num=soup. find_all(class_='value_num') ? ? for num1 in value_num:d_comment_value.append(num1.get_text()[1:-4]) print (i,len(d_comment_value))| 1 | 20 |
| 1 | 20 |
| 1 | 19 |
| 1 | 20 |
| —— | —— |
| 9 | 180 |
| 9 | 180 |
| 9 | 179 |
| 9 | 178 |
| —— | —— |
| 9 | 180 |
| 9 | 180 |
| 9 | 179 |
| 9 | 178 |
| —— | —— |
| 17 | 334 |
| 17 | 334 |
| 17 | 330 |
| 17 | 328 |
上述表格為部分頁數(shù)對應(yīng)的數(shù)據(jù)個(gè)數(shù),按理來說,每一頁不同的指標(biāo)之間的個(gè)數(shù)是相同的,而實(shí)際是不同的,說明每一頁抓取到的個(gè)別指標(biāo)有缺失。我們具體去看看有缺失的頁數(shù)。
通過觀察發(fā)現(xiàn),第一頁中確實(shí)有一個(gè)樓盤的價(jià)格缺失。我們需要對缺失值進(jìn)行填充處理。因?yàn)楸仨毐WC樓盤、區(qū)域、價(jià)格、評論數(shù)一一對應(yīng),所以我們采取向指定的確實(shí)位置插入值。
#向c_price列表中指定位置插入值c_price.insert(0,"價(jià)格待定") c_price.insert(252,"價(jià)格待定") c_price.insert(253,"價(jià)格待定") c_price.insert(254,"價(jià)格待定")#向d_comment_value列表中指定位置插入值 d_comment_value.insert(167,"0") d_comment_value.insert(174,"0") d_comment_value.insert(259,"0") d_comment_value.insert(260,"0") d_comment_value.insert(316,"0") d_comment_value.insert(317,"0")04|數(shù)據(jù)分析:
DataFrame表生成
data={"name":a_name,"adress":b_adress,"price":c_price,"comment_num":d_comment_value}#生成字典 house=pd.DataFrame(data)#創(chuàng)建DataFrame對象 house.head(5)數(shù)據(jù)預(yù)處理
#值替換,將漢字替換成拼音便于后續(xù)處理 house.replace(["[萬柏林]","[小店]","[尖草坪]","[晉源]"],["wanbailin","xiaodian","jiancaoping","jinyuan"],inplace=True) house.replace(["[杏花嶺]","[迎澤]"],["xinghualing","yingze"],inplace=True) house.replace(["[榆次]","晉中","[陽曲]","馬來西亞柔"],"other",inplace=True) house.replace("價(jià)格待定",0,inplace=True)#值類型轉(zhuǎn)換,便于進(jìn)行數(shù)值運(yùn)算 house.comment_num=house.comment_num.astype(int) house.price=house.price.astype(float)數(shù)據(jù)分析
adress分析
house.groupby("adress").count()["name"]/334*100#將數(shù)據(jù)按樓盤所處位置進(jìn)行分組#繪制各地區(qū)樓盤占比的餅圖 labels = 'xiao_dian', 'wan_bai_lin','xing_hua_ling', 'jian_cao_ping', 'ying_ze','jin_yuan','other' sizes = [34.73, 20.96, 10.78, 8.98,8.98,8.68,6.89] colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral','red','pink','blue'] plt.pie(sizes,labels=labels,colors=colors,autopct='%1.1f%%', shadow=True, startangle=90)| xiao_dian | 小店區(qū) |
| wan_bai_lin | 萬柏林區(qū) |
| xing_hua_ling | 杏花嶺區(qū) |
| jian_cao_ping | 尖草坪區(qū) |
| ying_ze | 迎澤區(qū) |
| jin_yuan | 晉源區(qū) |
| other | 清徐、古交、婁煩 |
通過數(shù)據(jù)可以發(fā)現(xiàn),小店區(qū)的樓盤數(shù)量占比最多為34.7%,其次依次為:萬柏林區(qū)、杏花嶺區(qū)、尖草坪區(qū)、迎澤區(qū)、晉源區(qū)、其他
comment_num分析
評論數(shù)量一定程度上可以說明該樓盤的受歡迎程度,上圖表為太原市熱評前十的樓盤。
price分析
house.sort_index(by="price",ascending=False).head(10)#按價(jià)格進(jìn)行排序,挑選出價(jià)格前十的樓盤(太原市價(jià)格排名前十的樓盤)
house.sort_index(by="price",ascending=False)[:196].price.mean()#計(jì)算價(jià)格均值 house.sort_index(by="price",ascending=False)[:196].price.std()#計(jì)算價(jià)格的標(biāo)準(zhǔn)差new_price=house.sort_index(by="price",ascending=False)[:196].price bins=[0,6000,7000,8000,9000,10000,2000000] cats=pd.cut(new_price,bins) price_cut=pd.value_counts(cats) price_cut.plot(kind="bar",color="grey") plt.xlabel('price') plt.ylabel('num')通過計(jì)算結(jié)果可得:
太原市樓盤的均價(jià)為:10592元/平方米。
太原市樓盤的標(biāo)準(zhǔn)差為:9876元。
太原市的樓盤中價(jià)格大于10000的樓盤數(shù)量最多,其次是(8000-9000),樓盤數(shù)量最少對應(yīng)的價(jià)格是(9000-10000)。
太原市樓盤中價(jià)格最高的為恒大濱河左岸,一平米價(jià)格為12.5萬,真實(shí)大開眼界,太原還有這么貴的樓盤哈。
總結(jié)
以上是生活随笔為你收集整理的房天下数据爬取及简单数据分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 证书边框花纹如何制作
- 下一篇: 每日一签励志早安心语 有关签到早安说说