資料採集(四):用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項目管理資格認證,精通數據類項目的開發實施和管理。曾服務過國家工商總局、北京市工商局、北京市財政局、廣州開發區大數