1. 程式人生 > >python爬蟲實踐——零基礎快速入門(四)爬取小豬租房資訊

python爬蟲實踐——零基礎快速入門(四)爬取小豬租房資訊

接下來我們爬取小豬短租租房資訊。進入主頁後選擇深圳地區的位置。地址如下:
http://sz.xiaozhu.com/

一,標題爬取

按照慣例,我們先複製標題的xpath資訊,多複製幾個進行對比:

這裡寫圖片描述

//*[@id="page_list"]/ul/li[1]/div[2]/div/a/span
//*[@id="page_list"]/ul/li[2]/div[2]/div/a/span
//*[@id="page_list"]/ul/li[3]/div[2]/div/a/span
//*[@id="page_list"]/ul/li[4]/div[2]/div/a/span
#.....               ......

對比後發現,標題只是 li[] 序號發生改變,於是我們很快寫出標題的通用 xpath 資訊

//*[@id="page_list"]/ul/li/div[2]/div/a/span

這是固定套路啊。於是我們先把整頁的標題爬取下來:

#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time

url3 = 'http://sz.xiaozhu.com/'
data3 = requests.get(url3).text
h = etree.HTML(data3)
titles = h.xpath('//*[@id="page_list"]/ul/li/div[2]/div/a/span/text()')
time.sleep(2)#注意,小豬在發爬蟲方面做得比較好,防止被封IP就加個睡眠吧
for title in titles:
    print (title)

注意,注意,注意~~重要的事情要說三遍,我剛開始沒有加睡眠,結果他把我IP給封了,封了,我滴媽,那我還怎麼展示我的結果啊,特麼都不讓我訪問了,嗚嗚,所以這裡大家一定要注意,加個睡眠時間,並且這個睡眠時間稍微長一點,5s 以上應該就不會被封了吧,如果還被封,那那那~就太噁心了。

哎,說多了都是淚啊,大家一定好奇我的IP後來怎麼樣了?
沒管,第二天解封了,哈哈哈~~~

結果展示:

毗鄰海上世界 交通便利 無敵海景 賽車公寓
1號主人房|1.8米床  前海園林式小區公寓
【紅山站】近深圳北站龍星河傳奇宜家風一房一廳
【平時訂房租二送一】近木棉灣地鐵站/整租兩房
CBD藝術空間大套房 深圳最中心位置
複式書房+獨立花園陽臺|前海園林式小區
步行至會展中心地鐵上蓋陽光一居室
6特價 西鄉地鐵站/西鄉天虹樓上匯一城 下左
羅湖文錦口岸黃貝嶺新秀地鐵口摩登兩房整租
5號飄窗次臥|前海園林式小區公寓
福田CBD會展中心旁兩房
高爾夫球場邊的家-趣園私人酒店公寓
深圳灣科技園高新園地鐵口永珍天地極簡兩房一廳
4西鄉地鐵站/西鄉天虹 樓上小區 匯一城
LifeHome生活家 深圳第一最美高階民宿
2西鄉地鐵站/西鄉天虹 樓上小區 匯一城
會展中心/福田口岸 地鐵口兩房 出差居家首選
1獨衛主臥 西鄉地鐵/西鄉天虹樓上小區匯一城
#棲息地#羅湖口岸/東門老街地鐵口/北歐一居
【超暖和暖氣】Loft大房 近深圳北
東門老街~地鐵口~【清新風格】小鹿屋
超低價 近羅湖口岸火車站 國貿東門溫馨兩居
蛇口中心水灣地鐵90平兩房一低密度電梯洋房
(特惠)寶安中心/地鐵口/機場高層海景1居

OK,我們再選中房屋的整體資訊。

這裡寫圖片描述

整體xpath和標題xpath資訊對比如下:

整體:  //*[@id="page_list"]/ul/li
標題:  //*[@id="page_list"]/ul/li/div[2]/div/a/span

發現了什麼?對咯,就是標題在整體的div裡面去找,於是可以修改程式碼如下:

home = h.xpath('//*[@id="page_list"]/ul/li')
for div in home:
    title = div.xpath('./div[2]/div/a/span/text()')[0]
    
    #先找出每個房屋的所有資訊,再從中找出標題

OK,完善一下程式碼,並執行看看:

#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time

url3 = 'http://sz.xiaozhu.com/'
data3 = requests.get(url3).text
h = etree.HTML(data3)
home = h.xpath('//*[@id="page_list"]/ul/li')
time.sleep(2)#注意,小豬在發爬蟲方面做得比較好,防止被封IP就加個睡眠吧
for div in home:
    title = div.xpath('./div[2]/div/a/span/text()')[0]
    print ("租房標題:",title)

    

結果展示:

呵呵,IP被封了展示不出來,大家自己執行看看效果

二、其他資訊爬取

基本的框架搭好了,接下來我們就往框架裡填充其他資訊。
對比其他元素的xpath

整體://*[@id="page_list"]/ul/li
標題://*[@id="page_list"]/ul/li[1]/div[2]/div/a/span
價格://*[@id="page_list"]/ul/li[1]/div[2]/span[1]/i
描述://*[@id="page_list"]/ul/li[1]/div[2]/div/em
圖片://*[@id="page_list"]/ul/li[1]/a/img

於是我們可以寫出如下程式碼:

for div in home:
    title = div.xpath('./div[2]/div/a/span/text()')[0] #標題
    price = div.xpath('./div[2]/span[1]/i/text()')[0]#價格
    describle = div.xpath('./div[2]/div/em/text()')[0].strip()#描述
    photo = div.xpath('./a/img/@lazy_src/')[0] #圖片

現在我們來爬取一下看看結果:

#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time

url3 = 'http://sz.xiaozhu.com/'
data3 = requests.get(url3).text
h = etree.HTML(data3)
home = h.xpath('//*[@id="page_list"]/ul/li')
time.sleep(2)#注意,小豬在發爬蟲方面做得比較好,防止被封IP就加個睡眠吧
for div in home:
    title = div.xpath('./div[2]/div/a/span/text()')[0] #標題
    price = div.xpath('./div[2]/span[1]/i/text()')[0]#價格
    describle = div.xpath('./div[2]/div/em/text()')[0].strip()#描述
    photo = div.xpath('./a/img/@lazy_src/')[0]
    print ("{}-->{}-->{}\n{}".format(title,price,describle,photo))

結果展示:

呵呵,IP被封了展示不出來,大家自己執行看看效果

三、爬取5頁資料

看一下翻頁以後的url變化:

第一頁:http://sz.xiaozhu.com/search-duanzufang-p1-0/
第二頁:http://sz.xiaozhu.com/search-duanzufang-p2-0/
第三頁:http://sz.xiaozhu.com/search-duanzufang-p3-0/
第四頁:http://sz.xiaozhu.com/search-duanzufang-p4-0/

可以發現url的變化非常規律,只是p後面的數字不一樣而已,而且跟頁碼的序號一模一樣,哈哈,這真是天助我也。

於是乎,加個迴圈我們就可以爬取多個頁面的資料了。

for i in range(1,6):
	url3 = 'http://sz.xiaozhu.com/search-duanzufang-p{}-0/'.format(i)

來看一下爬取5個頁面的程式碼執行結果:

#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time

for i in range(1,6):
    url3 = 'http://sz.xiaozhu.com/search-duanzufang-p{}-0/'.format(i)
    data3 = requests.get(url3).text
    h = etree.HTML(data3)
    home = h.xpath('//*[@id="page_list"]/ul/li')
    time.sleep(2)#注意,小豬在發爬蟲方面做得比較好,防止被封IP就加個睡眠吧
    for div in home:
        title = div.xpath('./div[2]/div/a/span/text()')[0] #標題
        price = div.xpath('./div[2]/span[1]/i/text()')[0]#價格
        describle = div.xpath('./div[2]/div/em/text()')[0].strip()#描述
        photo = div.xpath('./a/img/src/')[0]
        time.sleep(2)
        print ("{}-->{}-->{}\n{}".format(title,price,describle,photo))

結果展示:

龍華公園/深圳北站/清湖地鐵旁溫馨2居-->348-->整套出租/2室1廳/2張床/宜住4人
['../images/lazy_loadimage.png']
小清新複式 南山中心/深圳灣口岸/南油批發城-->488-->整套出租/2室1廳/2張床/宜住4人
['../images/lazy_loadimage.png']

OK,通過兩個例項的練習,我相信大家已經差不多上手了,這些都是比較簡單基礎的東西,當然後面還會遇到比較複雜的,比如資料處理等,但是基本思路大致是相同的,大家一定要獨立練習幾次,多踩幾次坑,不要怕遇到困難,不懂就多去練習和嘗試,直到能獨立寫出程式碼為止。

其實爬蟲最主要的還是細心,要多思考,相信你會有不同的收穫。