【Python-爬蟲】某城租房數據全量採集項目

    互聯網時代,很多人迷戀網絡數據的採集,比如那堆擁有不同技術水平的爬蟲愛好者,或者是技術達到雲端的大咖。不管是自己需要用到該數據,還是僅僅是爲了淬鍊爬蟲技術,只要實施爬蟲行爲,都需要本着對自己負責且避免給目標站點施以強載荷的原則,紳士的、規範的獲取目標站點的數據。本文重在分享搭建爬蟲的思路,對某城的一些敏感技術會做特殊處理。

1 項目背景

    一位做學術研究的客戶,需要我國各城市的住房出租的數據,包括住房位置、交通情況、房間類型、房屋面積、月租價格等信息。在探索鏈家、安居客、貝殼、某城等租房網站後,發現某城的數據範圍最廣,最符合客戶的學術要求。
    同時,某城的反爬機制也超強,比如房間的關鍵數據利用自定義字體強加密、IP的超低頻率訪問限制、數據錯位渲染等。這就需要制定專門的爬蟲措施,來繞過該站點的反爬陷阱,實現數據提取。

2 站點探索

2.1 探索站點結構

2.1.1 地理範圍探索

    通過首頁源碼查看某城服務的範圍,包括各省各市各轄區等數據,及其對應的站點編碼。
在這裏插入圖片描述

2.1.2 數據列表存放探索

    通過瀏覽器審查網頁結構元素,發現所有的房間信息全部被存放到“ul”標籤、“class=“”house-list”屬性下。
在這裏插入圖片描述

2.1.3 數據字段標籤探索

    房間的租房信息中,價格的數據是和其他數據分離的,交錯放在不同的父級標籤下,但在列表上的索引位置沒有發生任何改變。
在這裏插入圖片描述

2.1.4 站點反爬機制探索

    房間數據列表中所有的阿拉伯數字都用自定義字體加密處理,直接獲取源碼得到的數據是無法識別的,需要要經過解密還原。
在這裏插入圖片描述
    在頻繁加載同一級別的網頁後,網站會封禁當前ip,需要手動解鎖後才能繼續。
在這裏插入圖片描述

2.2 對應方案架構

    在2.1的站點探索中,發現很多爬蟲的坑,下面給出了應對方案。

在這裏插入圖片描述

3 數據領儲流程

    對目標站點的結構、反爬機制探索過後,接下來就是編輯爬蟲機器人幫我們到站點領取數據。要編輯一個爬蟲機器人,需要怎麼做呢?看看下面的流程圖吧!

3.1 流程事項

3.1.1 必備工具

    在做數據採集項目之前,必須具備的三類工具:探索類、爬取類、儲存類。這三類工具使得數據採集工作形成一個完整的“生態鏈”,可以根據需求去探索到有哪些數據可能或者肯定有用,然後構建數據爬取規則去拿到這些數據,最後儲存在數據庫中。這三類工具具體都有哪些那?小落首推下面這幾款(百度-官網-安裝):

工具類型 重點推薦
探索類 ***GoogleChromeGoogle Chrome瀏覽器、FirefoxFirefox瀏覽器
爬取類 ***PythonPython語言、RR語言
儲存類 ***MySQLMy SQLMongoDBMongoDB

    小落在本次項目中,通過GoogleChromeGoogle Chrome探索租房數據在網頁源碼上的規則,再通過PythonPython來構建對於的採集機制,然後將數據存放到本地MySQLMy SQL服務器。如果採集的是非結構化數據如視頻、圖片這類二進制文件,可選擇MongoDBMongoDB作爲儲存類工具。無獨有偶,RR語言也可用於做爬蟲,FirefoxFirefox瀏覽器也可成爲探索類工具幫我們發現數據規則。

3.2.2 代理IP池

    代理IP池的搭建有很多方法,不同的方法使得獲得的IP質量各有差異,總的來說是花錢的效果好些。代理IP一般有如下三類方法:

方法 IP質量(*****) 小落資源
西刺免費代理搭建 **免費:較差,不穩定,要篩選,效率低、存活時間較短 https://github.com/lda188/my-data/blob/master/xici_mypool.py
快代理購買IP搭建 ***便宜:可直接獲取,不用篩選,存活時間較短 https://github.com/lda188/my-data/blob/master/kuai_ip.py
代理服務器搭建 ***比較貴:不需要在程序端接入IP,效率較高,存活時間較長 需下載代理軟件

    搭建代理IP池,可以通過Redis,Flask,Python結合搭建。我是直接單獨使用Python控制流+隊列實現。弄了兩個代理池,一個是基於西刺代理的免費代理池,一個是快代理購買IP搭建的便宜代理池。利用代理可以避免同一個真實IP頻繁訪問網站被封的坑。

3.3 數據採集

    前面已經說到了目標站點的數據規則探索,也提到了IP代理池的概念。那麼我們就可以利用Python編寫一個爬蟲機器人,它就幹一件事:喫掉一個url,吐出url下的結構化目標數據並存入My SQL 服務器。在數據建模時根據業務需求從數據庫提取數據使用。
在這裏插入圖片描述

4 項目實施

4.1 構建動態代理IP池

    下面這個框架是小落羅列的三類IP接入方式。其中,篩選隊列——從各代理網站爬取的免費代理質量較差,需要利用第三方站點進行測試,提取通過測試的IP進入中轉隊列;中轉隊列——向請求隊列補充IP,保證請求隊列的資源充足;請求隊列——用於向目標站點發出請求;廢棄隊列——儲存目標站點請求失敗的IP,作爲篩選排重條件。
在這裏插入圖片描述

小落從西刺、快代理資源搭建了兩個代理IP池,鏈接:
https://github.com/lda188/my-data/blob/master/xici_mypool.py
https://github.com/lda188/my-data/blob/master/kuai_ip.py

4.2 獲取深層URL

    先通過目標站點首頁,得到站點服務的所有城市編碼idl,利用城市編碼構建各城市的站點url向下賺取城市轄區的url—url_1.也就是爬蟲機器人的接入端:深層url隊列,結果如下圖示:
在這裏插入圖片描述

4.3 數據採集規則

    準確來說,站點的頁面數據字段被放在HTML的不同標籤下,他們可能是兄弟節點,也可能是並列交錯的節點。針對住房位置、交通情況、房間類型、房屋面積、月租價格等不同的數據,編寫了相應的方法實現。
在這裏插入圖片描述

4.4 組裝爬蟲機器人

4.4.1 本項目的探索

    將數據採集規則和動態代理IP結合,組件爬蟲機器人,實現網頁數據的自動化採集。最後的爬蟲啓動後獲得結果如下圖示:

    在遍歷結構中接入Room_page__(url)函數,便可以實現動態IP的接入。
在這裏插入圖片描述
    數據儲存到MySQL:
在這裏插入圖片描述

4.4.1 需要注意

    爬蟲最重要的難點之一是能夠不被目標站點拒絕訪問,這點在本項目探索中已經解決了。但到目前爲止,並沒有將整個機器人投入到某城租房數據的全量爬取中去,只是進行理論上的探索與驗證。某城租房數據的量特別龐大,只是上面驗證的技術肯定跑不下來,效率也會非常低,當然可以考慮用多線程分佈式爬蟲框架實現。小落只有一臺破舊的筆記本,首先設備這塊就不太支持啊,所以就沒有挑戰了,有條件的你可以試試。

5 小結

    本次項目探索得到有哪些成果呢?1.基於西刺代理、寬代理搭建了兩個動態IP代理池;2.探索了某城時下的網頁數據採集規則;3.組裝了一個單線程爬蟲機器人。當然,還有某城不同城市不同轄區的網頁編碼數據。
    本文中的技術只限於爬蟲思路的具體探索以及少量數據的爬取。若需要全量爬取,需要在設備資源支持的條件下結合本文的爬蟲邏輯搭建多線程爬蟲,可高效實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章