原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://nolinux.blog.51cto.com/4824967/1550976
上周,老大壓下來任務,讓寫一個網絡爬蟲,負責爬某一個行業網站的數據信息。由于本人只會 shell 編程語言,其它編程語言從未涉獵,因此就只能硬著頭皮用 shell 去寫了。
轉眼之前已經過去一周了,一切從無到有,經歷的坎坷無數,這里我就不一一吐槽。
這里呢,我就簡單和大家分享下,我個人對,如何用 shell 去寫好網絡爬蟲的幾點拙見,希望有想法的朋友聯系我一起交流交流想法,沒有想法的就看看有精華就吸收走,有糟粕的果斷棄之。
1、你肯定要簡單了解下網絡爬蟲是什么!這個定義在谷歌一搜一大堆,這里我就不拷貝了。
2、對HTTP協議要有簡單了解,比如HTTP協議1.0和1.1的區別、HTTP協議的請求過程、請求報文都包含哪些內容以及一個網頁鏈接是由哪些部分組成的。針對請求報文的內容,是我們網絡爬蟲抓取的重點。如果你所要爬的網站需要登錄用戶名和密碼,那么cookie就非常重要;如果你所要爬的網站做了防盜鏈,那么你就需要聲明好你是從哪個連接來的,此時referer就非常的重要;如果你所要爬的網站需要傳遞POST信息,那么你就要對Form Data和Response比較關注才行,等等,這里僅列舉幾個重要的點。
3、上面提到了HTTP協議的相關,那么如何把這些信息告知給我們所要爬的目標站點呢?通常我們都是使用游覽器做操作的,可是我們現在定義為網絡爬蟲了,那肯定要脫離人工嘍。因此這里我們就要使用到2個命令工具,一個是curl,一個是wget。我個人習慣,對頁面內容請求我就使用curl了,對于某些資源下載,比如圖片,音頻等,我就使用wget去做操作。針對這兩個命令,我們所需要重視的是,如何傳遞cookie,如何傳遞referer,如何傳遞POST信息以及如何設置代理信息等這些內容。這里我以curl命令為例,如果我需要傳遞cookie,那么我就需要用到-b(–cookie)去傳遞cookie,使用-s(–slient)減少curl頁面過程中是不必要的輸出信息,使用-e(–referer) 指定從哪個url地址來等等等等,這里不再一一啰嗦。針對curl和wget的命令詳解,谷歌一搜一大把,這里同樣不再拷貝了。
有以上的知識,就具備了通過命令請求所爬的站點頁面信息了,后面所涉及到的就是對所爬信息的篩選、過濾了,以及如何提高爬的速度。
1、針對數據的篩選、過濾,shell真是太在行了。這一點,我相信大家肯定都清楚。shell編程中常用的文本處理工具,比如grep、sed、awk這三個主要的,以及周邊的cut、wc、uniq、sort等等。我們通過將這些工具與正則表達式做結合,可以完美實現對于感興趣信息選取。針對以上幾個工具的用法,不在本篇做敘述。
2、針對網絡爬蟲這個整體腳本的構建,這個就需要你的shell編程經驗越熟練越好了,因為這個主要對shell腳本整體框架的組建以及各個邏輯之間的組合關聯的把握和感知。如果這個地方處理不好,腳本的效率不僅不會高,出錯的排障也是不容易的。
3、針對基于shell的網絡爬蟲的速度優化,這個還是蠻受上一個點的情況影響了。如果要優化速度,一方面要減少不必要的命令使用,這樣能減少磁盤的IO消耗和CPU的效能計算,另一方面我們需要使用 shell 的多線程功能,來提高腳本整體的并發性。
OK!以上就是我對基于shell的網絡爬蟲個人拙見。下面再補充幾點優化思路!
1、爬前要分析所爬網站的地域,比如國內還是國外。如果是國外的,就盡量選擇國外的服務器(你懂得)不然速度可能讓你汗顏!另外,本地綁定所爬網站的固定IP或者選擇一個好的DNS服務器也是不錯的選擇。
2、在使用shell的多線程功能時,切記要控制住進程數。這個數值要綜合考量,一方面要以自身服務器性能為參考依據,另一方面要以所爬站點的承載能力為參考依據,兩者缺一不可。一個和諧的數值是需要多次測試求出來的,切記!
3、為了提高爬蟲后期的擴展性,因此框架和變量,這兩者一定要靈活,不然腳本就是個死腳本,不方便后期的擴展。
雖然shell確實是一個面向過程的編程語言,但是我還是期望能夠站在更高的角度去靈活運用它。最后,我個人絕對針對網絡爬蟲這種東西,使用高級語言比如java、python去寫效果應該更好。目前個人,不會高級語言,所以只能用 shell 語言去寫,淚奔??!
在下一篇博文,我會分享我的爬蟲腳本給大家,希望能對大家有所幫助!
轉自:http://nolinux.blog.51cto.com/4824967/1550976
原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/1947