Python實現(xiàn)爬取房源信息的示例詳解_第1頁
Python實現(xiàn)爬取房源信息的示例詳解_第2頁
Python實現(xiàn)爬取房源信息的示例詳解_第3頁
Python實現(xiàn)爬取房源信息的示例詳解_第4頁
Python實現(xiàn)爬取房源信息的示例詳解_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Python實現(xiàn)爬取房源信息的示例詳解目錄前言分析頁面,尋找切入點爬取數(shù)據(jù)整理數(shù)據(jù),導(dǎo)出文件

前言

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

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

在各個租房app之間周轉(zhuǎn)的過程中,我屬實有些焦頭爛額,因為效率真的很低下:

首先,因為跟女友住在一起,需要同時考慮兩人的上班路程,但各平臺按通勤時長找房的功能都比較雞肋,有的平臺不支持同時選擇多個地點,有的平臺只能機械的取到離各個地點通勤時長相同的點,滿足不了使用需求。

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

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

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

分析頁面,尋找切入點

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

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

不過我們可以通過添加篩選條件來解決這個問題。在篩選項中選擇靜安,進入到如下的url:

/zufang/jingan/

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

/zufang/jingan/pg2/

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

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

/zufang/jingan/pg2rco11/

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

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

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

#

所有小地區(qū)對應(yīng)的標識

list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu']

#

存放所有鏈接

urls

=

[]

for

a

in

list:

urls.append('/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'}

#

獲取當前小地區(qū)第1頁的dom信息

res

=

requests.get('/zufang/{}/pg1rco11/'.format(a),

headers=headers)

content

=

res.text

soup

=

BeautifulSoup(content,

'html.parser')

#

獲取當前頁面的最大頁數(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('/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ū)標識和小地區(qū)的標識,就能夠獲取到自己所在地區(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)的標識

list=['jingan','xuhui','huangpu','changning','putuo','pudong','baoshan','hongkou','yangpu','minhang','jinshan','jiading','chongming','fengxian','songjiang','qingpu']

#

存放所有鏈接

urls

=

[]

for

a

in

list:

urls.append('/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'}

#

獲取當前小地區(qū)第1頁的dom信息

res

=

requests.get('/zufang/{}/pg1rco11/'.format(a),

headers=headers)

content

=

res.text

soup

=

BeautifulSoup(content,

'html.parser')

#

獲取當前頁面的最大頁數(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('/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

=

''

+

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,

ar

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論