一隻爬蟲(一)

免責的廢話

本篇無標題,都說爬蟲寫得好,牢飯吃到飽,原本不想寫爬蟲的,畢竟風險有點高,可是做爲一個搞搜索的人,怎麼能不瞭解一下爬蟲呢,怎麼能不本身深刻了解一下爬蟲的原理呢,並且,知道了爬蟲的通常性原理和一些開源的爬蟲框架之後,寫出一個本身的小爬蟲並非一件很難的事情,而一個本身的小爬蟲,有時候仍是頗有用的,好比....又好比....,只要發揮你的想象,爬蟲也能作不少事情。python

當今的互聯網世界,本質上是個數據的世界,誰掌握了數據誰就能獨步天下,可是,對於咱們這種互聯網上小嘍囉,數據確定是不會來主動找咱們爲咱們所用的,那麼,如何更高效的獲取你須要的數據,就變成了一門獨立的職業---爬蟲工程師(又稱看守所預科班),接下來幾篇文章,咱們拋開這些商業行爲,從純技術的角度來講一說爬蟲,這門和互聯網一塊兒誕生的古老技藝。算法

 對於爬蟲的歷史,咱們不作太多的介紹了,畢竟這些東西在網上一搜一大把,並且這個系列文章也沒有太多的爬蟲技巧,畢竟我也不是來教你如何吃牢飯的,懂得太多的爬蟲技巧,容易誤入歧途走向萬劫不復的深淵,這並非我寫這篇文章的初衷,同時,最重要的是,由於我也不會爬蟲的技巧,因此也沒辦法教你緩存

爲了讓你有個對爬蟲的總體瞭解,整個系列文章大概分爲幾個方面吧,一是爬蟲的原理,這裏會介紹一些爬蟲最底層的數據結構和原理,而後第二部分是一個簡單爬蟲的架構和模塊,這一篇會主要介紹一下要實現一個完整的爬蟲須要哪些個模塊,最後第三部分,我會基於Elasticsearch的插件實現一個簡單的爬蟲框架(放心,安全得狠,你拿去也沒用),另外,我想安利一下Elasticsearch這個搜索引擎,若是你把他的搜索屬性拋開,你會發現他能夠作不少事情,好比這裏就能夠用來作爬蟲,我還拿他作了緩存,消息隊列等等。。安全

好了,閒話少說(MD已經說了這麼多了),咱們開始爬蟲之旅吧。服務器

基礎的基礎

  
提及爬蟲的基礎,其實只有兩點:網頁的下載和連接的遍歷,幾乎全部的資料跟你說的都是,一個爬蟲都是從一批種子網頁開始爬取,而後分析頁面中的連接,再將連接再爬取一遍,如此反覆,直到把整個互聯網爬完,好像很簡單,寫代碼出來不就是一個for循環裏面一堆curl麼。微信

咱們從一個最簡單的爬蟲開始,一步一步升級咱們的爬蟲,經過一個一個的點,讓他進化成一個分佈式的,可自由擴展的爬蟲。數據結構

丐中丐版

丐中丐版本沒啥好說的,直接上代碼:多線程

import requests
content=requests.get("http://www.baidu.com")
print content

上面這三行作爲丐中丐沒問題吧,三行代碼爬下百度,丐中丐版本沒啥好說的,但這也是一個爬蟲最核心的需求,就是爬下一個網頁。從丐中丐版出發,咱們解決一些問題之後,就能夠變成一個比較強大的爬蟲了,首先須要解決的就是如何遍歷頁面。架構

頁面遍歷

上面的丐中丐版本,只是一個頁面,對於一個爬蟲,咱們須要解決的問題是,讓爬蟲能夠一直運行下去,也就是能夠獲取到網頁中的連接,這裏就涉及到第一個爬蟲相關的知識點,廣度優先搜索和深度優先搜索。廣度優先和深度優先是大學數據結構的基礎內容,相似於樹結構中的前序遍歷,通常在搜索一個圖的數據結構中使用這兩種搜索算法,首先,咱們簡單介紹一下這兩種搜索算法,總體上來講,深度優先就是壓棧,彈棧,廣度優先就是入隊,出隊。框架

深度優先搜索(DFS)

DFS就是儘量的往深處遍歷,直到遍歷到沒有節點了或者遇到已經遍歷過的節點了,再返回到上一級,找到下一個節點,繼續上面的過程。

image.png

對於上面這個圖來講,深度優先搜索的路徑就是:A -- B -- D -- E -- F -- C

對於DFS來講,實現起來比較簡單,每遍歷到一個節點,就把這個節點壓棧,而後再在這個節點上找一條路徑繼續遍歷下一個節點,遍歷到之後,再壓棧,直到遍歷到的節點沒有路徑可走了,這時候彈棧,找另一條路徑繼續遍歷,如此反覆,這樣的實現方式,若是圖很複雜的話,棧很容易爆掉,而互聯網這張用超連接鏈接起來的圖,複雜性就不用多說了吧,因此對於爬蟲來講,若是採用這樣的方式進行遍歷,通常會設置一個搜索深度,到達這個深度就不在搜索了,省得內存給爆了。

廣度優先搜索(BFS)

BFS和深度優先不一樣的在於,每遍歷到一個新的節點,先把和這個新節點相鄰的節點遍歷完,而後一個一個依次深刻到下一個層級,繼續上面的過程。
image.png
對於上圖來講,廣度優先搜索的路徑就是: A -- B -- C -- D -- E -- F

對於BFS來講,實現起來也不是很複雜,通常都是使用隊列的方式來實現,每遍歷到一個節點,就把這個節點上的一級路徑走一遍,找到相鄰的全部節點,而後把這些節點壓到隊列裏面去,每次從隊列的頭部取出節點出來,重複上面的過程,BFS比較好進行異步化和多線程的操做,經過設置隊列的長度,也能夠很好的控制內存,而且不會出現遍歷不到的狀況,因此通常使用這種搜索方法來爬取數據也比較常見。

頁面優先級

在一個爬蟲系統中,單使用廣度優先算法或者單使用深度優先算法,實際上都不能達到很好的效果,由於有些網站是比較重要的,有些網站是一些歪瓜裂棗的網站,把流量耗費在這些歪瓜裂棗上,獲取的數據也沒什麼價值,因此通常都會在把網頁塞到隊列的時候給一個優先級,優先級高的頁面先爬取,帶優先級的隊列實現起來比較容易,由於這裏的優先級並無很是細的粒度,因此給幾個不一樣優先級的隊列,根據給定的不一樣優先級放入到不一樣的隊列中,取數據的時候優先取最高優先級的那個隊列就好了。

優先級隊列和實現方法都有了,那優先級如何斷定呢,這就是一個開放性的問題了,方法有不少種,好比,獲取到一個待爬取的網頁後,看一下這個網站的alax排名,排名高的優先級高,好比前100名的放到最高優先級裏面,1000名的放到次優先級隊列中,依次類推;又好比,經過本身的分析,若是是詳情頁面,優先級高,若是是列表類的頁面,優先級低,這種在爬取某些特定的網站的時候能夠用,好比你爬某些電商的搜索列表頁,翻頁的連接優先級能夠低一點,各個詳情頁面能夠高一點;總之,優先級的這一塊和你爬取的實際狀況是強相關的,具體如何打分就仁者見仁智者見智了。

總結

這一篇簡單的介紹了一下爬蟲的知識,爬蟲涉及的方面很是廣,任何一個小的方向均可以深挖很多,好比代理服務器部分就能夠作很多東西出來,另外,如今內容都在各類阿啪啪上,如何優雅的模擬出手機去阿啪啪爬數據也是一個複雜的問題,有時候爲了爬取出阿啪啪中的廣告信息,還須要模擬出地理位置信息,否則廣告出不來,而全部的這些,被爬取人也是知道的,他會用各類辦法來防止你爬取他的數據,因此這也是一個鬥智鬥勇的工程,另外,特別須要注意的是,有些數據是不容許爬取的,好比涉及我的隱私的數據,有版權申明的數據,或者你把你爬取的數據拿出去賣,這些都得考慮法律問題。總之,從純技術的角度上來講,爬蟲仍是頗有意思也頗有技術深度的,但使用爬蟲的時候請想清楚,這些能爬嗎?

若是你以爲不錯,歡迎轉發給更多人看到,也歡迎關注個人公衆號,主要聊聊搜索,推薦,廣告技術,還有瞎扯。。文章會在這裏首先發出來:)掃描或者搜索微信號XJJ267或者搜索西加加語言就行

圖片描述

相關文章
相關標籤/搜索