使用 Python 抓取房地產數據的數據抓取工具
已發表: 2019-08-12世界領先的房地產網站是寶貴數據的寶庫。 任何流行的美國房地產網站的數據庫都可能包含超過 1 億套房屋的信息。 這些房屋包括待售、出租,甚至是目前不在市場上的房屋。 抓取房地產數據還提供了稱為“Zestimates”的租金和財產估算數據。 它通過嘗試估計未來幾年的房產價格來幫助業主和客戶更好地計劃。
當談到購買或租賃房產時,我們知道首先想到的是價格比較。 這些房屋網站提供與該地區所有房源的價格比較,以及房屋類型、房間數量、大小、簡短描述等基本信息。
為什麼要從房地產網站抓取數據?
大型房地產上市公司以整個地區為目標,並在數百萬處房產上工作。 但是,如果您是房地產經紀人,與其嘗試自己手動收集數據,不如從主要的房地產上市網站上抓取數據。
您還可以構建機器學習模型來預測房產價格,並將您的預測與 Zillow 的 Zestimates 進行比較,看看哪個更好或更接近實際值。
如何使用 Python 抓取房地產數據?
如果您已經關注了我們之前的任何“如何爬行或逃生”文章,您可能已經在您的計算機上準備好了必要的設置。 如果你還沒有,我建議你先按照這篇文章設置數據抓取 python、它的包和文本編輯器,然後再開始使用代碼。
代碼在哪裡?
事不宜遲,我們決定為您提供使用 python 抓取房地產數據的代碼,該代碼將幫助您從房地產列表網站中提取信息。 數據爬取代碼是用 Python 編寫的,隨後,我將向您展示如何運行它以及運行後會得到什麼。
[代碼語言=“python”]
#!/usr/bin/python
# -*- 編碼:utf-8 -*-
導入 urllib.request
導入 urllib.parse
導入 urllib.error
從 bs4 導入 BeautifulSoup
導入 ssl
導入json
導入 ast
導入操作系統
from urllib.request 導入請求,urlopen
# 用於忽略 SSL 證書錯誤
ctx = ssl.create_default_context()
ctx.check_hostname = 假
ctx.verify_mode = ssl.CERT_NONE
# 用戶輸入
url = input('輸入 Zillow 房屋列表 URL-')
# 讓網站相信你正在使用 Mozilla 瀏覽器訪問它
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})
網頁 = urlopen(req).read()
# 創建html頁面的BeautifulSoup對象,方便提取數據。
湯= BeautifulSoup(網頁,'html.parser')
html = soup.prettify('utf-8')
屬性_json = {}
property_json['Details_Broad'] = {}
property_json['地址'] = {}
# 提取屬性列表的標題
對於 soup.findAll('title') 中的標題:
property_json['Title'] = title.text.strip()
休息
對於 soup.findAll('meta', attrs={'name': 'description'}) 中的元數據:
property_json['Detail_Short'] = meta['content'].strip()
對於soup.findAll('div',attrs = {'class':'character-count-truncated'})中的div:
property_json['Details_Broad']['Description'] = div.text.strip()
for (i, script) in enumerate(soup.findAll('script',
attrs={'type': 'application/ld+json'})):
如果我 == 0:
json_data = json.loads(script.text)
property_json['Details_Broad']['房間數'] = json_data['numberOfRooms']
property_json['Details_Broad']['樓層尺寸(平方英尺)'] = json_data['floorSize']['value']
property_json['Address']['Street'] = json_data['address']['streetAddress']
property_json['Address']['Locality'] = json_data['address']['addressLocality']
property_json['Address']['Region'] = json_data['address']['addressRegion']
property_json['地址']['郵政編碼'] = json_data['地址']['郵政編碼']
如果我 == 1:
json_data = json.loads(script.text)
property_json['Price in $'] = json_data['offers']['price']
property_json['Image'] = json_data['image']
休息
使用 open('data.json', 'w') 作為輸出文件:
json.dump(property_json, outfile, indent=4)

使用 open('output_file.html', 'wb') 作為文件:
文件.write(html)
print('———-數據提取完成。檢查json文件。———-')
[/代碼]
要運行上面給出的代碼,您需要將其保存在一個帶有擴展名的文件中,例如 propertyScraper.py。 完成後,從終端運行命令 -
[代碼語言=“python”]
python propertyScraper.py
[/代碼]
運行它時,系統會提示您輸入房產列表的 URL。 這是程序將實際抓取數據的網頁。 我們使用了兩個鏈接並抓取了兩個屬性的數據。 以下是鏈接——
- https://www.zillow.com/homedetails/638-Grant-Ave-North-Baldwin-NY-11510/31220792_zpid/
- https://www.zillow.com/homedetails/10-Walnut-St-Arlington-MA-02476/56401372_zpid/
在後面的子主題中給出的運行代碼時獲得的 JSON 文件。
代碼說明
在深入了解代碼的運行方式和返回內容之前,了解代碼本身很重要。 像往常一樣,我們首先點擊給定的 URL 並捕獲我們轉換成漂亮的湯對象的整個 HTML。 完成後,我們提取特定的 div、腳本、標題和其他具有特定屬性的標籤。 通過這種方式,我們能夠查明我們可能想要從頁面中提取的特定信息。
您可以看到我們還為每個屬性提取了一個圖像鏈接。 這是故意這樣做的,因為對於房地產之類的東西,圖像與其他信息一樣有價值。 雖然我們確實從房地產列表頁面中提取了幾個字段,但需要注意的是 HTML 頁面確實包含更多數據點。 因此,我們還將 HTML 內容保存在本地,以便您可以瀏覽它並抓取更多信息。
我們抓取的一些房屋清單
正如我們之前提到的,我們實際上為您抓取了一些屬性列表,以向您展示 Python 抓取的數據在 JSON 格式中的外觀。 此外,我們在 JSON 下提到了特定 JSON 的屬性。 現在讓我們談談我們抓取的數據點。
我們得到了房產的圖片(雖然每個房產的很多圖片都可以在列表頁面上找到,但我們每個都有一個 - 這是每個列表的頂部圖片)。 我們還獲得了它列出的價格(以美元為單位)、房產的名稱以及有助於您創建房產心理圖景的描述。
除此之外,我們還抓取了地址,分為四個獨立的部分:街道、地區、地區和郵政編碼。 我們還有另一個包含多個子字段的詳細信息字段,例如房間數量、樓層大小和詳細描述。 在某些情況下,我們在抓取多個頁面後發現該描述缺失。
[代碼語言=“python”]
{
“Details_Broad”:{
“房間數”:4,
“樓層尺寸(平方英尺)”:“1,728”
},
“地址”: {
“街道”:“格蘭特大街 638 號”,
“地點”:“北鮑德溫”,
“地區”:“紐約”,
“郵政編碼”:“11510”
},
“標題”:“638 Grant Ave, North Baldwin, NY 11510 | MLS #3137924 | 齊洛”,
“Detail_Short”:“638 Grant Ave , North baldwin, NY 11510-1332 是一棟單戶住宅,售價 299,000 美元。 這座 1,728 平方英尺的住宅是一個 4 床、2.0 浴室的房產。 在 Zillow 上查找 638 Grant Ave 住宅的 31 張照片。 在 Zillow 上查看更多房產詳情、銷售歷史和 Zestimate 數據。 MLS # 3137924”,
“以美元計價”:299000,
“圖片”:“https://photos.zillowstatic.com/p_h/ISzz1p7wk4ktye1000000000.jpg”
}
[/代碼]
[代碼語言=“python”]
{
“Details_Broad”:{
“描述”:“位於阿靈頓高地和阿靈頓中心之間的阿靈頓 Brattle 社區的三戶單戶住宅。 該住宅建於 1920 年代,提供精美的時代細節、硬木地板、橫梁天花板、帶私人日光浴室的壁爐客廳、正式餐廳、三間大臥室、一間辦公室和兩間全套浴室。 增強此屬性以擴大生活空間並根據您的個人品味個性化的潛力是非凡的。 靠近 Minuteman Commuter Bikeway、Rt 77 和 79 公交線路、學校、購物和餐廳。 提供虛擬舞台和虛擬裝修照片,幫助您進行可視化。”,
“房間數”:4,
“樓層尺寸(平方英尺)”:“2,224”
},
“地址”: {
“街道”:“核桃街 10 號”,
“地點”:“阿靈頓”,
“地區”:“MA”,
“郵政編碼”:“02476”
},
“標題”:“10 Walnut St, Arlington, MA 02476 | MLS #72515880 | 齊洛”,
“Detail_Short”:“10 Walnut St , Arlington, MA 02476-6116 是一棟單戶住宅,售價 725,000 美元。 這座 2,224 平方英尺的住宅是一個 4 床、2.0 浴室的房產。 在 Zillow 上查找 10 Walnut St 住宅的 34 張照片。 在 Zillow 上查看更多房產詳情、銷售歷史和 Zestimate 數據。 MLS #72515880”,
“以美元計價”:725000,
“圖片”:“https://photos.zillowstatic.com/p_h/ISifzwig3xt2re1000000000.jpg”
}
[/代碼]
[代碼語言=“python”]
{
“Details_Broad”:{
“房間數”:4,
“樓層尺寸(平方英尺)”:“1,728”
},
“地址”: {
“街道”:“格蘭特大街 638 號”,
“地點”:“北鮑德溫”,
“地區”:“紐約”,
“郵政編碼”:“11510”
},
“標題”:“638 Grant Ave, North Baldwin, NY 11510 | MLS #3137924 | 齊洛”,
“Detail_Short”:“638 Grant Ave , North baldwin, NY 11510-1332 是一棟單戶住宅,售價 299,000 美元。 這座 1,728 平方英尺的住宅是一個 4 床、2.0 浴室的房產。 在 Zillow 上查找 638 Grant Ave 住宅的 31 張照片。 在 Zillow 上查看更多房產詳情、銷售歷史和 Zestimate 數據。 MLS # 3137924”,
“以美元計價”:299000,
“圖片”:“https://photos.zillowstatic.com/p_h/ISzz1p7wk4ktye1000000000.jpg”
}
[/代碼]
大規模抓取房地產數據
使用這樣的代碼,您只能抓取與一些特定房地產相關的詳細信息。 您可以不時手動檢查您感興趣的屬性。 但是,如果您希望針對美國或國際上的特定地區,您需要專業的網絡抓取服務提供商或數據抓取工具來幫助您從多個網站收集房產列表。
PromptCloud 作為領先的網絡抓取提供商,認為網絡抓取解決方案應該是無障礙的,並且應該只包含兩個步驟——客戶端給出要求並接收乾淨的數據。
另外,請注意在博客中我們同時使用了爬蟲和刮刀。 不要混淆它們或多或少是相同的,但是如果您想了解更多信息,可以查看我們關於網絡數據抓取與網絡數據抓取的博客。
免責聲明:我們教程中的代碼僅用於學習目的。 我們不對它的使用方式負責,我們也不對源代碼的任何不利影響承擔任何責任。 我們網站上僅存在此代碼並不意味著我們提倡抓取或抓取文章中提到的網站。 本教程的唯一目的是展示為領先的門戶網站編寫網絡爬蟲的技術。 但是,我們沒有義務為代碼提供任何支持; 我們鼓勵您在評論部分添加您的問題和反饋,以便我們可以定期檢查和回复。
