鏈家網租房數據採集(Python)和分析:你的薪水能在上海租到怎麼樣的房子?(一)
前言
首先介紹一下自己哈,剛剛讀完一個數據分析/挖掘的海外碩士,目前留在新加坡工作,擔任數據分析師。做為一個剛剛畢業的學生,實戰經驗還非常欠缺,看到知乎上面有很多數據分析、數據挖掘、機器學習的乾貨和大神,於是也決定開始來知乎上面post一些自己自學和實戰的內容,也算是記錄自己的進步吧。希望大家能和我一起探討,提出我的不足。
這也是我的第一篇文章,從數據採集說起。說到數據採集,大家應該首先想到就是爬蟲了。這篇文章主要講我如何從鏈家網上面如何爬取上海今日(2018-05-05)的所有租房數據,看看你的工資能在上海租到什麼逼格的房子!哈哈。
打開爬取網站
首先打開鏈家網的租房網站:鏈家網租房
可以發現上海今天共有25973套房子在租。那麼知道爬蟲的朋友應該知道在進行爬蟲之前需要觀察網站結構,研讀網站的HTML代碼以便之後寫代碼進行爬取。
那麼如何查看網站的HTML代碼結構呢?
我以谷歌瀏覽器為例,右上角有三個點那裡,應該是工具欄的設置區吧,打開可以看見More Tools下面有個開發者工具Developer Tools。點開開發者工具就能看到當前網站的HTML代碼了。如圖所示。
看到凌亂的HTML代碼之後,點擊下面我圈紅的滑鼠,然後你就能定位當前網站各個內容塊的HTML代碼了,比如下面選中(藍色)的這一塊區域的HTML代碼就會顯示在右上角了。這是超好用的工具幫你定位,以方便爬蟲代碼的撰寫。
我的爬蟲代碼的邏輯思路
進入鏈家網租房網站之後,你會發現你能每個房子點擊進去可以看到更詳細的房屋信息。如下圖所示。那我的代碼邏輯就是先從當前網站爬取每個房屋的詳細信息鏈接然後進去那個鏈接爬取更詳細的房屋信息,也就是我圈紅的內容。
不知道你們明白我在講什麼嗎【破涕而笑】
哈哈不好意思周興魯Agent 幫你出鏡了~
Post代碼之前簡單講一下這裡用到的幾個爬蟲Python包
- request: 就是用來請求對鏈家網進行訪問的包
- Beautiful Soup: 就是Python用來對HTML代碼進行解析、處理的包
當然大家還有許多爬蟲包可以使用,比如urllib,scrapy等等哈。
好吧下面簡單粗暴地post代碼吧
import requests from bs4 import BeautifulSoupfrom fake_useragent import UserAgent #導入各種爬蟲需要的包ua = UserAgent()headers = {User-Agent: ua.random} #使用隨機header模擬人類瀏覽器訪問,防止被發現!house_result=[] #創建一個list容器到時候放爬取到的數據for i in range(1,101): #共有100頁的租房信息,創建循環每一頁是一個循環 url=https://sh.lianjia.com/zufang/pg+str(i)+/ #每一頁的鏈接都不一樣,注意觀察 res=requests.get(url,headers=headers) #訪問 soup = BeautifulSoup(res.text,html.parser) #把網頁HTML轉化為soup以便下面使用 a=soup.find_all("div",class_="info-panel") #每一頁的房屋鏈接都在<div class=info-panel>這一塊下面,先取出所有這些塊 for j in range(len(a)): #創建循環,每一頁下面有30套房子需要獲取 try: link=a[j].find("a")["href"] #得到每一套詳細信息的鏈接 print (link) house_result.append(GetDetails(link)) #GetDetails是我寫的一個函數在線,將爬取的信息放進字典容器里 print (Page,i,-,j, done.) except: #except的作用是防止爬取過程中遇到error信息中斷爬取 print (Page,i,-,j, has issues.) continue #遇到error直接跳過,繼續下一套房屋信息的爬取 def GetDetails(url): detail={} #創建放置每套租房信息的字典容器 soup=BeautifulSoup(requests.get(url,headers=headers).text,html.parser) b=soup.find("div",class_="content zf-content") #每一套房屋的詳細信息都藏在<div class="content zf-content">這一塊下面 detail[月租金]=int(b.find("span",class_="total").text.strip()) detail[面積]=b.find_all("p",class_="lf")[0].text[3:].strip() detail[房屋戶型]=b.find_all("p",class_="lf")[1].text[5:].strip() detail[樓層]=b.find_all("p",class_="lf")[2].text[3:].strip() detail[房屋朝向]=b.find_all("p",class_="lf")[3].text[5:].strip() detail[地鐵]=b.find_all("p")[4].text[3:].strip() detail[小區]=b.find_all("p")[5].text[3:].split(-)[0].strip() detail[位置]=b.find_all("p")[6].text[3:].strip() return (detail) #依次爬取所需要的數據並返回這些數據
不知道你們能看懂我拙劣的表達嗎?希望聰明的你們能看懂哈哈~God Bless U!
爬完數據之後怎麼把數據表格化呢?
下面我們需要用pandas包把list容器裡面裝著的數據表格化。
簡單介紹一下Pandas是非常實用強大的數據分析Python包,可以導入數據,數據探索,
數據預處理,數據可視化等等。總之非常好用了。
記得導出數據!!
差點我就要把spyder(一個好用的代碼編輯器)給關了,關了的話list容器裡面的數據就會全部不見了。因此要記得把表格化的數據導出來,導出excel,csv等等格式都可以,取決你的偏好。
import pandas as pd #導入pandas包data=pd.Dataframe(house_result) #把裝著數據的house_result(list容器)轉換為數據框(表格化數據)data.to_csv(鏈家網租房數據.csv,encoding=utf_8_sig) #如果要導出為excel則改為to_excel,encoding是為了讓其顯示中文
導出數據之後打開然後要另存為一個新的csv否則數據下次打開中文都會不見了。非常重要!
來看看數據吧
看了是不是激起你好好賺錢的鬥志了呢哈哈哈哈哈哈哈哈哈哈
最後的最後!!
其實有點confused,明明說有25000+套房子在租,為什麼只顯示100頁,每頁只有30套(1000*30=3000)。也就是說我只能爬到3000套房子的數據??歡迎交流哎。
終於寫完了哈哈哈!開心!大家喜歡的話就點個贊留個言再走唄~歡迎大家交流哈。過幾天會對爬取的數據進行分析,敬請期待:鏈家網租房數據採集(Python)和分析:你的薪水能在上海租到怎麼樣的房子?(二)
么么噠,來咬我啊!
最後的最後謝謝這位大哥提供參考資料!!傳送門
推薦閱讀:
※簡單數據的處理、分析的學習與實踐筆記
※揭秘BDP的五大隱藏但超實用的功能,99%的人都會用到!
※如何快速搭建數據運營方案的優化思路框架
※2017,第一視角看數據
※用特徵選擇方法優化模型|python數據挖掘思考筆記(1)