范鵬程 涂嘉慶



摘要:該文基于Scrapy框架研究并實現了爬取溫州租房信息的爬蟲程序,程序采用分布式結構,運用去重算法去除重復URL提高爬蟲的效率,并針對反爬蟲策略提出多種解決方法。爬取的信息存儲在MongoDB數據庫中,最終通過測試和分析得出位置、朝向對溫州租房價格的影響,得出租房性價比較高的方案。
關鍵詞:租房爬蟲;Scrapy框架;分布式;去重策略
中圖分類號:TP274.2? ? 文獻標識碼:A
文章編號:1009-3044(2019)18-0004-03
Abstract: Based on the Scrapy framework, this paper studies and implements a crawler program for crawling Wenzhou rental information. The program adopts distributed structure, uses the de-duplication algorithm to remove duplicate URLs to improve the efficiency of crawler, and proposes various solutions for anti-crawler strategy. The crawled information is stored in the MongoDB database. Finally, the influence of location and orientation on the rent price of Wenzhou was obtained through testing and analysis, and gets a cost effective rental solution.
Key words: rent crawler; Scrapy framework; distributed strategy; de-duplication strategy
1 背景
隨著我國房價的不斷攀升,越來越多人選擇租房,特別是一些經濟發展比較靠前的城市,目前中國租房的人口已經達到2億多,數據顯示有將近三分之二的人通過網絡來獲取租房信息,有70%左右的房東會將租房信息掛在網上,但網上租房信息資源比較分散,當需要進行數據分析篩選出性價比合適的租房信息時需要消耗大量的時間去進行人工比對,十分不便。
溫州春節后有大量的外來務工人員回歸,其中大多數會選擇租房,這個時間也是各個高校開學的時間,有大量的學生租房,如何選擇一個性價比適合的房子就非常重要,本文基于Scrapy框架設計爬蟲程序爬取溫州租房信息,運用聚焦爬蟲收集溫州租房信息并篩選和分析,研究租房的朝向、位置對于溫州房價的影響,如何租房性價比最高。
2 相關技術
2.1 爬蟲技術
網絡爬蟲(Web crawler)也叫網絡蜘蛛(Web spider),螞蟻(ant)[1],是由程序設計者編寫的能自動抓取網頁信息并加以解析存儲的程序。一般先指定一個或多個初始的URL作為種子,在不斷抓取網頁信息的過程中將爬取到的新 URL存入URL訪問隊列中,在爬取完當前網頁資源后從URL訪問隊列中調出一個再次進行爬取,一直重復到滿足程序設計者的停止條件或者爬完URL隊列為止,爬取出的網頁資源會進行一定的解析、篩選然后存儲入數據庫中。本文研究的主要是聚集網絡爬蟲,聚焦網絡爬蟲顧名思義就是聚焦于一個主題,將與主題相關的網頁資源爬取并保存下來的爬蟲。
2.2 Scrapy框架
Scrapy是Python編寫的Crawler Framework,具有結構簡單、使用方便等特點[1]。Scrapy框架包含并發、存儲、監控等功能,并且框架提供基于Twisted異步的爬取,吞吐量十分可觀,爬取速度更快。
其基本工作原理就是Scrapy Engine作為大腦控制Spiders,Spiders讓Scheduler調出隊首的URL給Downloader,Downloader去網上下載相關的網頁資源交給Spiders對資源進行分析、篩選,再轉交給Item Pipeline進行數據庫保存,而在URL中解析出來的新的URL將被存入Scheduler的隊列中,循環上述抓取步驟,當Scheduler的隊列為空停止。
2.3 分布式爬蟲
分布式爬蟲的構架通常由一個Master服務器和若干個Slave服務器組成,Master服務器管理Redis數據庫中URL隊列,每當一個Slave服務器中的Scrapy爬蟲完成網頁資源的爬取,Master就會再分配一個隊首URL給Slave服務器,使爬蟲繼續爬行,而在爬取網站資源的過程中遇到的新URL則會繼續添加到Redis數據庫隊列中,當Redis數據庫為空或者滿足設定值時就停止爬取。這種分布式的構架讓多個爬蟲公用一個URL隊列,極大程度上加快了爬取效率,解決了Scrapy的單機局限性。
2.4 布隆去重
布隆過濾器是由巴頓布隆(Burton Howard Bloom)于1970年提出的一種基于多個哈希函數映射壓縮參數空間的數據結構[2],是一種二進制向量數據結構,主要的功能是判斷一個元素在不在一個集合內,爬取網站的過程中需要保存大量的URL,當獲得一個新的URL時,需要先判斷這個URL是不是已經爬取過了,如果已經存在了將跳過這個URL,不再進行保存。
布隆去重是內存去重的一種方法,不必在每一次判斷的時候都去調用數據庫查詢,而是在最初創建一個空的Bitmap集合,將得到的URL拆成多段,利用哈希算法生成相應個數的哈希值,然后將其映射到Bitmap集合中,若下一個URL拆封成多端經過哈希算法運算映射到Bitmap集合位置上的數值不全為1,則說明這個URL沒有被訪問過,若數值全為1則可能訪問過也有可能沒有訪問過,所以這一種算法會有一定的誤判率,但是卻能帶來存儲空間的極大節省。
2.5 反爬蟲策略
當運行爬蟲對網站進行訪問時,網站會在后臺對訪問進行統計,設定單個IP訪問的閾值,如果一個IP地址在短時間內訪問頻率超過閾值,可以暫時對這個IP予以封鎖[3],從而導致爬蟲無法正常運行,最終爬取信息失敗,所以可以合理的切換代理IP和使用分布式爬蟲來解決此問題。
當在一個網站訪問次數過多時網站會彈出驗證碼,輸入錯誤會導致爬蟲不能繼續爬取,可以利用第三方庫tesserocr來解決一部分容易識別的驗證碼,有背景的驗證碼則需要先對圖片灰度化,這樣的識別率會更高。
3 爬蟲設計與實現
3.1 目標網站選取
租房的房源一定要真實可靠,現在比較大且知名的租房網站有58同城、趕集網等,通過研究發現,58同城中的房源信息與其他網站有很高的重復率,而且58同城的租房網站中的價格參數并不能直接從爬取的HTML代碼中能得到,其中價格參數是通過Base64加密以后存放在JS中,每次刷新網頁時其中的映射關系都會再次發生改變,所以獲取價格都需要重新解密映射,浪費了時間又十分不便,趕集網中數據對比與58同城的租房數據有很高的重合率,沒有加密和JS渲染,可以提高爬蟲效率同時又降低了爬蟲制作難度,所以選取趕集網進行爬取。
3.2 爬蟲爬取流程
爬蟲開始爬取時需要一個或若干個鏈接作為種子,作為種子鏈接的網頁資源可以繼續拆封為若干個分頁鏈接,將鏈接放入一個隊列中,爬取到的租房信息存儲到數據庫中,若有下一頁則將下一頁的URL放入訪問的隊列中,循環這個過程直到隊列為空或滿足停止條件停止爬蟲,流程圖如下:
3.3 數據采集
3.3.1 Item設計
Item是Scrapy框架中的一種簡單容器,將抓取有一定關聯的非結構化數據保存成結構化數據,用于Pipelines數據庫存儲操作。
Scrapy框架中Field對象可以接收所有的參數類型,沒有值的限制,也沒有任何屬性。本文需要Field保存的租房參數有房間數、平方、朝向、裝修程度、地點、來源、價格等信息。
3.3.2 Spider設計
Spider中首先確定爬取的初始URL:wenzhou.ganji.com/zufang/,其中又分為鹿城、平陽、龍灣、甌海等地區,其URL格式為wenzhou.ganji.com/lucheng/chuzu/只用改動URL后綴參數就能更改地區,實現爬取不同地區的信息。
每個URL中會有多組數據,先利用Xpath對所需鏈接進行定位,Spider爬取并記錄下鏈接,進入鏈接打包所需參數到一個Item對象轉交給Pipelines,最后搜尋是否有下一頁的鏈接,若有則加入訪問的隊列,若沒有則切換地區進行爬取。
3.3.3 Middlewares設計
Middlewares.py中間件中設置IP代理可以有效防止同IP訪問次數過于頻繁而彈出驗證碼,在設置代理IP前首先需要獲得大量IP代理,許多網站有免費提供代理IP的服務,可以寫一個簡單的爬取程序將穩定可用的IP爬取保留下來。
爬蟲程序添加IP代理時需先在Setting配置文件中新增加IP池,池中加入用于切換的IP,Middlewares配置文件中設置Proxy對每次進行網站訪問的IP進行變更,保證不連續使用同一個IP多次訪問網站,當使用代理IP進行訪問返回403錯誤時,說明這個IP已經失效了,需要切換IP代理。
3.4 數據存儲
MongoDB是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統[3],在爬取數據存儲數據庫時不必關心表結構,可直接將字典結構的數據插入,十分方便。
Scrapy框架中運用MongoDB數據庫需要先編寫Settings,將MongoDB的連接參數寫入,在Piplines文件中加入MongoDBPipline類用于連接數據庫,在其中實現打開,關閉以及插入數據等方法,最后在插入方法中實現Item插入數據庫的方法,將爬取到的溫州租房信息插入數據庫保存。
3.5 數據分析
1)從溫州各區租房信息數量上看,租房信息最豐富的地區為鹿城區,占53%,甌海區和龍灣區次之,分別占16%和10%,其余地方占據21%。
2)從月每平方米單價上看,鹿城區的平均單價最高,達到43.96元/月/m?,甌海區排名第二,達到每月39.85元/月/m?,龍灣區排名第三,達到35.8元/月/m?,圖中也能看出朝向對于平均單價有一定的影響,朝北的房子一般比朝南的房子低大約2.47~8.65元/月/m?不等,其中對于甌海區的影響最大。
3)從溫州熱門地區租房價格圖上看,鹿城區的價格排名第一,其中以裝修精美的安瀾小區的84元/月/m?在溫州排名最高,甌海區排名第二,以新鑫小區61.32元/月/m?在甌海區排名最高,本文主要分析最熱門的溫州鹿城區:
4 結束語
溫州租房性價比高的地區分別為鹿城區的東部西部、甌海區的茶山附近、龍灣區的海濱和狀元附近、瑞安市的安陽附近、樂清的柳市和翁洋地區附近、永嘉的甌北附近,這些地區可以選擇朝南裝修稍好的房子,若需在鹿城區的南部、北部以及市中心位置租房,由于基礎房租較高,可以選擇不朝南且裝修一般的房子,這兩種選擇方法性價比最高。
本文基于Scrapy框架編寫了溫州租房信息爬蟲,通過數據比對分析篩選出具有性價比的溫州租房位置,研究出朝向對房價的影響,但也存在一些問題,在爬取網頁時Scrapy框架不支持具有JS渲染的網頁,布隆去重有一定的誤判率等,后續研究可以針對這幾個問題進行完善。
參考文獻:
[1] 馬聯帥. 基于Scrapy的分布式網絡新聞抓取系統設計與實現[D]. 西安: 西安電子科技大學, 2015.
[2] 張笑天. 分布式爬蟲應用中布隆過濾器的研究[D]. 沈陽: 沈陽工業大學, 2017.
[3] 安子建. 基于Scrapy框架的網絡爬蟲實現與數據抓取分析[D].長春: 吉林大學, 2017.
【通聯編輯:謝媛媛】