談談對 Python 爬蟲的理解

收藏待读

談談對 Python 爬蟲的理解

爬蟲也可以稱為Python爬蟲

不知從何時起,Python這門語言和爬蟲就像一對戀人,二者如膠似漆 ,形影不離,你中有我、我中有你

一提起爬蟲,就會想到Python,一說起Python,就會想到人工智能……和爬蟲

所以,一般說爬蟲的時候,大部分程序員潛意識裡都會聯想為Python爬蟲,為什麼會這樣,我覺得有兩個原因:

  • Python生態極其豐富,諸如Request、Beautiful Soup、Scrapy、PySpider等第三方庫實在強大

  • Python語法簡潔易上手,分分鐘就能寫出一個爬蟲(有人吐槽Python慢,但是爬蟲的瓶頸和語言關係不大)

任何一個學習Python的程序員,應該都或多或少地見過甚至研究過爬蟲,我當時寫Python的目的就非常純粹——為了寫爬蟲

所以本文的目的很簡單,就是說說我個人對Python爬蟲的理解與實踐,作為一名程序員,我覺得了解一下爬蟲的相關知識對你只有好處,所以讀完這篇文章後,如果能對你有幫助,那便再好不過

什麼是爬蟲

爬蟲是一個程序,這個程序的目的就是為了抓取萬維網信息資源,比如你日常使用的谷歌等搜索引擎,搜索結果就全都依賴爬蟲來定時獲取

談談對 Python 爬蟲的理解

看上述搜索結果,除了wiki相關介紹外,爬蟲有關的搜索結果全都帶上了Python,前人說Python爬蟲,現在看來果然誠不欺我~

爬蟲的目標對象也很豐富,不論是文字、圖片、視頻,任何結構化非結構化的數據爬蟲都可以爬取,爬蟲經過發展,也衍生出了各種爬蟲類型:

  • 通用網絡爬蟲:爬取對象從一些種子 URL 擴充到整個 Web,搜索引擎乾的就是這些事

  • 垂直網絡爬蟲:針對特定領域主題進行爬取,比如專門爬取小說目錄以及章節的垂直爬蟲

  • 增量網絡爬蟲:對已經抓取的網頁進行實時更新

  • 深層網絡爬蟲:爬取一些需要用戶提交關鍵詞才能獲得的 Web 頁面

不想說這些大方向的概念,讓我們以一個獲取網頁內容為例,從爬蟲技術本身出發,來說說網頁爬蟲,步驟如下:

  • 模擬請求網頁資源

  • 從HTML提取目標元素

  • 數據持久化

什麼是爬蟲,這就是爬蟲:

加上注釋不到20行代碼,你就完成了一個爬蟲,簡單吧

怎麼寫爬蟲

網頁世界多姿多彩、億萬網頁資源供你選擇,面對不同的頁面,怎麼使自己編寫的爬蟲程序夠穩健、持久,這是一個值得討論的問題

俗話說,磨刀不誤砍柴工,在開始編寫爬蟲之前,很有必要掌握一些基本知識:

  • 網頁的結構是HTML,爬蟲的目標就是解析HTML,獲取目標字段並保存

  • 客戶端展現的網頁由瀏覽器渲染,客戶端和服務端的信息交互依靠HTTP協議

這兩句描述體現了一名爬蟲開發人員需要掌握的基本知識,不過一名基本的後端或者前端工程師都會這些哈哈,這也說明了爬蟲的入門難度極低,從這兩句話,你能思考出哪些爬蟲必備的知識點呢?

  • 基本的HTML知識,了解HTML才方便目標信息提取

  • 基本的JS知識 ,JS可以異步加載HTML

  • 了解CSS Selector、XPath以及正則,目的是為了提取數據

  • 了解HTTP協議,為後面的反爬蟲鬥爭打下基礎

  • 了解基本的數據庫操作,為了數據持久化

有了這些知識儲備,接下來就可以選擇一門語言,開始編寫自己的爬蟲程序了,還是按照上一節說的三個步驟,然後以Python為例,說一說要在編程語言方面做那些準備:

  • 網頁請求:內置有urllib庫,第三方庫的話,同步請求可以使用requests,異步請求使用aiohttp

  • 分析HTML結構並提取目標元素:CSS Selector和XPath是目前主流的提取方式,第三方庫可以使用Beautiful Soup或者PyQuery

  • 數據持久化:目標數據提取之後,可以將數據保存到數據庫中進行持久化,MySQL、MongoDB等,這些都有對應的庫支持,當然你也可以保存在硬盤,誰硬盤沒點東西對吧(滑稽臉)

掌握了上面這些,你大可放開手腳大幹一場,萬維網就是你的名利場,去吧~

我覺得對於一個目標網站的網頁,可以分下面四個類型:

  • 單頁面單目標

  • 單頁面多目標

  • 多頁面單目標

  • 多頁面多目標

具體是什麼意思呢,可能看起來有點繞,但明白這些,你之後寫爬蟲,只要在腦子裏面過一遍着網頁對應什麼類型,然後套上對應類型的程序(寫多了都應該有一套自己的常用代碼庫),那寫爬蟲的速度,自然不會慢

單頁面單目標

通俗來說,就是在這個網頁裏面,我們的目標就只有一個,假設我們的需求是抓取這部 電影-肖申克的救贖 的名稱,首先打開網頁右鍵審查元素,找到電影名稱對應的元素位置,如下圖所示:

談談對 Python 爬蟲的理解

在某個單一頁面內,看目標是不是只有一個,一眼就能看出標題的CSS Selector規則為: #content > h1 > span:nth-child(1) ,然後用我自己寫的常用庫,我用不到十行代碼就能寫完抓取這個頁面電影名稱的爬蟲:

多頁面多目標就是此情況下多個url的衍生情況

單頁面多目標

假設現在的需求是抓取 豆瓣電影250 第一頁中的所有電影名稱,你需要提取25個電影名稱,因為這個目標頁的目標數據是多個item的,因此目標需要循環獲取,這就是所謂的單頁面多目標了:

談談對 Python 爬蟲的理解

多頁面多目標

多頁面多目標是上述單頁面多目標情況的衍生,在這個問題上來看,此時就是獲取所有分頁的電影名稱

談談對 Python 爬蟲的理解

如果網絡沒問題的話,會得到如下輸出:

談談對 Python 爬蟲的理解

注意爬蟲運行時間,1s不到,這就是異步的魅力

用Python寫爬蟲,就是這麼簡單優雅,諸位,看着網頁就思考下:

  • 是什麼類型的目標類型

  • 用什麼庫模擬請求

  • 怎麼解析目標字段

  • 怎麼存儲

一個爬蟲程序就成型了,順便一提,爬蟲這東西,可以說是防君子不防小人, robots.txt 大部分網站都有(它的目的是告訴爬蟲什麼可以爬取什麼不可以爬取,比如:  https://www.baidu.com/robots.txt ),各位想怎麼爬取,自己衡量

如何進階

不要以為寫好一個爬蟲程序就可以出師了,此時還有更多的問題在前面等着你,你要含情脈脈地看着你的爬蟲程序,問自己三個問題:

  • 爬蟲抓取數據後是正當用途么?

  • 爬蟲會把目標網站幹掉么?

  • 爬蟲會被反爬蟲幹掉么?

前兩個關於人性的問題在此不做過多敘述,因此跳過,但你們如果作為爬蟲工程師的話,切不可跳過

會被反爬蟲幹掉么?

最後關於反爬蟲的問題才是你爬蟲程序強壯與否的關鍵因素,什麼是反爬蟲?

當越來越多的爬蟲在互聯網上橫衝直撞後,網頁資源維護者為了防止自身數據被抓取,開始進行一系列的措施來使得自身數據不易被別的程序爬取,這些措施就是反爬蟲

比如檢測IP訪問頻率、資源訪問速度、鏈接是否帶有關鍵參數、驗證碼檢測機械人、ajax混淆、js加密等等

對於目前市場上的反爬蟲,爬蟲工程師常有的反反爬蟲方案是下面這樣的:

  • 不斷試探目標底線,試出單IP下最優的訪問頻率

  • 構建自己的IP代理池

  • 維護一份自己常用的UA庫

  • 針對目標網頁的Cookie池

  • 需要JS渲染的網頁使用無頭瀏覽器進行代碼渲染再抓取

  • 一套破解驗證碼程序

  • 紮實的JS知識來破解混淆函數

爬蟲工程師的進階之路其實就是不斷反反爬蟲,可謂艱辛,但換個角度想也是樂趣所在

關於框架

爬蟲有自己的編寫流程和標準,有了標準,自然就有了框架,像Python這種生態強大的語言,框架自然是多不勝數,目前世面上用的比較多的有:

  • Scrapy

  • PySpider

  • Portia

這裡不過多介紹,框架只是工具,是一種提升效率的方式,看你選擇

說明

任何事物都有兩面性,爬蟲自然也不例外,因此我送諸位一張圖,關鍵時刻好好想想

談談對 Python 爬蟲的理解

原文 :

相關閱讀

免责声明:本文内容来源于mp.weixin.qq.com,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。