亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python實(shí)現(xiàn)爬取房源信息的示例詳解

 更新時間:2022年09月14日 09:21:40   作者:派森醬  
站在一個租房人的立場,租房平臺實(shí)在太多了,并且各平臺篩選和排序邏輯都不太一致。這篇文章將教教大家如何利用Python語言實(shí)現(xiàn)爬取房源信息,需要的可以參考一下

前言

最近由于工作突然變動,新的辦公地點(diǎn)離現(xiàn)在的住處很遠(yuǎn),必須要換房子租了。

我坐上中介的小電驢,開始探索城市各處的陌生角落。

在各個租房app之間周轉(zhuǎn)的過程中,我屬實(shí)有些焦頭爛額,因?yàn)樾收娴暮艿拖拢?/p>

首先,因?yàn)楦炎≡谝黄穑枰瑫r考慮兩人的上班路程,但各平臺按通勤時長找房的功能都比較雞肋,有的平臺不支持同時選擇多個地點(diǎn),有的平臺只能機(jī)械的取到離各個地點(diǎn)通勤時長相同的點(diǎn),滿足不了使用需求。

其次,站在一個租房人的立場,租房平臺實(shí)在太多了,并且各平臺篩選和排序邏輯都不太一致,導(dǎo)致很難將相似房源的信息進(jìn)行橫向比較。

但是沒有關(guān)系,作為一名程序員,當(dāng)然要用程序員的方法來解決問題了。于是,昨晚我用一個python腳本,獲取了某租房平臺上海地區(qū)的所有房源信息,一共2w多條:

下面就把本次爬數(shù)據(jù)的整個過程分享給大家。

分析頁面,尋找切入點(diǎn)

首先進(jìn)入該平臺的租房頁面,可以看到,主頁上的房源列表里已經(jīng)包括了我們所需要的大部分信息,并且這些信息都能直接從dom中獲取到,因此考慮直接通過模擬請求來收集網(wǎng)頁數(shù)據(jù)。

因此接下來就要考慮怎么獲取url了。通過觀察我們發(fā)現(xiàn),該地區(qū)一共有2w套以上的房源,而通過網(wǎng)頁只能訪問到前100頁的數(shù)據(jù),每頁顯示數(shù)量上限是30條,算下來就是一共3k條,無法獲取到全部信息。

不過我們可以通過添加篩選條件來解決這個問題。在篩選項(xiàng)中選擇“靜安”,進(jìn)入到如下的url:

https://sh.lianjia.com/zufang/jingan/

可以看到該地區(qū)一共有2k多套房源,數(shù)據(jù)頁數(shù)為75,每頁30條,理論上可以訪問到所有的數(shù)據(jù)。所以可以通過分別獲取各區(qū)房源數(shù)據(jù)的方法,得到該市所有的數(shù)據(jù)。

https://sh.lianjia.com/zufang/jingan/pg2/

點(diǎn)擊第二頁按鈕后,進(jìn)入到了上面的url,可以發(fā)現(xiàn)只要修改pg后面的數(shù)字,就能進(jìn)入到對應(yīng)的頁數(shù)。

不過這里發(fā)現(xiàn)一個問題,相同的頁數(shù)每次訪問得到的數(shù)據(jù)是不一樣的,這樣會導(dǎo)致收集到的數(shù)據(jù)出現(xiàn)重復(fù)。所以我們點(diǎn)擊排序條件中的“最新上架",進(jìn)入到如下鏈接:

https://sh.lianjia.com/zufang/jingan/pg2rco11/

用這種排序方式獲得的數(shù)據(jù)次序是穩(wěn)定的,至此我們的思路便有了:首先分別訪問每個小地區(qū)的第一頁,然后通過第一頁獲取當(dāng)前地區(qū)的最大頁數(shù),然后訪問模擬請求訪問每一頁獲取所有數(shù)據(jù)。

爬取數(shù)據(jù)

有了思路之后就要動手寫代碼了,首先我們要收集包含所有的鏈接,代碼如下:

#?所有小地區(qū)對應(yīng)的標(biāo)識
list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu']
#?存放所有鏈接
urls?=?[]
for?a?in?list:
????urls.append('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a))
????#?設(shè)置請求頭,避免ip被ban
????headers?=?{'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.9?Safari/537.36'}
????#?獲取當(dāng)前小地區(qū)第1頁的dom信息
????res?=?requests.get('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a),?headers=headers)
????content?=?res.text
????soup?=?BeautifulSoup(content,?'html.parser')
????#?獲取當(dāng)前頁面的最大頁數(shù)
????page_num?=?int(soup.find('div',?attrs={'class':?'content__pg'}).attrs['data-totalpage'])
????for?i?in?range(2,page_num+1):
????????#?將所有鏈接保存到urls中
????????urls.append('https://sh.lianjia.com/zufang/{}/pg{}rco11/'.format(a,i))

之后,我們要逐一處理上一步得到的urls,獲取鏈接內(nèi)的數(shù)據(jù),代碼如下:

num=1
for?url?in?urls:
????print("正在處理第{}頁數(shù)據(jù)...".format(str(num)))
????res1?=?requests.get(url,?headers=headers)
????content1?=?res1.text
????soup1?=?BeautifulSoup(content1,?'html.parser')
????infos?=?soup1.find('div',?{'class':?'content__list'}).find_all('div',?{'class':?'content__list--item'})

整理數(shù)據(jù),導(dǎo)出文件

通過對頁面結(jié)構(gòu)的觀察,我們能得到每個元素存儲的位置,找到對應(yīng)的頁面元素,就能獲取到我們需要的信息了。

這里附上完整的代碼,感興趣的朋友可以根據(jù)自己的需要,替換掉鏈接中的地區(qū)標(biāo)識和小地區(qū)的標(biāo)識,就能夠獲取到自己所在地區(qū)的信息了。其他租房平臺的爬取方式大都類似,就不再贅述了。

import?time,?re,?csv,?requests
import?codecs
from?bs4?import?BeautifulSoup

print("****處理開始****")
with?open(r'..\sh.csv',?'wb+')as?fp:
????fp.write(codecs.BOM_UTF8)
f?=?open(r'..\sh.csv','w+',newline='',?encoding='utf-8')
writer?=?csv.writer(f)
urls?=?[]

#?所有小地區(qū)對應(yīng)的標(biāo)識
list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu']
#?存放所有鏈接
urls?=?[]
for?a?in?list:
????urls.append('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a))
????#?設(shè)置請求頭,避免ip被ban
????headers?=?{'User-Agent':?'Mozilla/5.0?(Windows?NT?10.0;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/81.0.4044.9?Safari/537.36'}
????#?獲取當(dāng)前小地區(qū)第1頁的dom信息
????res?=?requests.get('https://sh.lianjia.com/zufang/{}/pg1rco11/'.format(a),?headers=headers)
????content?=?res.text
????soup?=?BeautifulSoup(content,?'html.parser')
????#?獲取當(dāng)前頁面的最大頁數(shù)
????page_num?=?int(soup.find('div',?attrs={'class':?'content__pg'}).attrs['data-totalpage'])
????for?i?in?range(2,page_num+1):
????????#?將所有鏈接保存到urls中
????????urls.append('https://sh.lianjia.com/zufang/{}/pg{}rco11/'.format(a,i))

num=1
for?url?in?urls:
????#?模擬請求
????print("正在處理第{}頁數(shù)據(jù)...".format(str(num)))
????res1?=?requests.get(url,?headers=headers)
????content1?=?res1.text
????soup1?=?BeautifulSoup(content1,?'html.parser')
????#?讀取頁面中數(shù)據(jù)
????infos?=?soup1.find('div',?{'class':?'content__list'}).find_all('div',?{'class':?'content__list--item'})

????#?數(shù)據(jù)處理
????for?info?in?infos:
????????house_url?=?'https://sh.lianjia.com'?+?info.a['href']
????????title?=?info.find('p',?{'class':?'content__list--item--title'}).find('a').get_text().strip()
????????group?=?title.split()[0][3:]
????????price?=?info.find('span',?{'class':?'content__list--item-price'}).get_text()
????????tag?=?info.find('p',?{'class':?'content__list--item--bottom?oneline'}).get_text()
????????mixed?=?info.find('p',?{'class':?'content__list--item--des'}).get_text()
????????mix?=?re.split(r'/',?mixed)
????????address?=?mix[0].strip()
????????area?=?mix[1].strip()
????????door_orientation?=?mix[2].strip()
????????style?=?mix[-1].strip()
????????region?=?re.split(r'-',?address)[0]
????????writer.writerow((house_url,?title,?group,?price,?area,?address,?door_orientation,?style,?tag,?region))
????????time.sleep(0)
????print("第{}頁數(shù)據(jù)處理完畢,共{}條數(shù)據(jù)。".format(str(num),?len(infos)))
????num+=1

f.close()
print("****全部完成****")

經(jīng)過一番操作,我們獲取到了當(dāng)?shù)馗髯夥科脚_完整的房源信息。至此,我們已經(jīng)可以通過一些基本的篩選方式,獲取自己需要的數(shù)據(jù)了。

到此這篇關(guān)于Python實(shí)現(xiàn)爬取房源信息的示例詳解的文章就介紹到這了,更多相關(guān)Python爬取房源信息內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入淺析Python中的yield關(guān)鍵字

    深入淺析Python中的yield關(guān)鍵字

    python中有一個非常有用的語法叫做生成器,所利用到的關(guān)鍵字就是yield。接下來腳本之家小編給大家?guī)砹薖ython中的yield關(guān)鍵字詳細(xì)解析,感興趣的朋友參考下吧
    2018-01-01
  • python使用imap-tools模塊下載郵件附件的示例

    python使用imap-tools模塊下載郵件附件的示例

    imap-tools模塊是python的第三方擴(kuò)展,?它使用標(biāo)準(zhǔn)庫imaplib,并將常見的郵件處理事件封裝,郵件處理起來代碼短,下面給大家介紹下python使用imap-tools模塊下載郵件中的附件示例代碼,感興趣的朋友一起看看吧
    2021-12-12
  • python 判斷是否為正小數(shù)和正整數(shù)的實(shí)例

    python 判斷是否為正小數(shù)和正整數(shù)的實(shí)例

    這篇文章主要介紹了python 判斷是否為正小數(shù)和正整數(shù)的實(shí)例的相關(guān)資料,這里提供實(shí)例,實(shí)例注釋說明很清楚,需要的朋友可以參考下
    2017-07-07
  • python批量生成本地ip地址的方法

    python批量生成本地ip地址的方法

    這篇文章主要介紹了python批量生成本地ip地址的方法,實(shí)例分析了Python實(shí)現(xiàn)生成本地IP地址并綁定到網(wǎng)卡上的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 超詳細(xì)注釋之OpenCV制作圖像Mask

    超詳細(xì)注釋之OpenCV制作圖像Mask

    這篇文章主要介紹了OpenCV制作圖像Mask,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實(shí)例詳解

    Python多線程操作之互斥鎖、遞歸鎖、信號量、事件實(shí)例詳解

    這篇文章主要介紹了Python多線程操作之互斥鎖、遞歸鎖、信號量、事件,結(jié)合實(shí)例形式詳細(xì)分析了Python多線程操作互斥鎖、遞歸鎖、信號量、事件相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • python 實(shí)現(xiàn)ping測試延遲的兩種方法

    python 實(shí)現(xiàn)ping測試延遲的兩種方法

    這篇文章主要介紹了python 實(shí)現(xiàn)ping測試延遲的兩種方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Pygame淺析動畫精靈和碰撞檢測實(shí)現(xiàn)方法

    Pygame淺析動畫精靈和碰撞檢測實(shí)現(xiàn)方法

    這篇文章主要介紹了利用pygame完成動畫精靈和碰撞檢測,代碼詳細(xì),內(nèi)容豐富,對于想要學(xué)習(xí)pygame的朋友來講是一個不錯的練習(xí),需要的朋友可以參考下
    2023-01-01
  • 基于Python詞云分析政府工作報告關(guān)鍵詞

    基于Python詞云分析政府工作報告關(guān)鍵詞

    這篇文章主要介紹了基于Python詞云分析政府工作報告關(guān)鍵詞,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • 利用Python批量處理多個txt文本的示例代碼

    利用Python批量處理多個txt文本的示例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Python批量處理多個txt文本的方法,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-10-10

最新評論