Python&R爬取分析趕集網北京二手房資料(附詳細程式碼)
本文轉載自資料森麟(ID:shujusenlin)
作者介紹:徐濤,19年應屆畢業生,專注於珊瑚礁研究,喜歡用R各種清洗資料。
知乎:parkson
如何挑戰百萬年薪的人工智慧!
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
前言:本文主要分為兩部分:Python爬取趕集網北京二手房資料&R對爬取的二手房房價做線性迴歸分析。文章思路清晰,程式碼詳細,特別適合剛剛接觸Python&R的同學學習參考。
Part1:Python爬取趕集網北京二手房資料
入門爬蟲一個月,所以對每一個網站都使用Xpath、Beautiful Soup、正則三種方法分別爬取,用於練習鞏固。資料來源如下:
本文使用Beautiful Soup講解。
Xpath傳送門:Xpath+requests爬取趕集網北京二手房資料
import requests
import re
from requests.exceptions import RequestException
from bs4 import BeautifulSoup
import csv
import time
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
def get_one_page(url):
try:
response = requests.get(url,headers = headers)
if response.status_code == 200:
return response.text
return None
except RequestException:
return None
def parse_one_page(content):
try:
soup = BeautifulSoup(content,'html.parser')
items = soup.find('div',class_=re.compile('js-tips-list'))
for div in items.find_all('div',class_=re.compile('ershoufang-list')):
yield {
'Name':div.find('a',class_=re.compile('js-title')).text,
'Type': div.find('dd', class_=re.compile('size')).contents[1].text,#tag的 .contents 屬性可以將tag的子節點以列表的方式輸出
'Area':div.find('dd',class_=re.compile('size')).contents[5].text,
'Towards':div.find('dd',class_=re.compile('size')).contents[9].text,
'Floor':div.find('dd',class_=re.compile('size')).contents[13].text.replace('\n',''),
'Decorate':div.find('dd',class_=re.compile('size')).contents[17].text,
'Address':div.find('span',class_=re.compile('area')).text.strip().replace(' ','').replace('\n',''),
'TotalPrice':div.find('span',class_=re.compile('js-price')).text+div.find('span',class_=re.compile('yue')).text,
'Price':div.find('div',class_=re.compile('time')).text
}
#有一些二手房資訊缺少部分資訊,如:缺少裝修資訊,或者缺少樓層資訊,這時候需要加個判斷,不然爬取就會中斷。
if div['Name', 'Type', 'Area', 'Towards', 'Floor', 'Decorate', 'Address', 'TotalPrice', 'Price'] == None:
return None
except Exception:
return None
def main():
for i in range(1,50):
url = 'http://bj.ganji.com/fang5/o{}/'.format(i)
content = get_one_page(url)
print('第{}頁抓取完畢'.format(i))
for div in parse_one_page(content):
print(div)
with open('Data.csv', 'a', newline='') as f: # Data.csv 檔案儲存的路徑,如果預設路徑就直接寫檔名即可。
fieldnames = ['Name', 'Type', 'Area', 'Towards', 'Floor', 'Decorate', 'Address', 'TotalPrice', 'Price']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for item in parse_one_page(content):
writer.writerow(item)
time.sleep(3)#設定爬取頻率,一開始我就是爬取的太猛,導致網頁需要驗證。
if __name__=='__main__':
main()
對於小白容易遇見的一些問題:
a、有一些房屋缺少部分資訊,如缺少裝修資訊,這個時候需要加一個判斷,如果不加判斷,爬取就會自動終止。我在這裡跌了很大的坑。
b、Data.csv知識點儲存檔案路徑預設是工作目錄,關於工作目錄傳送門:python中如何檢視工作目錄
c、爬蟲列印的是字典形式,每一個房屋資訊都是一個字典,由於對Python中excel相關庫是我知識盲點,所以爬蟲的時候將字典迴圈直接寫入CSV。
pycharm中列印如下:
圖一
將字典迴圈直接寫入CSV效果如下:
圖二
d、很多初學者對於Address這種不知道如何處理,這裡強調一下Beautiful Soup 中.contents的用法,親身體會,我在這裡花了好多時間才找到答案。
圖三
Part2:R對爬取的二手房房價做一般線性迴歸分析
下面我們用R對抓取的趕集網北京二手房資料做一些簡單的分析。
2.1、資料的說明
Name:主要是商家的醒目標題,分析的時候沒有啥參考意義
Type:臥室數、客廳數、衛生間數
Area:面積(平方米)
Towards:朝向
Floor:樓層
Decorate:裝修情況如:精裝修、簡單裝修、毛坯房
Address:二手房的地址
TotalPrice:總價
Price:均價(元/平方米)
2.2、資料清洗
data<-read.csv("E://Data For R/RData/data.csv")
DATA<-data[,-c(1,7)]#將Name和Address兩列去掉
DATA[sample(1:nrow(DATA),size=10),]
圖四
#在爬取的時候加入了判斷,所以不知道爬取的資料中是否存在缺失值,這裡檢查一下
colSums(is.na(DATA))
圖五
#這裡將Type的臥室客廳和衛生間分為三個不同的列
##這裡需要注意,有一些房屋沒有客廳如:1室1衛這時候需要單獨處理,還有一些沒有廁所資訊。
library(tidyr)
DATA=separate(data=DATA,col=Type,into = c("Bedrooms","Halls"),sep="室")
DATA=separate(data=DATA,col=Halls,into = c("Halls","Toilet"),sep="廳")
##將衛生間後面的漢字去掉
DATA$Toilet<-str_replace(DATA$Toilet,"衛","")
###如圖六,將Halls中帶有漢字去掉,因為有一些房屋資訊沒有客廳,如:1室1廳,在分成臥室和客廳時,會將衛生間分到客廳一列。
DATA$Halls<-str_replace(DATA$Halls,"衛","")
##取出沒有客廳資訊的資料,這些資料被separate到Halls列
newdata<-DATA[which(DATA$Toilet %in% NA),2]
newdata
##將沒有客廳的房屋資訊Halls列填充為0
DATA[which(DATA$Toilet %in% NA),2]<-0
DATA[which(DATA$Toilet %in% NA),3]<-newdata
colSums(DATA=="")
Bedrooms Halls Toilet Area Towards Floor Decorate
0 0 2 0 0 0 0
TotalPrice Price
0 0
##發現有2個廁所沒有資訊,將其填寫為0。
DATA$Toilet[DATA$Toilet == ""]<-0
圖六
##這裡將Area後的㎡去掉
DATA$Area<-str_replace(DATA$Area,"㎡","")
##檢視Towards的型別
table(DATA$Towards)
Towards 北向 東北向 東南向 東西向 東向 南北向 南向 西北向
51 25 23 50 65 32 1901 678 38
西南向 西向
28 26
##將Floor資訊帶括號的全部去除
DATA$Floor<-str_replace(DATA$Floor,"[(].*[)]","")##正規表示式
#檢視Floor的類別資訊
低層 地下 高層 共1層 共2層 共3層 共4層 共5層 中層
632 32 790 36 61 101 68 130 1016
#分別將TotalPrice和Price後面的萬元、元/㎡去掉
DATA$TotalPrice<-str_replace(DATA$TotalPrice,"萬元","")
DATA$Price<-str_replace(DATA$Price,"元/㎡","")
head(DATA)
圖七
##將資料轉換格式
DATA$Bedrooms<-as.factor(DATA$Bedrooms)
DATA$Halls<-as.factor(DATA$Halls)
DATA$Toilet<-as.factor(DATA$Toilet)
DATA$Area<-as.numeric(DATA$Area)
DATA$TotalPrice<-as.numeric(DATA$TotalPrice)
DATA$Price<-as.numeric(DATA$Price)
DATA$Towards<-as.factor(DATA$Towards)
DATA$Decorate<-as.factor(DATA$Decorate)
str(DATA)
圖八
以上資料清洗完畢。
Part3:描述性分析
主要思路是探究單個自變數對因變數的影響,對房價的影響因素進行模擬探究之前,首先對各變數進行描述性分析,已初步判斷房價的影響因素。這裡探究各個因素對總價影響。
3.1探究Bedrooms與TotalPrice的關係
table(DATA$Bedrooms)
1 2 3 4 5 6 7 9
541 1225 779 193 102 20 5 1
##由於擁有6、7、9個臥室數的數量較少,這裡我們排出這些資料。
DATA<-DATA[-(which(DATA$Bedrooms %in% "6")),]
DATA<-DATA[-(which(DATA$Bedrooms %in% "7")),]
DATA<-DATA[-(which(DATA$Bedrooms %in% "9")),]
table(DATA$Bedrooms)
1 2 3 4 5
541 1225 779 193 102
library(ggplot2)
ggplot(DATA,aes(x=Bedrooms,y=TotalPrice))+geom_boxplot(col="red")
圖九
DATA$Bedrooms<-as.numeric(DATA$Bedrooms)
##這裡將臥室數為1、2、3命名為A,4為B,5為C
DATA$Bedrooms[DATA$Bedrooms=='1']<-"A"
DATA$Bedrooms[DATA$Bedrooms=='2']<-"A"
DATA$Bedrooms[DATA$Bedrooms=='3']<-"A"
DATA$Bedrooms[DATA$Bedrooms=='4']<-"B"
DATA$Bedrooms[DATA$Bedrooms=='5']<-"C"
不同臥室數,TotalPrice不同,且隨著臥室數的增多,總價越高,符合大眾的認知。
3.2探究Halls與TotalPrice的關係
table(DATA$Halls)
0 1 2 3 4 5 9
20 1674 1050 77 18 1 0
##5個客廳只有一個個體,我們這裡將其排出
DATA<-DATA[-(which(DATA$Halls %in% "5")),]
table(DATA$Halls)
0 1 2 3 4 5 9
20 1674 1050 77 18 0 0
ggplot(DATA,aes(x=Halls,y=TotalPrice))+geom_boxplot(col="red")
圖十
客廳數為3時候總價最高,客廳數為0、1和2的時候總價低於客廳數3和客廳數4。
3.3探究Toilet與TotalPrice的關係
#探究衛生間與總價的關係
table(DATA$Toilet)
0 1 2 3 4 5 6 7 9
2 2142 470 116 74 26 7 2 0
#這裡將衛生間數為0、6和7的去掉
DATA<-DATA[-(which(DATA$Toilet %in% "0")),]
DATA<-DATA[-(which(DATA$Toilet %in% "6")),]
DATA<-DATA[-(which(DATA$Toilet %in% "7")),]
table(DATA$Toilet)
0 1 2 3 4 5 6 7 9
0 2142 470 116 74 26 0 0 0
ggplot(DATA,aes(x=Toilet,y=TotalPrice))+geom_boxplot(col="red")
圖十一
一般臥室數越多,衛生間數也越多,即衛生間數越多,總價越高。
3.4探究Area與TotalPrice的關係
ggplot(DATA, aes(x=Area, y=TotalPrice)) + geom_point(col='red')
圖十二
這個完全符合住房面積越大,總價越高。
3.5探究Towards與TotalPrice的關係
ggplot(DATA,aes(x=Towards,y=TotalPrice))+geom_boxplot(col="red")
圖十三
3.6探究Floor與TotalPrice的關係
ggplot(DATA,aes(x=Floor,y=TotalPrice))+geom_boxplot(col="red")
圖十四
圖中資訊顯示樓層一共只有1、2、3、地下的總價較高。
3.7探究Decorate與TotalPrice的關係
ggplot(DATA,aes(x=Decorate,y=TotalPrice))+geom_boxplot(col="red")
圖十五
不同裝修資訊對總價影響較小。
Part4:模型建立
fit <-lm(TotalPrice~Bedrooms+Halls+Toilet+Area+Towards+Floor+Decorate,data=DATA)
summary(fit)
Call:
lm(formula = TotalPrice ~ Bedrooms + Halls + Toilet + Area +
Towards + Floor + Decorate, data = DATA)
Residuals:
Min 1Q Median 3Q Max
-1330.80 -103.49 -21.41 63.88 2961.59
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -112.7633 88.3010 -1.277 0.201697
Bedrooms2 -43.5934 16.2533 -2.682 0.007359 **
Bedrooms3 -82.6565 20.7641 -3.981 7.04e-05 ***
Bedrooms4 -63.3096 34.9521 -1.811 0.070198 .
Bedrooms5 79.0618 54.0763 1.462 0.143842
Halls1 -5.0663 64.2764 -0.079 0.937182
Halls2 -53.8905 65.4427 -0.823 0.410307
Halls3 -303.9750 79.2280 -3.837 0.000127 ***
Halls4 -528.5427 104.0849 -5.078 4.07e-07 ***
Toilet2 112.9566 19.1171 5.909 3.87e-09 ***
Toilet3 543.7304 38.8056 14.012 < 2e-16 ***
Toilet4 735.1894 55.0977 13.343 < 2e-16 ***
Toilet5 338.7906 84.2851 4.020 5.98e-05 ***
Area 5.1091 0.1619 31.557 < 2e-16 ***
Towards東北向 138.9088 79.3817 1.750 0.080248 .
Towards東南向 187.1895 68.5388 2.731 0.006351 **
Towards東西向 176.3055 65.8384 2.678 0.007453 **
Towards東向 210.9435 73.2744 2.879 0.004022 **
Towards南北向 75.7831 57.1199 1.327 0.184704
Towards南向 60.1949 56.9678 1.057 0.290763
Towards西北向 75.4326 71.1415 1.060 0.289091
Towards西南向 169.8106 75.9626 2.235 0.025467 *
Towards西向 234.0816 76.5585 3.058 0.002253 **
Floor地下 -812.3578 63.3277 -12.828 < 2e-16 ***
Floor高層 12.3525 14.2466 0.867 0.385991
Floor共1層 -313.7278 52.1342 -6.018 2.00e-09 ***
Floor共2層 -453.3692 41.6829 -10.877 < 2e-16 ***
Floor共3層 -601.7032 44.3336 -13.572 < 2e-16 ***
Floor共4層 -183.7866 36.3396 -5.057 4.52e-07 ***
Floor共5層 -41.4184 25.7922 -1.606 0.108419
Floor中層 -1.7223 13.5961 -0.127 0.899204
Decorate簡單裝修 -63.1591 22.0584 -2.863 0.004224 **
Decorate精裝修 -49.3276 19.8544 -2.484 0.013033 *
Decorate毛坯 -157.0299 24.3012 -6.462 1.22e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 265.5 on 2794 degrees of freedom
Multiple R-squared: 0.6852, Adjusted R-squared: 0.6815
F-statistic: 184.3 on 33 and 2794 DF, p-value: < 2.2e-16
模型的F檢驗拒絕原假設,說明建立的模型是顯著的;Ajusted R-squared 為0.6815,模型的擬合程度尚可接受。
後面還有模型的檢驗,之後有機會會進行更深入的探討。
程式設計師轉行學什麼語言?
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
(本文為 AI大本營轉載文章,轉載請聯絡原作者)
群招募
掃碼新增小助手微信,回覆:公司+研究方向(學校+研究方向),邀你加入技術交流群。技術群稽核較嚴,敬請諒解。
推薦閱讀:
點選“閱讀原文”,檢視歷史精彩文章。
相關文章
- 【Python爬蟲】正則爬取趕集網Python爬蟲
- python爬蟲解決趕集網掃碼獲取手機號Python爬蟲
- Scrapy爬取二手房資訊+視覺化資料分析視覺化
- python爬取網頁詳細教程Python網頁
- Python採集3000條北京二手房資料,看我都分析出了啥?Python
- 「無程式碼」高效的爬取網頁資料神器網頁
- (詳細)python爬取網頁資訊並儲存為CSV檔案(後面完整程式碼!!!)Python網頁
- 利用Python對鏈家網北京二手房進行簡單資料分析Python
- python網路爬蟲(7)爬取靜態資料詳解Python爬蟲
- UCI資料集詳解及其資料處理(附148個資料集及處理程式碼)
- python爬取北京租房資訊Python
- scrapy爬取鏈家二手房存到mongo資料庫Go資料庫
- 用Nodejs Cheerio爬取NPM包詳細資訊NodeJSNPM
- 北京市政百姓信件分析實戰一 (利用python爬取資料)Python
- 新手小白的爬蟲神器-無程式碼高效爬取資料爬蟲
- Puppeteer爬取網頁資料網頁
- 呼叫API介面獲取淘寶商品資料:詳細指南與程式碼實踐API
- 12 爬取目標的資料分析
- 使用 Python 爬取網站資料Python網站
- Python爬取噹噹網APP資料PythonAPP
- 拉勾網職位資料爬取
- py 爬取某網站直播集錦-抓取組裝得到詳情頁視訊集錦 url-現場敲程式碼網站
- [趕集網] 【MySql】趕集網mysql開發36條軍規MySql
- 爬取某網站寫的python程式碼網站Python
- python3.x爬取網易雲音樂,超詳細版Python
- 房產資料爬取、智慧財產權資料爬取、企業工商資料爬取、抖音直播間資料python爬蟲爬取Python爬蟲
- lazada商品詳情資料採集介面程式碼展示
- 快速爬取登入網站資料網站
- python3.基礎爬取網易雲音樂【超詳細版】Python
- js獲取北京時間程式碼JS
- 爬蟲抓取網頁的詳細流程爬蟲網頁
- 網路爬蟲詳細設計方案爬蟲
- Python爬蟲入門【3】:美空網資料爬取Python爬蟲
- Springboot如何連線達夢資料庫,超詳細,附原始碼Spring Boot資料庫原始碼
- 呼叫API介面獲取淘寶關鍵詞商品資料:詳細指南與程式碼實踐API
- 爬取 Boss 直聘網上海區域 PHP 職位資訊資料並分析PHP
- 實時獲取建材網商品資料:API實現詳解與程式碼示例API
- Yolov3程式碼分析與訓練自己資料集YOLO