咱們先看看維基百科的定義php
網絡爬蟲(英語:web crawler),也叫網絡蜘蛛(spider),是一種用來自動瀏覽萬維網的網絡機器人。python
通俗的說爬蟲就是經過必定的規則策略,自動抓取、下載互聯網上網頁,在按照某些規則算法對這些網頁進行數據抽取、 索引。 像百度、谷歌、今日頭條、包括各種新聞站都是經過爬蟲來抓取數據。git
題外話github
博客園裏偶爾看到爬蟲的文章,其實不少都稱不上爲爬蟲。 只能叫玩具或者叫http請求下載程序吧。。 嚴格來講爬蟲是一個系統,它包含了爬取策略、更新策略、隊列、排重、存儲模塊等部分。web
按照抓取網站對象來分類,能夠分爲2類爬蟲。ajax
相似百度、谷歌這樣的爬蟲,抓取對象是整個互聯網,對於網頁沒有固定的抽取規則。 對於全部網頁都是一套通用的處理方法。正則表達式
這類爬蟲主要針對一些特定對象、網站,有一臺指定的爬取路徑、數據抽取規則。好比今日頭條,它的目標網站就是全部的新聞類網站。 好比Etao比價、網易的慧慧購物助手,他們的目標網站就是 淘寶、京東、天貓等等電商網站。redis
通用爬蟲和垂直爬蟲顯著的區別:算法
抓取範圍,通用爬蟲的抓取範圍要比垂直爬蟲大得多,一個是整個互聯網,一個是指定的網站。數據庫
爬取路線,一個通用爬蟲要不按照深度爬取、要不是按廣度爬取。 而垂直爬蟲則多是按照指定路線爬取。
數據處理,通用爬蟲通常就是分詞、索引到數據庫。 而垂直爬蟲則經過特定的規則來抽取更加精細的數據 。
那麼一個完整的爬蟲程序由哪些東西組成呢?
顧名思義就是負責HTTP下載,別小瞧它,要作好還挺不容易,由於你面對的複雜而無序、甚至包含錯誤的互聯網。
就是存儲新產生的URL隊列(queue),隊列能夠是多種形式的,他能夠是redis的隊列、數據庫中的表、內存中的隊列。根據場景,你能夠自行選擇。
調度嘛,就是負責管理工做的,它經過制定策略,規定哪些URL優先執行、哪些URL靠後。
對我來講,一個爬蟲必需要支持多線程,而且可控。
排重,這是一個爬蟲必不可少的部分,你必須記錄下哪些URL已經採集過、哪些是未採集過的,複雜點的爬蟲,你可能還須要記錄上次抓取時間。
就是定義如何解析抓取到的頁面,對於通用爬蟲,它可能對於全部頁面都是一套邏輯,就是分詞、索引。 但對於垂直爬蟲,則須要指定規則。手段可能有正則、XPath、正文識別等等。
定義以什麼方式存儲抓取到的數據, 通常狀況下都是存儲到數據庫啦。固然,是通常的關係數據庫,仍是NoSQL 就看需求了。
通用爬蟲、垂直爬蟲他們的流程都是類似的,下面咱們簡單說說一個爬蟲究竟是怎麼運行的。
首先,咱們用一張通常爬蟲的流程結構圖來看看。
英文我就不翻譯了。 大概說說流程吧。
指定起始URLs。 也就是指定一個入口。不論是通用爬蟲仍是垂直爬蟲,都須要一個入口。
下載、解析URL。 這裏分爲2個操做,1. 抽取數據,存儲到數據庫;2. 解析出頁面中包含的URL。
將解析的新URL放到隊列中。
調度器從URL隊列中,按照必定策略,取出要下載的URL,添加到HTTP下載中。
重複執行第二步,直到URL隊列爲空。
這裏列舉一些比較有名的爬蟲項目,有些我用過,有些沒用過。我平時工做環境是 .net ,對python爬蟲也略有研究。
Scrapy , 很是有名的Python爬蟲項目,用戶數很是多,文檔作的也很棒。
Nutch ,Java的,它實際上是一個搜索引擎項目,包含了搜索和Web爬蟲兩個部分。 沒用過。
NCrawler, .net 寫的。 架構和代碼都很棒,建議想學習 .net 爬蟲的同窗,多研究。惋惜沒用文檔
Scrapy 額外點評, 在我大概讀了下它的源碼後,我以爲 Scrapy 在一些地方仍是很不錯的,好比回調模型。 可是它太臃腫了。對於一個垂直爬蟲框架來講的,有不少沒必要要的設計,好比下載器、中間件。
暫且就列這幾個, 歡迎各位同窗補充!
主要的包括GET、POST方法。 各類類型Header的瞭解 ,包括Referer、User-Agent、Cookie、Accept、Encoding、Content-Type等等。
瞭解各類HTTP狀態碼的含義,常見的狀態碼好比 200表示正常; 301表示重定向,同時會返回新的URL;404表示頁面不存在;5xx表示服務器端錯誤
瞭解Cookie的構成,原理。
HTML基礎知識,瞭解HTML經常使用元素, 好比A、IMG等等。
瞭解URL的構成,路徑、參數,絕對路徑、相對路徑。
編碼相關,HTML charset, HTML EncodeDecode,URL EncodeDecode,JS EncodeDecode,
HTTP協議、HTML其實都是瀏覽器相關的
瞭解瀏覽器,從你輸入一個URL,到看到完整的網頁,中間發生了什麼。相關知識點: URL、DNS、HTTP、Web Server、HTML、JS、CSS、DOM樹、JS引擎等等。
其中DOM樹、JavaScript相關知識對於爬蟲來講仍是至關重要的。有些時候須要反解JS。
經常使用抓包工具,好比Fiddler、瀏覽器的F十二、Wireshark、Microsoft Network Monitor。後面2個屬於TCP級別,用的較少。
經過學習抓包工具使用,能夠幫你更好的學習HTTP協議、瀏覽器相關知識。
這裏強烈、重點推薦 Fiddler。
大概說下幾個經常使用功能吧, 抓包、保存包數據、Composer(構造HTTP請求)、AutoResponser(自動響應HTTP)、FidderScript 經過編寫腳本定製程序、修改HTTP包。
若是你是 .net 技術相關的,建議反編譯下,讀下源代碼,HTTP協議你就搞定啦。它還提供了 FiddlerCore 庫讓你能夠編寫本身抓包程序。
有爬蟲,固然就有反爬蟲技術啦。 他們倆一直處於一個對抗、共存的狀態。 這是一個很是有意思的過程,對於一些爬蟲從業、愛好者來講。
一般來講,只要你想爬,沒有爬取不到的數據,就看你的資源和技術了。 不管是網站仍是APP。
下面列舉下常見幾種反爬蟲技術:
useragent、referer 等常見反爬蟲技術(低級)
須要登陸 cookie,
封 IP ,限制 IP 訪問頻率
驗證碼,包括圖像驗證碼、拖動驗證碼等等
瀏覽器端 Javascript 混淆 ajax 參數
其餘如 token、隨機數
不要緊,雖然反爬技術多,可是隻是增長你的成本而已。 不過網站也是有代價的,有些反爬會損害用戶體驗的。
有意思的事情:
許多大的互聯網公司,會同時有爬蟲部門和反爬蟲部門。哈哈哈,是這樣的,爬蟲部門用來爬別人家的數據,
反爬部門用來屏蔽別人家的爬蟲咯! 舉個例子,就像以前的58和趕集(不過如今他們合併了)
有意思的項目:
一步採集 經過算法,計算出一個網頁中列表、分頁地址。相似於 正文識別 算法。這個技術對於須要作大量垂直爬蟲的人來講,就頗有用圖。不用再編寫XPath、正則表達式。