1. 程式人生 > >網路爬蟲是個什麼東西(一)

網路爬蟲是個什麼東西(一)

          大學最後時期比較認真的研究和開發的爬蟲程式,日子長了為了防止忘記索性記個日記,也方便其他初級入門的人,過程比較艱辛,不過還是很有樂趣。

           網路爬蟲一直是很熱的話題,行業標杆Google,Baidu,  這都不用多說了,網路爬蟲就是為其提供資訊來源的程式。對於當時的我接觸這個東西還是一臉懵逼,也懷疑這些大公司開發的東西豈是我等草民,所能參悟到的。熱情還是驅使我買了很多書,看的也是雲裡霧裡,沒得到什麼靈感。最後在圖書館,找的一本封存在角落裡<<網路機器人java程式設計指南>>給了我很大啟發。

           開始進入正題,網路爬蟲其實是一種機器人程式,什麼是機器人程式,就是替人類做重複性工作的程式,比如說:你得到了一份很無趣的工作,你的老闆叫你每天把隔壁競爭對手公司網站主頁內容複製下來儲存到word給他(也沒誰了),接下你會開啟瀏覽器,輸入隔壁公司的網址, 進入主頁,滑鼠一劃,然後Ctrl+C 和 Ctrl + V, ,儲存world,萬事大吉。  突然有一天你公司強大了, 競爭對手範圍上升到了50個, 還是重複之前的流程,還好CV大法練得比較純熟,下班前就完成了,不過想想以後這要是幾百個,幾千個競爭對手,我的天啊,要累死朕啊!內心極度渴望一種程式可以擺脫這無聊的工作,幸好是個程式猿,所以要寫個程式幫我完成這些工作。

           我們怎麼設計這個程式呢, 首先我要將50個公司的網址儲存起來,迴圈他每個網址,訪問網站,找到內容,儲存到本地。這就是爬蟲程式,名字聽起來高大上,其實爬蟲就是幫你解決這些重複的操作而已。所以他之後寫了一個程式碼:

                  main()

                 {

                              url[50]                  //50個公司地址

                              loop(i < 50)         //迴圈50次, for迴圈,while迴圈,只要是個迴圈就行。

                              {

                                    request url[i];       //獲取網頁

                                    Ctrl + C;            //複製

                                    Ctrl + V;            //貼上

                                    i++;

                              }

                 }

            我的天啊,這也叫程式碼。 這個程式猿碰到了問題,怎麼獲取網頁? 怎麼樣才能找到想要的內容儲存呢?以後幾百個網站幾千個網站,儲存這些網址陣列難道我還要一遍一遍輸入?問題總要一個一個解決。

            首先我們是通過瀏覽器輸入網址獲取到我們想要的網頁, 那瀏覽器是怎麼做到的呢,你是否會有過這樣的經歷,熱切等待電視劇的更新,說好的19點更新,怎麼還不更新,重新整理了一下頁面最後發現已經更新,如果你不重新整理你依舊不知道他更新了,所以只要你不請求,你的頁面就不會改變,這並不是一個持久的過程,而是短暫的過程。通過你的輸入網址的操作,重新整理的操作,實際上瀏覽器是在向服務端程式要你想看的網頁,服務端程式返回給你想看的網頁到瀏覽器上,這就是實現了http通訊協議的工具所做到的事情,接下來就是找到這個工具然後放到我們程式裡,目前來看任何一款面向物件的開發語言都支援這個工具,不用擔心找不到,最重要的是我們知道通過他能獲取網頁。為什麼能準確找到我想看的網頁,這就要說下URL,”統一資源定位符是對可以從網際網路上得到的資源的位置和訪問方法的一種簡潔的表示,是網際網路上標準資源的地址。網際網路上的每個檔案都有一個唯一的URL,它包含的資訊指出檔案的位置“  這說的就是網址(除了他也沒別人了)

           舉個例子: (http://127.0.0.1:8080/index.html , http代表是用http傳輸協議,127.0.0.1是要訪問目標機器的IP地址,8080是埠, index.html也就是我們想要的檔名字),我們給予如此多的資訊也不想象難出http協議工具是如何通過網址定位到我們想要的檔案。(http://www.XXX.com/ 像這樣的網址帶全球資訊網會翻譯成url正常格式)。

          接下來怎麼能知道我想要的內容,並儲存。首先網頁是什麼,就是包含了文字,圖片,視訊,音樂,程式...大的集合,那這樣一個複雜的集合總會有一定的組織形式,不然管理起來不是很累麼,這就是htm超文字語言,其實就是一堆標籤包含我們想要的內容(文字,圖片,視訊,音樂,程式...)開啟瀏覽器輸入一個網址,按F12你會看到類似如下圖片,左側是是頁面,右側就是html格式的頁面,右側看起來好鬧心,但是沒什麼關係,我們只是想找幾個我們關心的標籤(標籤就是<div> </div>像這種形式的結構), 你也可以找個寫網頁的工具像DreamWeaver,寫個網頁~~

            F12後的頁面如下:


     你輸入網址請求的頁面,其實是以html格式返回給你,也就是先給你右側這一坨東西,再轉化成左側比較和諧的東西,你的瀏覽器可以解析出這個格式,並將其對應內容,放到頁面對應位置上,檢視這個右側文字與左側文字對應,如上圖我們只要解析<p> </p>這個標籤就能獲取我們想要的文字,同樣html解析工具也是隨處可見,關注你感興趣的含文字的標籤,在獲取到文字後儲存成檔案即可。

     還不錯,還剩下最後一個問題看著問題不大,但是卻是最關鍵的。老闆給你多少網址你就寫多少網址。但是現實是老闆連網都不會上,怎麼能給你網址,所以真實情況下給你任務是找出與我們相關的網址並獲取文字發給我,好的大王,是的大王,不過沒有了網址我怎麼能獲取我想要的網頁呢?

     我們在瀏覽頁面的時候會點選某個頁面上標題或按鈕,會自動跳轉到下一個頁面。

例如下圖:(頁面展示是個電影分類文字標題)


        這裡有個標籤帶了個屬性href = “....",  看著格式就知道是個網址,所以跳轉(超連結)其實就是通過這個新的url向服務端做了個請求,然後將一個新的頁面展示給你。這和你在瀏覽器上輸入網址然後按回車是一個道理,只不過這次是點選(囉嗦)。所以我們大膽想象下網路上的所有網頁都是這樣關聯在一起的,比如自己寫個網站如果想讓其他人快速知道,一般會放到點選量高的網址,通過這個網站再進入到我的網站,然後瀏覽我的網頁內容,當然我的網頁內容同樣也包含別人網站的連線,只要找個網頁解析出url就能,再發送請求就能找到下一個網頁,以此類推。至於實現其實很簡單,使用html解析解析工具,這回是我們感興趣的第二個標籤<a href = "url" >,將解析出來的url存到陣列中,大工告成。

         重新再來寫一下:

         void main()

        {

                  Vector <string> urlArray;                 //這裡用了容器Vector,就是個無限長度的陣列,為了方便你不用再寫陣列長度了(但實際上並不適合,下回分解),還是存放網址                                                         (URL), 啟動前要至少新增一個url

                  while (urlArray.count != 0)              //判斷存的url數組裡不能為空,為空則結束迴圈。

                  {

                            string htmlPage = Request(urlArray[0]);            //請求獲取網頁檔案, index.html, xxx.html,獲取形式是字串。

                            string text = ParseHtmlText(htmlPage);             //解析htmlPage,並獲取文字,

                            string url =  ParseHtmlUrl(htmlPage);                //解析htmlPage,並獲取url,這裡其實是一堆url,主頁裡會有很多url解析出來,這裡為了清晰就寫一個吧。

                            saveFile(text);                                                        //儲存剛才獲取到text到本地檔案

                            urlArray.add(url);                                                   //新增url到urlArray 儲存url,作為下次使用的url

                            urlArray.remove(0);                              //移除這次使用過的url也就是第一個urlArray[0]

                   }

        }

     最後廣度搜索方式網路爬蟲寫完了。當然你會吐槽,但是槽點太多無從下口。請原諒我的懶惰,這個就是百分之百網路爬蟲。首先解釋下流程,迴圈開始檢查下url列表中是否是空的,不是則獲取首個url,通過url請求獲得htmlPage頁面,然後進行解析網頁獲取text 和 url兩個內容,然後將text文字儲存,將url加入url列表作為待訪問的點。這個過程就是通過url獲取頁面,通過頁面獲取url,就這樣回到了哲學問題上,雞生蛋,蛋生雞

    是先有雞,還是先有蛋呢,不管先有誰,我們都必須要讓這個迴圈進行下去,讓雞下蛋,讓蛋生雞,子子孫孫無窮匱也。所以我們先給個蛋(url), 讓世界的齒輪開始轉動。爬蟲原理就是這麼簡單,你用任何一款面嚮物件語言(C++, java, c#, python, go, php)都能實現它。雖然寫完了,但是事情還遠沒有結束,我們程式猿在寫完了這個程式後會碰到了各種各樣的問題,網路是個危險地方,我們還是會火星吧。這個粗枝大葉的程式能在今天的網路活上半小時已經是奇蹟了。這也就是為什麼有各式各樣爬蟲程式,格式各樣的開發元件工具層出不窮,為的就是將迴圈進行到底。但首先搞明白爬蟲是什麼東西才能更靈活設計出自己的爬蟲,至於程式猿能不能完成任務,且聽下回分解。

(本故事純屬虛構,如有雷同真是巧合)