首頁 > 上網技巧 > 電腦小技巧 > python爬取鏈家網租房數據

python爬取鏈家網租房數據

時間:2019-12-12 10:07 作者:QQ地帶 我要評論

寫在前面
前期文章和大家聊了一下怎么爬取多頁面網頁,了解了爬蟲的基本原理及步驟,那么本期小編準備再接再厲,介紹一下跨頁面爬蟲原理?紤]到八月將逝,九月即來,新的租房需求即將誕生,本期小編就來講一下怎么使用python爬取鏈家網上面的租房信息,希望對大家的租房有所幫助。下面正式開始!
 
準備工作及需求分析
跨頁面爬蟲的基本原理步驟小編已經在前期文章中有所介紹,這里就不再多說?紤]到任意的爬蟲都是提出網頁需求,獲得網頁,而后解析網頁獲得相關數據,最后保存數據用于分析,跨頁面爬蟲自然也逃不出這個套路。只不過相對于多頁面爬蟲來說,跨頁面爬蟲需要多定義一個爬取網頁鏈接的函數而已。本文仍然以python為工具詳細介紹怎么使用python以及相關的庫來爬取鏈家網的租房數據。在爬取租房數據開始之前,首先需要提出一個問題,在爬取過程中需要獲得什麼信息?這里小編認為,既然要爬取租房的相關信息,房源名稱自然是要需要的,房源的位置以及房價信息自然是少不了的,最終在考慮的諸多因素以及鏈家網的網頁構造之后,小編決定獲取十種租房信息:房源名稱、房源所在小區、房源所在商圈、房源所在區域、房源價格、房源面積、戶型、臨近地鐵、房源經紀以及相應的聯系號碼?紤]到小編住在廣州且對廣州情有獨鐘,這里的租房信息全部表現為廣州區域的租房信息,當然你也可以通過替換小編的代碼獲取不同城市的租房信息。既然已經了解了需求,那么下面就要正式開始爬蟲實戰了。在爬取之前,讓我們先導入相應的庫。
 
import requests 
from bs4 import BeautifulSoup
import xlwings as xw
import time
前兩個庫是完成爬蟲的主力,第三個庫是用來將數據存入Excel之中,至于第四個庫的導入主要是為了使用庫中的休眠函數,以應對反爬。因為跨頁面爬蟲需要爬取網頁鏈接以及爬取網頁內的信息,所以下面需要定義兩個函數,其中一個用來爬取網頁鏈接,另一個用來爬取詳細的網頁數據。下面首先介紹第一個函數。
 
網頁鏈接爬取函數構造
所謂網頁鏈接,就是指當你點擊之時會彈出另外的網頁,鏈家網上面的租房信息就是這種構造。當你在主頁中點擊房源的名稱之時,會彈出關于該房源的詳細信息,你所需要的租房數據就保存在詳細信息頁面中,但是為了達到詳細信息頁面,你必須先獲得達到這一頁面的網頁鏈接,這就是需要定義爬取網頁鏈接函數的原因。當然,說的好像很高大上,但是不得不說爬取網頁的鏈接是真的容易。
 
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) chrome_6494_1.html' target='_blank'>Chrome/xxxxxxxxx Safari/537.36'}   # 記得替換成你自己的請求頭文件
def get_url(url):
    res = requests.get(url,header = header)
    bsobj = BeautifulSoup(res.text,'lxml')
    urls = bsobj.select('#house-lst > li > div.info-panel > h2 > a')
上面的函數可以爬取一頁中所有房源的具體網頁鏈接,可以看到上面并沒有什麼新的命令,這些命令在前期的文章中都已有介紹,所以這里就不再贅述。通過這個函數,可以獲得進入詳細頁面的鏈接,因此下一步就是需要構造一個爬取詳細頁面數據的函數。
 
爬取詳細頁面數據
def get_info(url):
    res = requests.get(url,header = header)
    bsobj = BeautifulSoup(res.text,'lxml')
    title = bsobj.find('h1',{'class':'main'}).get_text()
    price = bsobj.find('span',{'class':'total'}).get_text()
    area = bsobj.find_all('p',{'class':'lf'})[0].get_text()[3:]
    house_type = bsobj.find_all('p',{'class','lf'})[1].get_text()[5:]
    metor = bsobj.find_all('p')[4].get_text()[3:]
    park = bsobj.find_all('p')[5].get_text().split('\n')[0][3:]
    distrinct = bsobj.find_all('p')[6].get_text().split(' ')[0][3:]
    bankuai = bsobj.find_all('p')[6].get_text().split(' ')[1]
    broker = bsobj.find('div', {'class': 'brokerName'}).get_text().split('\n')[1] if bsobj.find('div', {'class': 'brokerName'}) is not None else 0
    phone = bsobj.find('div', {'class': 'phone'}).get_text().strip().replace('\n', '').replace(' ', '') if bsobj.find('div', {'class': 'phone'}) is not None else 0
在獲取網頁信息時,小編采用了find和find_all函數,這里有必要介紹一下這兩個函數。這兩個函數正如其名字所示,根據函數中的參數選擇出相應內容,其中第一個參數為網頁標簽,第二個參數為屬性對,一般來說在網絡爬蟲中熟練掌握這兩個參數就可以了。這兩個函數典型的不同點就在于,find函數選擇出滿足參數設定的第一條內容,而find_all函數則用來選擇出所有滿足參數值的內容,并將這些內容構成列表,所以使用find_all參數常常伴隨有列表選擇。至于參數值的設定,則需要你掌握一些基本的網頁代碼知識,這里小編就不多說了,感興趣的朋友可以看一下相關的書籍。另外在代碼中,小編也使用了一些字符串操作函數,主要有三個:split、replace以及strip。第一個用來根據指定符號將字符串分割中列表;第二個函數用來替換字符串中的內容;第三個函數用來消除字符串中的空格。這三個函數在網絡爬蟲中使用較為頻繁,希望諸位朋友能夠熟練掌握,關于這幾個函數小編在前期的文章中也有所介紹,大家可以參看小編之前關于字符串介紹的那期文章。最后需要說明的是最后兩行代碼,這兩行代碼小編使用了二元選擇表達式,因為某些房源并沒有經紀人信息和聯系電話方面的信息,所以為了避免這種情況的出現造成程序的中斷,這里采用二元選擇表達式構造了變量值,這種表達式在一些場景中極其好用。既然已經有了相應的網頁鏈接爬取函數和具體網頁信息獲取函數,那么是時候將其整合在一起了,下面給出完整代碼。
 
爬取鏈接租房數據的詳細代碼
# _*_ coding:utf-8 _*_
"""
    @Author: liupu
    @Filename: lianjia_zufang.py
    @Date: 2018-8-20
    @Description:
        # usage: 爬取鏈家網租房數據
        # platform: win7 + python3 + visual studio code
"""
 
# 導入關聯庫
import requests 
from bs4 import BeautifulSoup
import xlwings as xw 
import time
 
# 創建Excel文件,并命名標題行
wb = xw.Book()
sht = wb.sheets[0]
sht.range('A1').value = '房源名稱'
sht.range('B1').value = '所在小區'
sht.range('C1').value = '所在商圈'
sht.range('D1').value = '區域'
sht.range('E1').value = '價格'
sht.range('F1').value = '面積'
sht.range('G1').value = '戶型'
sht.range('H1').value = '地鐵'
sht.range('I1').value = '經紀人'
sht.range('J1').value = '聯系電話'
 
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/xxxxxxxxx Safari/537.36'} 
# 構造爬取網頁鏈接的函數
def get_html(url,pages):
    res = requests.get(url,header = header)
    bsobj = BeautifulSoup(res.text,'lxml')
    urls = bsobj.select('#house-lst > li > div.info-panel > h2 > a')
    location = 2
    for url in urls:
        url = url.get('href')
        get_info(url,location,page = pages)
        location += 1
 
# 構造爬取詳細網頁網頁信息的函數
def get_info(url,location,page = 0):
    res = requests.get(url,header = header)
    bsobj = BeautifulSoup(res.text,'lxml')
    title = bsobj.find('h1',{'class':'main'}).get_text()
    price = bsobj.find('span',{'class':'total'}).get_text()
    area = bsobj.find_all('p',{'class':'lf'})[0].get_text()[3:]
    house_type = bsobj.find_all('p',{'class','lf'})[1].get_text()[5:]
    metor = bsobj.find_all('p')[4].get_text()[3:]
    park = bsobj.find_all('p')[5].get_text().split('\n')[0][3:]
    distrinct = bsobj.find_all('p')[6].get_text().split(' ')[0][3:]
    bankuai = bsobj.find_all('p')[6].get_text().split(' ')[1]
    broker = bsobj.find('div', {'class': 'brokerName'}).get_text().split('\n')[1] if bsobj.find('div', {'class': 'brokerName'}) is not None else 0
    phone = bsobj.find('div', {'class': 'phone'}).get_text().strip().replace('\n', '').replace(' ', '') if bsobj.find('div', {'class': 'phone'}) is not None else 0
# 存儲數據到Excel中
    sht.range(page * 30 + location, 1).value = title
    sht.range(page * 30 + location, 2).value = park
    sht.range(page * 30 + location, 3).value = bankuai
    sht.range(page * 30 + location, 4).value = distrinct
    sht.range(page * 30 + location, 5).value = price
    sht.range(page * 30 + location, 6).value = area
    sht.range(page * 30 + location, 7).value = house_type
    sht.range(page * 30 +location, 8).value = metor
    sht.range(page * 30 +location, 9).value = broker
    sht.range(page * 30 +location, 10).value = phone
 
# 運行程序
if __name__ == '__main__':
    urls = ['https://gz.lianjia.com/zufang/pg{}'.format(ii) for ii in range(1,101)]
    for ii,url in enumerate(urls):
        get_html(url,ii)
        time.sleep(1) 
    wb.save('lianjia_zufang.xlsx')
    wb.close()
爬蟲結果
現在已經成功爬取了鏈家上面的租房信息,并成功地將其存放在了Excel文件中,后續便可以采用這些數據進行相應的分析了。另外程序的完整代碼可以在作者的github獲得,關于小編的github賬號可以參看前期的文章。
 
后記
本文講到這里就暫告一段落了,本期文章和大家聊了一下怎么使用python去爬取鏈家網上面的租房信息,初步掌握了爬取跨頁面網頁的基本操作步驟。對于爬取到的數據,小編后續文章中會使用它們去分析一下租房市場的基本情況,當然如果需要這些數據的朋友也可以和小編留言,小編這里就不再上傳數據集(小編會在多爬取幾次之后形成一份更加完備的數據集之后再上傳數據集),敬請期待后續的租金數據分析文章。最后再次感謝你們的支持與鼓勵,你們的陪伴是小編前進的動力!

標簽: Python
頂一下
(0)
0%
踩一下
(0)
0%

Google提供的廣告

辽宁11选5任选四遗漏 怎样下载吉林彩票11选五 上海时时乐合法吗 三板市场股票交易规 四川金七乐彩开奖结果 恒牛所 湖北30选5中奖如何规则 什么网络游戏能赚钱 江西配资 甘肃快三1000期号码 配资365