自己畢設做的是關于租房房價方面的分析,使用簡單的多元線性回歸模型來擬合租房的價格,需要采集一些租房的數據來做分析。我也就簡單的入門了爬蟲,陸續采集了自如、蘑菇租房、我愛我家的租房數據。本文對我學習爬蟲的過程做個總結。
一:爬蟲理解
個人對爬蟲的理解就是能夠按照自己的意愿和一定的規則,將互聯網上的數據抓取下來的工具。
我將爬蟲分為了兩類:簡單的和復雜的。
從規模上來看,簡單的爬蟲一般是由個人開發的,爬取的方式也比較簡單,一般屬于個人愛好啥的。復雜的爬蟲一般是由一個專門的團隊來開發和維護的,如谷歌百度等,用于大量的爬去互聯網上的數據。
從程序復雜度來看,簡單的爬蟲爬取易于爬取的數據,程序也不是很復雜,而復雜的爬蟲,需要考慮到各種異常,自動登錄,驗證碼識別,反爬等。
網上也有人總結了如下一張圖:
自己在圖中的定位是小批量爬取數據的編程愛好者。剛剛入門,先從小批量的數據爬起,要采集的租房數據每天也就3萬條左右。
要寫好一個爬蟲,還是需要一些基礎知識的,其中包括要了解網頁的基本構成、網絡請求、編程語言、數據庫、異常處理、熟悉常用的基本工具等,涉及到的方面還是比較廣。如果只是簡單的爬取一些數據,對每個方面可以淺嘗輒止,但是要是寫一個穩定、高性能、高可用的爬蟲,需要涉及的更深一些。下面總結一些入門爬蟲需要的基礎知識。
二:基礎知識
1、網頁的基本構成
網頁主要是由HTML,CSS,JavaScript組成。HTML作為網頁的骨架,CSS像人的衣服一樣,負責美化頁面,JavaScript為頁面加上行為。
如下圖所示:
要抓取的數據被一層又一層的被html的標簽包裹的,在抓取數據前,需要對網頁的結構進行仔細的分析,找到需要的數據在那個標簽下,標簽有什么特點。通過分析,就能從整個頁面中唯一定位到該數據的位置,這里面涉及到html結構,css選擇器(class,id選擇器)等知識。
我之前一直做PHP+web開發的,熟悉html,css,javascript等知識,對網頁的結構比較了解,基礎還是比較好的。
基礎的html,css知識可以到[w3cschool](http://www.w3school.com.cn/html/index.asp)上學習。
2、網絡請求
網絡請求主要包括URL的構成,網絡請求的方式和請求頭。網站的url都是有一定規則的,通過分析url可以唯一定位一個資源等,比如自如的每一個房源的鏈接格式為`http://www.ziroom.com/z/vr/60393569.html`,通過替換id,來定位不同的房源;翻頁的時候, 通過改變`http://www.ziroom.com/z/nl/z3.html?p=2`中p值來獲取不同的頁面。
爬蟲中常用的請求方式為get,post。請求網頁一般是get,一些api請求post。請求頭包含了公共部分,響應頭,請求頭,cookie等數據。
簡單的網站直接可以爬取數據,如蘑菇租房的房源信息接口。有些網站的api請求都是比較復雜的,需要偽造一些請求頭才能突破網站的防線,因此需要對網絡請求方面比較熟悉。偽造請求,就是接口要什么樣的數據,你就給它什么數據,這樣它才能給你返回你想要的數據。
3、Python
每一種編程語言,只要有網絡模塊,就可以用來寫爬蟲,只是每種語言寫的難易度等都不同。Python是做為爬蟲的主力語言,由于封裝的包比較多,使用起來特別方便。大部分爬蟲都是用Python寫的,因此需要掌握Python以下幾個方面的知識:
1、基礎的語法
2、數據結構
3、網絡請求
4、異常處理
5、文件、數據庫操作
6、常用爬蟲的包
我是今年2月中旬開始入門Python的,主要參考資料為 [Python 2.7教程 - 廖雪峰的官方網站](http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000)
4、數據存儲
采集下來的數據可以存放在文件中,也可以保存到數據庫中。文件在數據查詢,統計方面不方便,因此還是存放在數據庫中比較好。采集到的數據字段變化性比較大,不適合用mysql這種關系型數據庫,現在采用較多就是mongodb。mongodb比較靈活,可以隨意添加字段以及修改字段類型等。
使用數據庫就需要學習數據庫的安裝配置,id設計,增刪改查等操作,數據庫管理工具(如robomongo)使用,涉及內容比較多。
三:常用基本工具
工欲善其事,必先利其器。Python有很多有關爬蟲方面的包,讓數據采集起來更加簡單方便。入門至少需要掌握以下幾種工具:
頁面結構分析:chrome開發者工具,用于查看頁面結構,網絡請求等
網絡請求:urllib,urllib2,requests,用于發起網絡請求,下載數據
解析:BeatifulSoup、xpath、re,用于解析頁面,分離有用數據,這三個包組合起來使用功能更加強大
數據庫:pymongo,用于操作mongodb數據庫;robmongo,mongodb可視化工具
掌握以上幾個工具或者包,就可以爬取大多數互聯網上的數據。
可以參考資料:
[xpath](http://www.w3school.com.cn/xpath/index.asp)
[Python爬蟲利器三之Xpath語法與lxml庫的用法 | 靜覓](http://cuiqingcai.com/2621.html)
[Beautiful Soup 4.2.0 文檔 — Beautiful Soup 4.2.0 documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html)
[正則表達式30分鐘入門教程](http://deerchao.net/tutorials/regex/regex.htm)
當然,這些基礎知識是在邊用邊學中逐漸總結記錄,然后鞏固的。下面簡要介紹了自如數據的采集工作。
四:自如數據爬取介紹
自如網站比較好爬取,下載頁面,然后提取出數據,然后入庫。但即使是一個很簡單的爬蟲,在具體實現程序之前,最好先畫個流程圖。先了解需要哪些數據,需要的數據應該從哪來來,如何去獲取它,頁面如何解析,如何存放等,梳理出整個流程。然后分析哪里存在不足,提前解決。
有了整體的一個流程后,基本上就可以進行編碼實現。主要爬取的是房源的一些信息,包括區域、面積,價格,朝向等關鍵性的字段。從頁面結構分析數據的位置,然后綜合使用BeatifulSoup,re,xpath提取出數據。
最后采集到的數據做一次預處理,如數據格式化,異常值處理等工作,然后使用mongo進行存儲
五: 爬蟲代碼是不斷改進的過程
在數據采集過程中,初學時由于缺乏經驗,會遇到很多的問題:網絡錯誤,數據錯誤,無故終止,數據采集不夠完整等等異常情況。代碼就會不斷的進行修改,修改到一定程度又會進行代碼的重構,如之前所有的代碼都寫在一個腳本中,需要抽出公用的一些函數如數據庫操作等,以及使用Python的類編寫代碼等等。因此爬蟲代碼是不斷改進,逐漸的修復各種問題,讓爬蟲運行的更加穩定的過程。當然,隨著經驗的增加,在寫代碼之前就會想到很多的異常的情況,寫出的代碼就會更具穩定性。
如果要讓爬蟲每天都運行,又需要大量的精力去維護代碼。我每天都要手動運行爬蟲采集數據,雖然可以使用crontab定時采集,但是在不能絕對保持穩定的情況下,還是手動的先運行一段時間為好。隨著爬的越來越多,維護起來也就越來越困難,又會逐漸進行代碼改進。改進的過程是痛苦的,卻能學到很多的有用的知識和寶貴的經驗。
六:讓數據發揮價值
爬取數據只是第一步,最重要的是對數據的分析,使抓取到的數據產生價值。
基于前面的數據采集工作,我使用簡單的多元線性回歸模型來對合租的數據進行擬合,試圖去發現租房價格與房子本身一些特征之間的關系。
然后結合了自己的老本行,使用vue+echarts+BaiduMap+tornado搞了個前端,將采集到的數據可視化處理,便于發現更多的規律。
總結
通過對房屋數據的采集工作的梳理,從流程上,走通一遍整個爬蟲采集的各個環節,知道如何去寫一個爬蟲。從技術上,鞏固了編程語言,常用庫,數據庫等基礎知識,并且能夠綜合運用各項技術解決一系列的問題。從邏輯上,也完善了爬蟲各個環節上的異常處理,使爬蟲運行更加穩定。同時也充分結合了之前的技術棧,對數據進行可視化,挖掘出一些有用的價值。