聊聊【爬蟲開發】這半年來的心得

在工做中,已經陸陸續續使用爬蟲作需求將近半年時間了,在這半年時間裏,從一個python小白到爬蟲入門,再至功能實現。從上午PHP到下午Python忙的焦頭爛額到如今的PHP/Python隨心切換,其中的曲折不言而喻,也着實走了很多彎路。但好在功夫不負有心人,在半年的時光裏,使用Python的同時也和它一塊兒成長。現在總結一下,但願能夠幫助到有須要的同窗。html

以前也有寫過幾篇Python和Scrapy的筆記,傳送門:python

python

從最開始接觸爬蟲,首先最須要了解的就是python的環境搭建、語法及特性,網絡上有不少相關的教程,如下列舉幾個我在學習過程當中使用到的教程,對於Python的快速入門都能起到很大的做用git

  • 廖雪峯老師的Python教程,最早就是在這裏開啓Python之旅的。一邊看文章學習一邊跟着寫寫demo
  • 菜鳥教程裏的Python基礎教程也能夠做爲快速學習使用
  • Python3文檔,在忘記一些函數的時候能夠很快速的找到

爬蟲框架

等到Python的基礎語法瞭解的差很少的時候,就能夠開始着手學習python相關的爬蟲框架了。Python的爬蟲框架,其中比較著名的就是Scrapy框架了。主要是瞭解Scrapy框架的運行原理,以及學習如何使用它。經過閱讀文檔、博文、觀看視頻來學習Scrapy,下面我貼出幾個我在學習過程當中看到的幾篇比較好的Scrapy博客以及視頻github

除了上面介紹的學習連接以外,github上也有一些比較完善的Python以及Scrapy項目,能夠嘗試着理解一下。正則表達式

Xpath

XPath 用於在 XML 文檔中經過元素和屬性進行導航。換句話來講可使用Xpath定位頁面上的元素位置,獲取元素內容。我編寫的爬蟲代碼幾乎都是採用Xpath來獲取頁面內容的。因此,學習Xpath也是頗有必要的。redis

Xpath就像Javascript的Dom同樣,能夠根據id、class等來定位到指定元素所在的位置,並獲取到相應的內容,比較常見的使用方式我簡單列舉一二算法

  • / 下一級元素
  • // 子元素
  • . 當前節點
  • get 獲取單個值
  • getall 獲取全部值

具體能夠參考W3school上的Xpath教程,裏面介紹的很詳細了。shell

正則

爬蟲天然離不開正則了,須要用到正則獲取到字符串中指定內容的場景不少不少。若是不會正則或者對正則不熟,那麼就會直接影響到工做效率(固然不熟也能夠請教同事,可是本身動手豐衣足食嘛)。我就吃了對正則不熟的虧,正好兒學習爬蟲須要使用到正則,借這個機會,好好對正則從新認識學習一遍。數據庫

至於文檔,能夠直接參考菜鳥教程正則表達式api

實戰篇

學習完Python、Scrapy、Xpath的使用方法以後,就能夠本身嘗試動手開發一個小爬蟲了。我最開始是嘗試着寫了一個爬取簡書全站文章的小爬蟲,測試是能爬取到數據的,只不過在爬取比較多的數據以後,會出現一些問題(這些問題在下面會提到)。貼一個爬取我本身網站全部文章的爬蟲項目Python Scrapy demo,代碼寫的很簡單,就是翻頁爬取我博客中全部的文章標題及內容。小白應該也能夠很好理解

反爬

上面說到在爬取簡書全站文章的時候,爬取數據超過必定量的時候,就會出現一些問題。主要就是被禁止爬取了,緣由是我在同一時間大量的爬取了簡書的文章,因此個人IP短暫的被列入了簡書的黑名單,因此致使我爬取不到數據。過一下子就能夠了,可是再次爬取直到IP被封,中間爬取到的數據量又比第一次少不少。這就是簡書的反爬機制了。

關於反爬以及反反爬,我以前也寫過文章:Python爬蟲研究,裏面列舉了反爬常見的套路,以及反反爬蟲應對策略,裏面內容是我在瞭解爬蟲一段時間後,作的一個總結。可能理解的也不太深入,能夠做爲了解。

代理IP

對於代理IP這一塊要單獨摘出來講,由於爬蟲項目確定須要依賴不少IP來完成任務的,否則一個IP被網站封掉了,那業務不就停了,這樣的狀況是不容許的。因此就須要爲咱們的爬蟲創建代理IP池,把能用、質量良好的IP存儲起來,在IP被封掉的時候,切換一個正常的IP做爲代理訪問。

如何搭建代理IP池,網上也有不少方案,因爲這種方案的IP質量不是很好,因此我就沒有去嘗試。本身想玩一玩的能夠根據網上的IP代理池方案本身搭建一個IP池。差很少就是去公開的IP代理網站,爬取到全部的IP,保存在本身的IP代理池(能夠是數據庫或者Redis)中,而後寫一個腳本按期去監測這些IP是否正常,若是正常就放在代理池,不然則從代理池中剔除。

經常使用的IP代理商,好比快代理,它支持購買必定數量的代理IP。切換一個IP,可使用的IP數量就減小一個。測試以後,發現IP質量都還蠻高。可是這種有數量限制的不太知足咱們的業務需求。

也可使用一些隧道連接方式的IP代理商,就是IP不限量,統一用隧道的方式去訪問,代理商轉發你的請求。這種代理商好比小象代理。可是小象代理的IP着實通常,也多是因爲咱們業務的特殊性,小象的IP對咱們有用的很少。

最後面咱們使用的是ScripingHub,使用Crawlera來提供代理服務。這種代理質量出奇的高,也很穩定。由於是國外代理,預算比較充足的能夠採用這類代理商。(一個月大概$349)

驗證碼

驗證碼是反爬處理中最多見的方法之一了,最開始遇到這種狀況的時候,也是絞盡腦汁的去想如何破解驗證碼。瞭解到目前成熟的也就OCR技術了,可是這個用起來特別繁瑣,並且失敗率也挺高,就算驗證碼破解了,可是後面的請求依舊還會出現驗證碼,OCR算法識別驗證碼也挺耗時,會致使爬取效率下降。

既然不能高效的破解驗證碼,那有什麼其餘辦法嗎?答案確定是有的,在後面採起的辦法就簡單有效多了,在請求中間件類中判斷頁面是不是驗證碼頁面,若是是,直接換過一個代理IP請求。使用Crawlera的話,就再發起一次請求就好。

破解驗證碼,耗時費力。換IP簡單高效,推薦。

Scrapy Redis

Scrapy Redis用於構建分佈式爬蟲。至關於把須要爬取的連接存儲在Redis隊列中,能夠在不一樣服務器中開啓多個爬蟲腳本,消費Redis隊列,達到分佈式爬取的目的。

切換到Scrapy Redis也很簡單,spider類繼承RedisSpider,爬蟲類中增長redis_key,指定隊列名稱。去除start_url。配置文件中增長Scrapy Redis的一些必要配置以及Redis的鏈接信息便可

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
REDIS_HOST = 
REDIS_PORT = 
REDIS_PARAMS = {
    'db': '',
    'password': 
}

文檔參考:Scrapy-Redis入門實戰

Scrapy Crawlera

crawlera是一個利用代理IP地址池來作分佈式下載的第三方平臺。咱們線上業務一直在使用這個代理,很是的穩定,幾乎不會出現被屏蔽或者訪問失敗的狀況。就是價格有點小貴

scrapy-crawlera官方文檔

ScrapingHub Crawlera介紹及資費

ScrapingHub Crawlera Api文檔

小技巧

Xpath Helper

Xpath Helper是一個瀏覽器的小插件,方便咱們直接在網頁上輸入Xpath表達式,來驗證咱們寫的表達式是否正則。

Xpath Helper

Scrapy Shell

scrapy shell也是scrapy提供的調試工具之一了。它能夠方便的在命令行打開咱們指定的網頁,而後輸入相應的代碼來調試頁面內容。

Scrapy Shell

總結

以上差很少就是本篇文章的所有內容了,概括總結了初學Python爬蟲的學習路徑、實戰進階和一些能夠提升工做效率的小技巧,固然在實際的工做運用中,須要瞭解到的知識要比這些多得多,要想玩轉它,必定要不斷的去學習、去摸索、去嘗試。

使用到如今也只是冰山一角,後面還有更多東西須要去學習。

共勉。

相關文章
相關標籤/搜索