網路爬蟲
來自專欄數據與AI5 人贊了文章
現在從網路爬蟲的五個方面開始講起,即定義,背景,原理,工具,實戰。
一:網路爬蟲定義
參考:百度百科網路爬蟲定義
網路爬蟲(又被稱為網頁蜘蛛,網路機器人,網頁追逐者等),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本,跟瀏覽器一樣,是一個web客戶端程序,如下圖:計算機網路本質上是一種傳播工具,方便人們更好的相互交流。計算機網路將原本世界上各個孤立的網路連接起來,由很多子網路進而形成一個非常大的網路,即萬維網。在這個大的網路里,網頁也將是成千上萬,數不甚數(截止到 2007 年底,Internet 上網頁數量超出 160 億個),導致人們很難去找到所需要的信息,如何有效地提取並利用這些信息成為一個巨大的挑戰。此時,搜索引擎也就出現了, 比如AltaVista,Yahoo!和Google,搜索引擎原理技術如下:
從上圖可以看出,數據的源頭是萬維網,而採集器是spider,也就是我們今天講的網路爬蟲。
三:網路爬蟲原理
由於網路爬蟲是數據採集存儲器,我們先來介紹網站的數據流向,這樣讓我們知道網路爬蟲處於哪一個流程,如下圖:
1.讓我們先看數據和信息的定義(引用《白話大數據與機器學習》):
數據:承載了"信息"的符號(數字,字元,字母,圖片,音頻,視頻等),才能被稱為數據。
信息:是用來消除隨機不確定性的證據或者憑證。至於信息的如何度量,可以參看資訊理論和概率統計相關學科。
2.完整的數據流圖:
網路爬蟲主要包含:媒體網路分析,網路採集,數據存儲,其中媒體網路分析主要指人工對web站點或者app的網路協議進行定量分析,人工確定採集策略和步驟,這一步是網路爬蟲最重要的,也是最難的;網路採集步驟主要是採集策略和步驟的演算法代碼實現,然後提取特徵欄位和一定程度的清洗轉換,存入到相關庫里(比如mysql,mongdb,redis,elasticsearch等);
數據建模與分析主要指機器學習演算法模型,為了更好的建模,在這裡一般會對原始數據根據模型的相關規則進行清洗轉換;
數據可視化和決策,就是數據BI, 根據模型進行預測分析之後,產生相關領域的報表,發現一定的規律,從而接著為客戶提供垂直領域的數據服務能力,最後客戶覺得該數據服務有很大的指導價值,比如定向精準投放廣告,為此客戶付出一定量的金錢到達數據變現。
這也是為什麼有價值的數據就像石油一樣,採集數據和石油開採本質是一樣,誰掌握了價值大的數據,誰就是行業老大,否則巧婦難為無米之炊,雲計算和AI都就像斷了源頭的水一樣,沒有活力!三: 網路爬蟲原理
網路爬蟲的原理就是:
(1)我們開發的網路爬蟲程序跟瀏覽器,app等一樣,本質上都是一個web客戶端;
(2)其中web客戶端通過發送request的方式經過web網路中轉到達web服務端,web把response通過web網路中轉給web客戶端,其中request是通過一定的協議格式封裝成的數據包,其中常見的應用層協議有:http(s)/ftp等。
(3)我們開發的網路爬蟲,本質就是模擬瀏覽器或者客戶端,讓程序的行為在伺服器看起來更像人一樣操作,就成功了;
(4)為了獲取伺服器的數據,我們的程序也要發送請求,這時候需要抓包程序(其實就是一個代理伺服器),常見的http/https抓包程序:瀏覽器開發者工具(這裡推薦chrome開發者工具);charles/fiddler/mitmproxy(命令行抓包工具,對接python腳本)等,我們要找到我們需要的網頁數據對應哪個具體的請求。【注意】:如果客戶端不是通過http(s)協議的話,而是ftp,或者更加底層協議的話,如tcp/udp等,我們就需要其他的抓包工具,比如wireshark其他工具進行抓包分析;
(5)我們開發的網路爬蟲程序,可以從兩個部分著手:
一般從圖中的【2】著手,通過抓包構造Request的方式,這是最常見的,也是效率最快的一種方式,常常會輔助反編譯app的手段; 另一種方式就是模擬,也是第一種方法解決不了的時候,即Request不容易構造,不容易還原,此時從第一步著手:比如,人操作瀏覽器/app的時候,進行各種點擊下拉等操作,我們也可以通過相關庫,進行動作流程制定,寫出相關腳本,定時驅動瀏覽器或者app去跑,然後捕獲特定請求的請求,通過插入的解析腳本解析得到數據即可,這種方式一般比較慢,採集的數據也會慢很多。4.網路爬蟲系統一般設計圖:
設計核心組件:
1.調度組件:比如select模塊或者Scheduler模塊,組要是隊列的設置,優先順序如何考慮,誰先抓,誰後抓,以及url去重的考慮;
2.下載組件:比如上面的crawl模塊或者downloader模塊,此處關鍵是構造requests,設置請求頭部,設置代理ip,設置cookie,構造好參數之間的關係,設置下載頻率,控制並發數等;
3.解析組件:上面的Extract模塊或者spider模塊,主要首先定義好要提取的欄位特徵,根據相應結果的欄位位置提取,常見方法是css選擇器,xpath, jmepath, 正則表達式等;
4.存儲組件:如上面的cache模塊,pages模塊等,將第3步提取的item或者特徵,進行一定的轉換存儲到相關庫中。
5.engine組件或者distribute組件,主要是協調上面各個組件相互協作,統一安排,分散式的核心是,把帶抓取的url庫存放到一個統一的庫進行維護,或者放到消息隊里,這樣是為了去重和優先順序調度。
四:網路爬蟲工具
這裡主要針對python相關開發,其他語言不是太熟悉,所以不作介紹,理論上每種語言都可以用來開發網路爬蟲程序,只不過是每種語言的開發效率和性能不一樣而已:
1.抓包工具[大多是一個代理web服務,監聽相應埠,截取相關協議請求]:
pc端:chrome開發者工具,charles工具,wiresharks,其他瀏覽器開發者工具等;移動端:charles, fiddler, mitmproxy, anyproxy等,後面兩個是命令行工具,方便對接程序腳本;
2.網路請求庫:
同步請求庫:requests, urllib等;
非同步請求庫:aiohttp, asyncio
等;
3. 自動化測試工具,主要用來模擬,一般需要搭配特定的驅動庫:
pc端:selenium, chromedriver, chrome-headless, phantomjs, casperjs等;
移動端:appnium等
4.解析庫:
lxml; Beatifulsoup; pquery; jmepath; Selector等
5.數據存儲庫:
mysql/pymysql; mongodb/pymongo; redis/redis-py; elasticsearch等
6.爬蟲框架庫:
pyspider/scrapy(twisted)/scrapy-splash/scrapy-redis等
7.javascript代碼執行庫:
selenium, splash, js2py, jsbeautifier,nodejs等
8.爬虫部署庫:
scrapyd/scrapyd-client/scrapyrt/docker/shell等
9.多進程與線程:
multiprocessing /threading等
五:網路爬蟲實戰:
一般要了解網路爬蟲建議從頭寫起,不要一開始使用框架,這樣可以熟悉整個具體流程:從網路請求,網路下載,內容解析,內容清洗和內容存儲,網路教程很多,這裡就不介紹很多了。
PS:網路爬蟲系統往往最難的幾點,在於性能優化和實時抓取以及覆蓋率,其次還有調度設計,爬取效率,去重,入庫效率,以及代理池和cookie池等的設計,而爬蟲系統抓取的數據往往也是互聯網數據的一滴水,微弱的忽略不計,本質就是一個採樣的思想,也就是互聯網數據的一個樣本,只有數據量達到一定的時候,才具有一定的可信度,否則得出的結論就是井底之蛙一樣以偏概全。最後提醒一點的是,你的爬蟲請求會佔用網路服務提供方伺服器的資源,盡量控制好你的頻率和請求並發連接數,盡量根據對方的Robot.txt和sitemap文件,進行文明道德抓取,否則有可能引起對方的訴訟!
推薦閱讀:
※基於PowerBI構建動態客戶價值模型RFM驅動客戶營銷
※揭秘BDP的五大隱藏但超實用的功能,99%的人都會用到!
※另外一款編輯器 Geany
※雨沐田:不要忽視簡單數據文本的力量
※《專利審查指南修改草案》將圖形用戶界面(GUI)納入外觀設計專利範圍內,這改變意味著什麼?