背景
從去年開始大灣區、豪宅稅的取消、行示範區的概念,深圳房地產市場可謂是紅紅火火,未買房的剛需瑟瑟發抖。現在經歷過疫情影響深圳房價市場到底如何了?那麼寫個小爬蟲爬取下鏈家網站,大致瞭解下當下深圳房市的整體情況。
因爲網站主要是js動態渲染,因此普通的http請求獲取不到動態數據,這裏主要採用selenium ,selenium技術是一個用於Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣,支持大多數常見的瀏覽器。
selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。
廢話不多說直接上源代碼,大家也可以直接通過附件下載源代碼跑一跑數據。
from selenium import webdriver
from lxml import html
base="https://sz.lianjia.com"
fileObject = open('sampleListnanshan.txt', 'w')
browser = webdriver.Chrome("/Users/house/Downloads/chromedriver")
datasets = []
def get_singel_cummunity_data(community):
datas=""
try:
browser.get(community)
innerHTML = browser.execute_script("return document.body.innerHTML")
trees = html.fromstring(innerHTML)
result_name = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[1]/div/a[1]/text()') # 小區名
result_number = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[4]/div[2]/text()') # 帶看數據
mean_price = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[1]/a/text()') # 小區均價
days90 = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[3]/a/text()') # 近90天成交
onsale = trees.xpath('//*[@id="sem_card"]/div/div[1]/div[2]/div[2]/div[2]/text()') # 小區在售
print(""+result_name[0]+",近30天帶看:"+result_number[0]+",均價:"+mean_price[0]+"近90天成交:"+days90[0]+",在售套數:"+onsale[0])
datas= ""+result_name[0]+","+result_number[0]+","+mean_price[0]+","+days90[0]+","+onsale[0]
return datas
except:
print("this community dataset get error"+str(community))
#return datasets
## 獲取區域裏面的小區
def get_all_communites_by_region(region):
browser.get(region)
innerHTML = browser.execute_script("return document.body.innerHTML")
tree = html.fromstring(innerHTML)
communities = tree.xpath('/html/body/div[4]/div[1]/ul/li/div[2]/div/a/@href') # 獲取某個片區數據
#小區列表頁
return communities
## 獲取某個區的街道辦
def get_all_regions_by_district(district):
browser.get(district)
innerHTML = browser.execute_script("return document.body.innerHTML")
tree = html.fromstring(innerHTML)
regions = tree.xpath('/html/body/div[3]/div[1]/dl[2]/dd/div/div[2]/a/@href') # 獲取所有區下面的區域
return regions
2
## 獲取深圳所有的小區
url='https://sz.lianjia.com/xiaoqu/' #需要爬數據的網址
def get_all_districts(url):
browser.get(url)
innerHTML = browser.execute_script("return document.body.innerHTML")
tree = html.fromstring(innerHTML)
districts = tree.xpath('/html/body/div[3]/div[1]/dl[2]/dd/div/div[1]/a/@href') # 獲取所有區
print(districts)
return districts
#burl='https://sz.lianjia.com/xiaoqu/baoanqu/' #需要爬數據的網址
#furl='https://sz.lianjia.com/xiaoqu/futianqu/' #需要爬數據的網址
nurl='https://sz.lianjia.com/xiaoqu/nanshanqu/' #需要爬數據的網址
#luohuurl='https://sz.lianjia.com/xiaoqu/luohuqu/' #需要爬數據的網址
#strict=get_all_districts(url) #可以抓取深圳所有區的鏈接
#print("深圳的所有區"+str(strict))
districts=['https://sz.lianjia.com/xiaoqu/nanshanqu/']
datasets = [] #存儲每個小區信息的數組
regions=get_all_regions_by_district(nurl)
for region in regions:
datasets.append(region)
communities=[]
if region.startswith(base):
communities=get_all_communites_by_region(region)
else:
communities=get_all_communites_by_region(base+region)
datas="" # 某個小區數據
for community in communities:
if community.startswith(base):
datas=get_singel_cummunity_data(community)
else:
datas=get_singel_cummunity_data(base+community)
datasets.append(datas)
for ip in datasets:
fileObject.write(ip)
fileObject.write('\n')
fileObject.close()
browser.close()
運行結果:
主要採集了每個小區近30天帶看次數,均價,近90天成交套書,以及在售套數。
關鍵點解析:
1、瀏覽器指定
browser = webdriver.Chrome("/Users/house/Downloads/chromedriver")
這塊要替換成自己電腦瀏覽器執行文件路徑,也可以選擇其它瀏覽器去執行抓取,chrome注意要下載對應的的執行文件,https://www.cnblogs.com/EthanHe97/p/11270528.html
2、頁面Xpath解析抽取
如上圖通過定位對應的字段copy xpath 就可以 獲取裏面的內容 如
onsale = trees.xpath(’//*[@id=“sem_card”]/div/div[1]/div[2]/div[2]/div[2]/text()’)#
具體xpath規則可以自行google。
結果圖
根據南山區爬行的結果,統計成圖標如上圖,Y軸是帶看次數,x軸是價格,可以看出帶看多的 還是便宜的房子。
這裏只是簡單的採集了每個小區的部分數據,數據輸出到一個txt文件當中可以大致看到每個片區鏈家上的帶看、銷售情況,大致判斷出哪些片區比較火,哪些樓盤價格低等信息。