上海的房租有多高?我用Python爬蟲為你揭曉
此文首發於公眾號 brucepk,如需轉載,請聯絡作者。
閱讀文字大概需要 7 分鐘。
大家還記得你們剛來上海的時候租房的房租是多少嗎?現在相比於那個時候,是不是漲了不少?上個月中介哄搶租賃房源的事件大家應該還沒忘記。pk哥在上海,也是見證了房租穩步上漲的過程。很多網友感慨,以前是買不起房,現在是租房都租不起了。
今天,pk哥用 Python 爬蟲給大家分析下上海的房租。我們用資料來看看上海的房租究竟有多高。
這次的租房房源資料來源於鏈家網,用 Python 收集資料後製作成視覺化圖形。
效果圖
本次用 Python 爬取鏈家網的樣本資料我把它做成了柱形圖。從圖中看到,有些區域的房源是比較少的,像崇明、金山、上海周邊這三個區域提供的房源較少。
通過樣本資料我提取出上海各區域的房租平均值。圖中標出了最高房租和最低房租。
這個房租的平均值參考性不大,因為房租的多少還和房屋面積和戶型有關。我們用詞雲圖來看看出租的房源中的主要戶型情況,字型越大表示此戶型佔的比例越大。
從戶型詞雲圖看得出來,出租的房源中最多的戶型是 3 室 2 廳和 2 室 2 廳。如果和認識的朋友一起,租這種戶型的房子也是一個不錯的選擇,這種戶型的房子一般在小區,環境也不錯。
所以,為了使資料更具有參考性,我把各區域房源每平米的月租平均值用 Python 計算出來畫成了柱形圖。圖中標出了最高的每平米月租和最低的的每平米月租。最高的平均值是靜安區的 160.79 元,最低的平均值是奉賢區的 29.77 元。
專案環境
語言:Python 3
編輯器:Pycharm
主要思路
1、用 Python 爬蟲對鏈家網房源資訊收集。
2、把房源資訊按照自己需求整理成視覺化圖形。
出租房資訊收集
出租房資訊採集的來源是鏈家網,開啟鏈家網頁面,用 F12 開啟頁面的除錯功能。頁面資訊的抓取用 requests 庫就可以輕鬆獲取。
程式碼分析
先把單個頁面租房的資訊提取出來以字典的形式儲存。我提取的資訊有出租房屋的標題、戶型、面積、房租、每平米房租。把這些資訊以字典的形式返回。部分主要程式碼如下。(左右滑動檢視全部程式碼)
def RoomInfo(html): soup = BeautifulSoup(html, 'lxml') titles = soup.select('#house-lst div.info-panel h2 a') styles = soup.select('#house-lst div.info-panel div.col-1 div.where span.zone span') squares = soup.select('#house-lst div.info-panel div.col-1 div.where span.meters') prices = soup.select('#house-lst div.info-panel div.col-3 div.price span') data = [] for ti, st, sq, pr, in zip(titles, styles, squares, prices): info = {} title = ti.get_text().strip()# 出租房屋標題 info['標題'] = title style = st.get_text().strip()# 出租房屋戶型 info['戶型'] = style square = sq.get_text().strip()[0:-2]# 出租房屋面積 info['面積(平方)'] = square price = pr.get_text().strip()# 出租房屋房租 info['房租(元/月)'] = price price_square = round(float(price)/float(square), 3)# 出租房屋每平米房租 info['每平方房租(元)'] = price_square data.append(info) return data 複製程式碼
接下來把上面提取的資訊儲存在 csv 檔案中,檔名稱通過提取 url 中的元素作為獲得,因為每個地區的出租房資訊連結都是在後面加一箇中文拼音,比如浦東。
一行表示一組房屋資訊,列資訊分別對應是上面函式獲取的標題、戶型、面積、房租、每平方房租,我把所有信息都儲存在 E 盤的 「zufang」目錄下,需要事先新建好目錄,儲存的檔案部分截圖如下。
實現把房源資訊以 csv 檔案形式儲存功能的程式碼如下。(左右滑動檢視全部程式碼)
def write2csv(url, data): name = url.split('/')[-3] print('正在把資料寫入{}檔案'.format(name))# 以連結中的地區拼音給檔案命名 with open('E:\\zufang\\{}.csv'.format(name), 'a', newline='', encoding='utf-8-sig') as f: fieldnames = ['標題', '戶型', '面積(平方)', '房租(元/月)', '每平方房租(元)']# 控制列的順序 writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() writer.writerows(data) print("寫入成功") 複製程式碼
對頁面分頁時我們需要判斷頁面有多少頁,不同地區頁面會顯示該地區房源的數量,每個頁面顯示 30 個房源,所以基本情況是頁面等於房源總數量除以 30,所有區域房源最大的頁面是 100 頁,但是有些地區房源數量除以 30 結果大於 100 頁,不知道鏈家的多餘的房源去哪裡了,這裡超過 100 就當 100 處理了,還有一種情況是有些地方房源比較少,不到 30 個,那麼就只有一頁的資料。
def get_page_num(url): html = get_html(url) soup = BeautifulSoup(html, 'lxml') nums = soup.select('body div.wrapper div.main-box.clear div.con-box div.list-head.clear h2 span') for n in nums: total = int(n.get_text()) if total < 30: num = 1 return num else: num = total / 30 if num > 100: num = 100 return num else: return num 複製程式碼
接下來獲取不同區域的所有房源資訊,包括浦東區、閔行區、寶山區、普陀區、楊浦區、長寧區、松江區、嘉定區、黃埔區、靜安區、閘北區、虹口區、青浦區、奉賢區、金山區、崇明區、上海周邊地區、地鐵租房、所有房源。為了不給鏈家伺服器造成太大的壓力而導致 IP 被封,每爬取一頁時我設定了隨機等待時間。(左右滑動檢視全部程式碼)
for area in ['pudong', 'minhang', 'baoshan', 'putuo', 'yangpu', 'changning', 'songjiang', 'jiading', 'huangpu', 'jingan', 'zhabei', 'hongkou', 'qingpu', 'fengxian', 'jinshan', 'chongming', 'shanghaizhoubian', 'ditiezufang', 'all']: base_url = 'https://sh.lianjia.com/zufang/{}/pg1/'.format(area) num = get_page_num(base_url) for page in range(1, int(num) + 1): url = 'https://sh.lianjia.com/zufang/{}/pg{}/'.format(area, page) html = get_html(url) data = RoomInfo(html) write2csv(url, data) time.sleep(int(format(random.randint(0, 5)))) 複製程式碼
資料視覺化處理
接下來對獲得的資料進行視覺化處理,我拿對戶型生成詞雲圖舉例,通過從儲存的 csv 檔案中獲取需要列的資訊並統計相同元素出現的次數,剔除無關資訊後生成文章前面出現的戶型詞雲圖。
import csv import os from pyecharts import WordCloud def all_list(arr): result = {} for i in set(arr): result[i] = arr.count(i) return result os.chdir('E:\\zufang') with open('all.csv', 'rt', encoding="utf-8") as csvfile: reader = csv.reader(csvfile) column = [row[1] for row in reader] result = all_list(column) result.pop('戶型')# 去掉字典中的無關資訊 key = list(result.keys()) value = list(result.values()) wordcloud = WordCloud(width=1500, height=700) wordcloud.add('', key, value, word_size_range=[20, 100]) wordcloud.render('E:\\pye\\style.html')# 在指定目錄下生成檔案 複製程式碼
其他的視覺化圖形也是同樣的思路,不清楚可檢視我之前公眾號發的各種視覺化圖形制作方法的文章:Python讓你的資料生成視覺化圖形
在公眾號後臺回覆「房租」獲取原始碼。
覺得不錯,點贊、讚賞、轉發朋友圈都是一種支援。
pk哥公眾號還沒開通留言功能,不過可以通過點選文末左下角「閱讀原文」來留言喔。
以夢為馬,不負韶華