1. 程式人生 > >資料採集(四):用XPath爬取鏈家網房價資料

資料採集(四):用XPath爬取鏈家網房價資料

準備工作

編寫爬蟲前的準備工作,我們需要匯入用到的庫,這裡主要使用的是requests和lxml兩個。還有一個Time庫,負責設定每次抓取的休息時間。

import requests
import requests
import time
from lxml import etree

抓取列表頁

開始抓取前當然應該瞭解一下目標網站URL結構咯。

  • nj表示城市
  • /ershoufang/是頻道名稱
  • pg2是頁面碼。

我們要抓取的是南京的二手房頻道,所以前面的部分不會變,屬於固定部分,後面的頁面碼需要在1-100間變化,屬於可變部分。將URL分為兩部分,前面的固定部分賦值給url,後面的可變部分使用for迴圈遍歷頁面。

#設定列表頁URL的固定部分
url='http://nj.lianjia.com/ershoufang/'
#設定頁面頁的可變部分
page=('pg')
這裡提一個小小的醒,我們最好在http請求中設定一個頭部資訊,否則很容易被封ip。頭部資訊網上有很多現成的,也可以使用httpwatch等工具來檢視。
#設定請求頭部資訊
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept'
:'text/html;q=0.9,*/*;q=0.8', 'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Accept-Encoding':'gzip', 'Connection':'close', 'Referer':'http://www.baidu.com/link?url=_andhfsjjjKRgEWkj7i9cFmYYGsisrnm2A-TN3XZDQXxvGsM9k9ZZSnikW2Yds4s&wd=&eqid=c3435a7d00146bd600000003582bfd1f' }
以抓取前10個頁面為例,我們使用for迴圈生成1-10的數字,轉化格式後與前面的URL固定部分拼成要抓取的URL。這裡我們設定每兩個頁面間隔0.5秒。抓取到的頁面儲存在html中。
#迴圈抓取列表頁資訊
for i in range(1,11): if i == 1: i=str(i) a=(url+page+i+'/') r=requests.get(url=a,headers=headers) html=r.content else: i=str(i) a=(url+page+i+'/') r=requests.get(url=a,headers=headers) html2=r.content html = html + html2 #每次間隔0.5秒 time.sleep(0.5)

頁面解析

頁面抓取的工作算是完成了,內容在html中,下一步就要進行頁面解析了。我們使用lxml庫的xpath方法對頁面進行解析。

  • 注意指定解析器的編碼格式
encoding=requests.get(url,headers=headers).encoding
lj=etree.HTML(html,parser=etree.HTMLParser(encoding=encoding))

完成頁面解析後就可以對頁面中的關鍵資訊進行提取了。下面我們分別對房源的總價,房源資訊和關注度三部分進行提取。

把頁面div標籤中class=priceInfo的部分提取出來,並使用for迴圈將其中每個房源的總價資料存在tp中。

相關html原始碼如下:

  <div class="priceInfo"><div class="totalPrice"><span>360</span>萬</div><div class="unitPrice" data-hid="103101449315" data-rid="1411044934948" data-price="39353"><span>單價39353元/平米</span></div></div>

可以看出總價資料存放在div子節點span的string元素裡,用下面的xpath表示式把所有totalPrice解析出來

#提取房源總價
price=lj.xpath('//div[@class="priceInfo"]')

tp=[]
for a in price:
    totalPrice=a.xpath('.//span/text()')[0]
    tp.append(totalPrice)
抽取列印前10條房源總價資訊:
for p in tp[:10]:
    print p
480
360
190
335
182
210
466
86
308
163

提取房源資訊和關注度的方法與提取房源價格的方法類似,下面是具體的程式碼,房源資訊儲存在hi中,關注度儲存在fi中。

與房屋資訊相關html原始碼如下:

 <div class="houseInfo"><span class="houseIcon"></span><a href="https://nj.lianjia.com/xiaoqu/1411044934948/" target="_blank" data-log_index="2" data-el="region">銀城東苑紫荊苑 </a> | 2室2廳 | 91.48平米 | 南 | 精裝</div>

用如下xpath語句將其解析出來

#提取房源資訊
houseInfo=lj.xpath('//div[@class="houseInfo"]')

hi=[]
for b in houseInfo:
    house=b.xpath('.//text()')[0]+b.xpath('.//text()')[1]
    hi.append(house)
抽取列印前10條房屋資訊:
for i in hi[:10]:
    print i
龍鳳花園雋鳳園  | 4室2廳 | 112.36平米 | 南 北 | 簡裝 | 無電梯
銀城東苑紫荊苑  | 2室2廳 | 91.48平米 | 南 | 精裝
鎖金三村  | 2室1廳 | 61.59平米 | 南 北 | 其他 | 無電梯
文思苑  | 2室2廳 | 95.79平米 | 南 北 | 其他 | 有電梯
藍岸尚城  | 2室2廳 | 49.01平米 | 南 | 精裝
百家湖國際花園  | 2室1廳 | 78.12平米 | 南 | 其他 | 有電梯
萬科光明城市西苑  | 2室2廳 | 96.11平米 | 南 北 | 精裝
萬達紫金明珠  | 1室1廳 | 38.64平米 | 北 | 簡裝 | 有電梯
文化名園上築園  | 3室2廳 | 123.22平米 | 南 | 簡裝 | 有電梯
金龍花園  | 2室1廳 | 61.73平米 | 南 北 | 簡裝 | 無電梯

類似的,再提取關注度資訊:

#提取房源關注度
followInfo=lj.xpath('//div[@class="followInfo"]')

fi=[]
for c in followInfo:
    follow=c.xpath('./text()')[0]
    fi.append(follow)
抽取列印前10條房屋資訊:
for i in fi[:10]:
    print fi[0]
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出
158人關注 / 共59次帶看 / 6個月以前釋出

清洗資料並整理到資料表中

我們將之前爬取到的資訊進行彙總,並匯入pandas之中生成資料表。便於後面的分析。

#匯入pandas庫
import pandas as pd
#建立資料表
house=pd.DataFrame({'totalprice':tp,'houseinfo':hi,'followinfo':fi})
#檢視資料表的內容
house.head()
followinfo houseinfo totalprice
0 158人關注 / 共59次帶看 / 6個月以前釋出 龍鳳花園雋鳳園 | 4室2廳 | 112.36平米 | 南 北 | 簡裝 | 無電梯 480
1 29人關注 / 共22次帶看 / 22天以前釋出 銀城東苑紫荊苑 | 2室2廳 | 91.48平米 | 南 | 精裝 360
2 114人關注 / 共132次帶看 / 4個月以前釋出 鎖金三村 | 2室1廳 | 61.59平米 | 南 北 | 其他 | 無電梯 190
3 11人關注 / 共32次帶看 / 18天以前釋出 文思苑 | 2室2廳 | 95.79平米 | 南 北 | 其他 | 有電梯 335
4 156人關注 / 共106次帶看 / 2個月以前釋出 藍岸尚城 | 2室2廳 | 49.01平米 | 南 | 精裝 182

很尷尬的是,大家看得到,很多資訊是糊在一塊的,不能直接使用,所以咱們再做一些資料提取和清洗的工作。如房源資訊,在表中每個房源的小區名稱,戶型,面積,朝向等資訊都在一個欄位中,無法直接使用。需要先進行分列操作。這裡的規則比較明顯,每個資訊間都是以豎線分割的,因此我們只需要以豎線進行分列即可。

#對房源資訊進行分列
houseinfo_split = pd.DataFrame((x.split('|') for x in house.houseinfo),index=house.index,columns=['xiaoqu','huxing','mianji','chaoxiang','zhuangxiu','dianti'])
現在再來看看我們整理好的資料
#檢視分列結果
houseinfo_split.head()
xiaoqu huxing mianji chaoxiang zhuangxiu dianti
0 龍鳳花園雋鳳園 4室2廳 112.36平米 南 北 簡裝 無電梯
1 銀城東苑紫荊苑 2室2廳 91.48平米 精裝 None
2 鎖金三村 2室1廳 61.59平米 南 北 其他 無電梯
3 文思苑 2室2廳 95.79平米 南 北 其他 有電梯
4 藍岸尚城 2室2廳 49.01平米 精裝 None

把拆分後的資料拼接回原始資料中

#將分列結果拼接回原資料表
house=pd.merge(house,houseinfo_split,right_index=True, left_index=True)
house.head()
followinfo houseinfo totalprice xiaoqu huxing mianji chaoxiang zhuangxiu dianti
0 158人關注 / 共59次帶看 / 6個月以前釋出 龍鳳花園雋鳳園 | 4室2廳 | 112.36平米 | 南 北 | 簡裝 | 無電梯 480 龍鳳花園雋鳳園 4室2廳 112.36平米 南 北 簡裝 無電梯
1 29人關注 / 共22次帶看 / 22天以前釋出 銀城東苑紫荊苑 | 2室2廳 | 91.48平米 | 南 | 精裝 360 銀城東苑紫荊苑 2室2廳 91.48平米 精裝 None
2 114人關注 / 共132次帶看 / 4個月以前釋出 鎖金三村 | 2室1廳 | 61.59平米 | 南 北 | 其他 | 無電梯 190 鎖金三村 2室1廳 61.59平米 南 北 其他 無電梯
3 11人關注 / 共32次帶看 / 18天以前釋出 文思苑 | 2室2廳 | 95.79平米 | 南 北 | 其他 | 有電梯 335 文思苑 2室2廳 95.79平米 南 北 其他 有電梯
4 156人關注 / 共106次帶看 / 2個月以前釋出 藍岸尚城 | 2室2廳 | 49.01平米 | 南 | 精裝 182 藍岸尚城 2室2廳 49.01平米 精裝 None

使用相同的方法對房源關注度欄位進行分列和拼接操作。這裡的分列規則是斜槓。

#對房源關注度進行分列
followinfo_split = pd.DataFrame((x.split('/') for x in house.followinfo),index=house.index,columns=['guanzhu','daikan','fabu'])
#將分列後的關注度資訊拼接回原資料表
house=pd.merge(house,followinfo_split,right_index=True, left_index=True)
house.head()
followinfo houseinfo totalprice xiaoqu huxing mianji chaoxiang zhuangxiu dianti guanzhu daikan fabu
0 158人關注 / 共59次帶看 / 6個月以前釋出 龍鳳花園雋鳳園 | 4室2廳 | 112.36平米 | 南 北 | 簡裝 | 無電梯 480 龍鳳花園雋鳳園 4室2廳 112.36平米 南 北 簡裝 無電梯 158人關注 共59次帶看 6個月以前釋出
1 29人關注 / 共22次帶看 / 22天以前釋出 銀城東苑紫荊苑 | 2室2廳 | 91.48平米 | 南 | 精裝 360 銀城東苑紫荊苑 2室2廳 91.48平米 精裝 None 29人關注 共22次帶看 22天以前釋出
2 114人關注 / 共132次帶看 / 4個月以前釋出 鎖金三村 | 2室1廳 | 61.59平米 | 南 北 | 其他 | 無電梯 190 鎖金三村 2室1廳 61.59平米 南 北 其他 無電梯 114人關注 共132次帶看 4個月以前釋出
3 11人關注 / 共32次帶看 / 18天以前釋出 文思苑 | 2室2廳 | 95.79平米 | 南 北 | 其他 | 有電梯 335 文思苑 2室2廳 95.79平米 南 北 其他 有電梯 11人關注 共32次帶看 18天以前釋出
4 156人關注 / 共106次帶看 / 2個月以前釋出 藍岸尚城 | 2室2廳 | 49.01平米 | 南 | 精裝 182 藍岸尚城 2室2廳 49.01平米 精裝 None 156人關注 共106次帶看 2個月以前釋出

然後再刪除原先的列

house=house.drop(['houseinfo','followinfo'],axis=1)
print "共採集"+str(len(house))+"條房源資訊"
house.head()
共採集300條房源資訊
totalprice xiaoqu huxing mianji chaoxiang zhuangxiu dianti guanzhu daikan fabu
0 480 龍鳳花園雋鳳園 4室2廳 112.36平米 南 北 簡裝 無電梯 158人關注 共59次帶看 6個月以前釋出
1 360 銀城東苑紫荊苑 2室2廳 91.48平米 精裝 None 29人關注 共22次帶看 22天以前釋出
2 190 鎖金三村 2室1廳 61.59平米 南 北 其他 無電梯 114人關注 共132次帶看 4個月以前釋出
3 335 文思苑 2室2廳 95.79平米 南 北 其他 有電梯 11人關注 共32次帶看 18天以前釋出
4 182 藍岸尚城 2室2廳 49.01平米 精裝 None 156人關注 共106次帶看 2個月以前釋出

好了,這就是咱們對鏈家網的部分資料爬取過程了。
躍躍欲試的寶寶們何不自己動手,再解析一些內容試試。

相關推薦

資料採集XPath房價資料

準備工作 編寫爬蟲前的準備工作,我們需要匯入用到的庫,這裡主要使用的是requests和lxml兩個。還有一個Time庫,負責設定每次抓取的休息時間。 import requests import requests import time from lxml

資料採集XPath騰訊新聞

需要匯入的庫 import requests from lxml import etree 先用requests.get()方法請求頁面 result=requests.get("http://news.qq.com/") encode=resul

Python網路爬蟲selenium+chrome美女圖片

說明: Python版本:Python IDE:PyCharm chrome版本:我的版本63 chromedriver.exe:因為是模擬瀏覽器訪問,chrome需要再下載一個驅動,具體方式在我的上一篇部落格,內容很詳細。傳送門:Python網路爬蟲(

Python3學習筆記Python實現深度優先

這裡主要是用Python實現下深度優先的概念,由於程式碼寫得比較隨意,就沒有封裝成類,而是寫成一個函式 用一個列表做為實驗資料,模擬成二叉樹結構,用遞迴的方式不斷獲取二叉樹上的左節點,一直到左節點 序號超出列表範圍,然後迴歸獲取右節點,以此來實現深度優先。 以下是程式碼

再談資料結構排序與查詢

1 - 引言 雖然C++中的STL庫中提供了許多排序和查詢的方法。但是我們還是需要了解一下排序和查詢內部的原理,下面讓我們學習一下各類排序與查詢演算法 2 - 歸併排序 第一種高效的排序演算法是歸併排序,按照分治三步法,對歸併排序演算法介紹如下: 劃分問題:把序列分成

機器學習實驗tensorflow實現卷積神經網路識別人類活動

在近幾年,越來越多的使用者在智慧手機上安裝加速度感測器等一些裝置,這就為做一些應用需要收集相關的資料提供了方便。人類活動識別(human activity recognition (HAR))是其中的一個應用。對於HAR,有很多的方法可以去嘗試,方法的performance很大程度上依賴於特徵工程。傳統的機

挖掘演算法中的資料結構堆排序之 二叉堆Heapify、原地堆排序優化

不同於前面幾篇O(n^2)或O(n*logn)排序演算法,此篇文章將講解另一個排序演算法——堆排序,也是此係列的第一個資料結構—–堆,需要注意的是在堆結構中排序是次要的,重要的是堆結構及衍生出來的資料結構問題,排序只是堆應用之一。 此篇涉及的知識點有: 堆

例說linux核心與應用資料通訊對映裝置核心空間到使用者態

#include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #incl

MyEclipse整合SSM框架整合前端頁面,通過ajax請求獲得資料

Spring+SpringMVC+Mybatis 框架已經搭建完成,其中包括:(1)maven工程的搭建 (2)框架所需要的配置檔案的配置 (3)Mybatis 建立逆向工程連結資料庫。相應的配置檔案參見前幾篇部落格。此篇整理前端頁面傳送ajax 請求到後端,後端通過 Myb

python爬蟲實戰selenium爬蟲抓阿里巴巴採購批發商品

一、前言 二、學習資料(感謝分享) 三、開始爬取 1、先分析目標網址,為什麼選擇selenium 在搜尋中輸入女裝,用F12檢視原始碼,看看網頁顯示的內容是不是Ajax。點選Network,選擇下面的XHR,按F5重新整理頁面,下

八、學習爬蟲框架WebMagic---使用webmagic+Selenium小說

一、案例說明   本案例以爬取某小說網站某本小說為例(PS:避免商業問題,這裡不提小說網站名) 二、先期準備   關於 webmagic+Selenium 的相關依賴,參見 七、學習爬蟲框架WebMagic(三)—webmagic+Selenium爬取動態頁面 三、構建專案 (一

python爬蟲進階靜態網頁

一、文章說明 本文是在學習過程中的筆記分享,開發環境是win7,Python3,編輯器pycharm,文章中若有錯誤歡迎指出、積極討論。 另外,推薦一個比較好的爬蟲教程 二、課程基礎 1、HTML和CSS 爬蟲和網頁內容處處打交道,首先要掌握一部分前端內容。參考教程: 2、

租房資訊萬級資料的簡單實現

這不是一個很難的專案,沒有ajax請求,也沒有用框架,只是一個requests請求和BeautifulSoup的解析 不過,看這段程式碼你會發現,BeautifulSoup不止只有find和fing_all用於元素定位,還有fing_next等其他的更簡單的,

Scrapy實戰篇成交房源數據

html win64 4.0 https set 爬蟲 使用 創建 鼓樓區 在上一小節中,我們已經提取到了房源的具體信息,這一節中,我們主要是對提取到的數據進行後續的處理,以及進行相關的設置。 數據處理 我們這裏以把數據存儲到mongo數據庫為例。編寫pipelines.p

Scrapy實戰篇成交房源數據

meta pat 分割 自定義 是不是 rom 創建 開始 mat 今天,我們就以鏈家網南京地區為例,來學習爬取鏈家網的成交房源數據。 這裏推薦使用火狐瀏覽器,並且安裝firebug和firepath兩款插件,你會發現,這兩款插件會給我們後續的數據提取帶來很大的方便。 首先

Scrapy實戰篇天津租房數據

房子 爬取 思路 頁面 scrapy more 關心 分析 網上   以後有可能會在天津租房子,所以想將鏈家網上面天津的租房數據抓下來,以供分析使用。   思路:   1、以初始鏈接https://tj.lianjia.com/zufang/rt200600000001

Python地鐵房資料

#coding=gbk #因為涉及到中文,utf-8會報錯 ### 環境:Python 3.6### import requests import re import pandas as pd import csv from bs4 import BeautifulSoup

Android-音視訊5 Camera API 採集視訊資料並用SurfaceView顯示

0.許可權設定 之前的文章都忘記說明了許可權的設定,一起需要的許可權如下: <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission andro

任意戶密碼重置重置憑證未校驗

更多 key 得到 col word xxxx reset div chinese 在邏輯漏洞中,任意用戶密碼重置最為常見,可能出現在新用戶註冊頁面,也可能是用戶登錄後重置密碼的頁面,或者用戶忘記密碼時的密碼找回頁面,其中,密碼找回功能是重災區。我把日常滲透過程中遇到的案例

袋鼠雲數據中臺專欄戶標簽體系建設的字箴言

watermark 技術 不可 col cto 解讀 取數據 項目經理 itl 本文作者:子璽袋鼠雲數據中臺解決方案專家。擁有近10年大數據從業經驗,擁有PMP項目管理資格認證,精通數據類項目的開發實施和管理。曾服務過國家工商總局、北京市工商局、北京市財政局、廣州開發區大數