如何用SHELL寫好網絡爬蟲

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。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

(0)
s19930811s19930811
上一篇 2016-08-15 12:12
下一篇 2016-08-15 12:12

相關推薦

  • 第十二周課堂練習下

    6、在LAMP架構中,請分別以php編譯成httpd模塊形式和php以fpm工作為獨立守護進程的方式來支持httpd,列出詳細的過程 1.模塊方式安裝可見第三節 2.fpm獨立守護進程安裝 [root@LAMP setup]# tar -xf  php-5.6.23.tar.bz2  ##編譯&nb…

    Linux干貨 2017-01-03
  • shell腳本編程

    Shell腳本是包含一些命令或聲明,并符合一定格式的文本文件。 程序:指令+數據 程序編程風格 過程式  以指令為中心,數據服務于指令。 對象式  以數據為中心,指令服務于數據。 Shell程序:提供了編寫和能力,解釋執行。 編程邏輯處理方式:           順序執行   …

    Linux干貨 2016-08-15
  • Linux發行版的基礎目錄名稱命名法則及功用規定

    /bin ?存儲單用戶維護模式還能操作的命令 /boot 存儲開機時會使用到的文件 /dev? 存儲設備與接口文件 /etc? 存儲系統的配置文件 /home 系統默認的用戶主目錄 /lib? 存儲函數庫文件 /media 光盤掛載點 /mnt?? 光盤或者U盤掛載點 /opt?? 第三方應用程序文件存放目錄 /root? root用戶家目錄 /sbin ?…

    Linux干貨 2018-03-04
  • openvpn安裝配置過程

    前言     之前為了方便遠程辦公時訪問公司的內部系統,如:svn、OA、wiki、禪道等等;通通在防火墻上做了端口映射。然后有個內部系統被黑了,各種弱口令沒辦法。果斷關閉端口映射,看來還是得搭建個VPN服務器,vpn設備感覺大材小用。馬上就想到了開源的openvpn,下面就來介紹openvpn的安裝配置過程。 ope…

    Linux干貨 2015-05-11
  • NET25第8周作業

    1、寫一個腳本,使用ping命令探測172.16.250.1-172.16.250.254之間的所有主機的在線狀態;     在線的主機使用綠色顯示;     不在線的主使用紅色顯示; #!/bin/bashtrap “echo ‘crtrl+c’;exi…

    Linux干貨 2017-03-15
  • Hadoop HDFS分布式文件系統設計要點與架構

    Hadoop簡介:一個分布式系統基礎架構,由Apache基金會開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力高速運算和存儲。Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件…

    Linux干貨 2015-04-13
欧美性久久久久