少兒編程
Python
爬蟲
注意,這是一篇寫給青少年的入門指南璧微。
我們不會做非常深入的探討作箍,而是淺嘗輒止,給初學(xué)者描繪一個概貌和入門指引前硫。
緣起
那一天胞得,人們終于回想起了被爬蟲所支配的恐懼
2019元旦期間,有位同學(xué)報名學(xué)習(xí) Python屹电,上來就問了我一個問題阶剑,“什么時候可以開始學(xué)習(xí)爬蟲呢?”
老師當(dāng)時就被震驚了∥:牛現(xiàn)在的小朋友果然不可以低估啊牧愁。要知道貓老師本貓都還沒實際操作過爬蟲呢。而00后10后已經(jīng)在以此為目標(biāo)了葱色。我不禁想問递宅,這位少年,看你骨骼清奇苍狰,我這里有一本金牌黑客秘籍要不要看下办龄?
玩笑歸玩笑。有明確目標(biāo)的學(xué)習(xí)淋昭,效果會是出類拔萃的俐填。雖然貓老師之前并未專門對這項技術(shù)的教學(xué)做過準(zhǔn)備,但是只要同學(xué)有需要翔忽,我們就不會被問題難住英融。教學(xué)相長,為了不辜負(fù)同學(xué)們的期望歇式,我們決定從制作一個例子開始驶悟。
什么是爬蟲
網(wǎng)絡(luò)爬蟲(crawler),又被稱為蜘蛛(spider)材失。是一種可以根據(jù)某種設(shè)定的規(guī)則自動運行痕鳍,抓取互聯(lián)網(wǎng)上的信息的程序。我們經(jīng)常使用的百度龙巨、必應(yīng)笼呆、谷歌這些搜索引擎,它們背后的重要支撐旨别,就是網(wǎng)絡(luò)爬蟲诗赌。這些爬蟲不知疲倦地抓取網(wǎng)站的信息并加以綜合整理,最終成為幫助我們快速檢索需要的信息的利器秸弛。
從這個簡單的描述铭若,我們就可以知道洪碳,一個爬蟲至少需要三個要素:
- 抓取信息
- 數(shù)據(jù)存儲和整理
- 數(shù)據(jù)呈現(xiàn)
這幾個方面,每一個點都可以引申更多更深入的技術(shù)奥喻,值得數(shù)十年如一日地潛心研究偶宫。我們沒有辦法一一介紹,這一點你只要想象一下這些搜索引擎公司环鲤,為什么能憑借這個技術(shù)成長為互聯(lián)網(wǎng)巨頭就明白了纯趋。
但是作為初學(xué)者,想通過一些簡單的學(xué)習(xí)冷离,大致了解爬蟲的工作原理吵冒,甚至做一些簡單的爬蟲應(yīng)用,還是有可能的西剥。
爬蟲的基本工作原理
同學(xué)們可能已經(jīng)了解痹栖,互聯(lián)網(wǎng)是通過超鏈接(URL)訪問和相互聯(lián)系的。比如新聞門戶網(wǎng)站上就排布著大量隱藏在新聞標(biāo)題背后的超鏈接瞭空。
想象一下揪阿,整個互聯(lián)網(wǎng)就好比是一張……啊不對,是很多很多張通過各種方式連接在一起的蜘蛛網(wǎng)∨匚罚現(xiàn)在假設(shè)你是一只蜘蛛南捂,把你放在網(wǎng)上,需要把所有的蛛絲都走過一遍(看一遍所有網(wǎng)頁)旧找,要怎么做呢溺健?
首先,我們先隨便從什么地方開始钮蛛,爬過一根蛛絲鞭缭,遇到分叉就按照某種規(guī)則選擇其中一條。按照這種方式不停爬行魏颓,遲早有一天岭辣,整個網(wǎng)絡(luò)都會被蜘蛛爬過一遍。
這就是爬蟲的基本工作原理甸饱,也是爬蟲為什么叫爬蟲(或者蜘蛛)的原因易结。
網(wǎng)絡(luò)爬蟲跟這只蜘蛛的區(qū)別在于,爬過的地方需要有地方存儲它看到的信息柜候。通常,由于這些信息非常龐大躏精,我們需要使用數(shù)據(jù)庫來進行存儲渣刷。
除了這種通用的爬蟲,還有一些有特定目標(biāo)的爬蟲矗烛,比如在網(wǎng)絡(luò)購物時辅柴,可能會需要用到的比價網(wǎng)站箩溃,就是通過爬蟲,抓取所有購物網(wǎng)站的信息碌嘀,對相同商品同一時間不同網(wǎng)站的價格涣旨,或者歷史價格進行對比和分析。
所以爬蟲技術(shù)也是大數(shù)據(jù)的基礎(chǔ)之一股冗。由此可見霹陡,如何對抓取到的數(shù)據(jù)進行存儲、整理止状、分析和最終的呈現(xiàn)烹棉,也非常重要。
實現(xiàn)爬蟲需要的能力怯疤、工具及學(xué)習(xí)路徑
知道了爬蟲的基本工作原理浆洗,用Python去實現(xiàn)它需要什么工具也就大體有些概念了。
- 編程基礎(chǔ)知識
- Python 編程基礎(chǔ)
- Python 網(wǎng)絡(luò)編程
- Python 模塊使用
- 數(shù)據(jù)結(jié)構(gòu)和算法
- Web 開發(fā)基本知識
- HTML/DOM
- CSS
- JavaScript
- 正則表達式
- 數(shù)據(jù)庫基礎(chǔ)
- ……
需要指出的是 Python 并非制作爬蟲的唯一選擇集峦。你其實可以用任何喜歡的語言來實現(xiàn)伏社。只是現(xiàn)階段用 Python 來實現(xiàn)爬蟲非常有利。一是因為 Python 的語法簡潔易懂塔淤;二是已經(jīng)有很多摘昌、很好用的專為 Python 爬蟲設(shè)計的第三方模塊(什么是模塊,我們會在 Python 中級課程中講授)凯沪。
Python 的學(xué)習(xí)路徑第焰,貓老師已經(jīng)在《Python 是個什么東西?》有簡單說明妨马。有興趣的同學(xué)可以回顧一下挺举。簡單來說就是首先學(xué)基礎(chǔ)的語法,然后包含數(shù)據(jù)結(jié)構(gòu)和算法的高級特性烘跺,接下來湘纵,針對性學(xué)習(xí)爬蟲所需的具體技術(shù)和模塊。
例子程序:最右神回復(fù)
有一個知名問答網(wǎng)站滤淳,網(wǎng)友們可以在上面提出任何你想問的問題梧喷,然后就會有熱心的或者內(nèi)行的網(wǎng)友認(rèn)真書寫回答。
在這些回答中脖咐,有一些短小精悍铺敌,回味無窮的回復(fù),被網(wǎng)友們戲稱“神回復(fù)”屁擅。
我們這一次的例子偿凭,就以它為“下手”的目標(biāo)。通過一個爬蟲派歌,來方便的匯總這些“神回復(fù)”弯囊。
這個爬蟲屬于定向聚焦爬蟲痰哨。針對特定網(wǎng)站,特定目的匾嘱。于是我們需要找到初始頁面斤斧、根據(jù)規(guī)則抓取答案、對答案進行篩選和存儲霎烙、通過小程序進行前端呈現(xiàn)撬讽。
爬蟲部分,因為非常簡單吼过,我們沒有使用著名的 Scrapy 庫锐秦,而是用相對較輕的 requests 庫來執(zhí)行 url 請求,用 lxml 庫及正則表達式來解析抓取到的網(wǎng)頁盗忱,并用 pymongo 進行數(shù)據(jù)存儲和整理酱床。
前端呈現(xiàn),我們制作了一個微信小程序趟佃。這里又涉及了 WebApp扇谣、HTML/CSS、RestApi闲昭、Hash 等等知識罐寨。好在這不是我們的重點,你也完全可以不去考慮序矩,僅僅在自己的個人電腦上輸出數(shù)據(jù)鸯绿,開心就好。
當(dāng)然簸淀,也許有一天我們也會開始介紹如何進行前端的實現(xiàn)瓶蝴。在這里,就先簡單地體驗一下吧租幕。
小結(jié)
這個小程序的最初版本舷手,Jason老師和貓老師兩個人花了大約兩天時間,分別寫出了前端(小程序)和后端(爬蟲)劲绪。其中男窟,爬蟲部分的核心部分不超過一百行 Python 代碼。但是贾富,初學(xué)者仍需要從最基本的知識和概念學(xué)習(xí)歉眷,方能理解那短短幾十行代碼究竟干了些什么。
真正實用的爬蟲颤枪,還需要考慮很多問題姥芥。比如,面對大量網(wǎng)站海量數(shù)據(jù)汇鞭,如何提高抓取的效率凉唐;如何并行處理和存儲;如何避免重復(fù)抓取霍骄,同時減少遺漏台囱;如何將抓取的信息結(jié)構(gòu)化存儲;如何降低存儲空間并提高查詢性能和效率……不要怕读整,科技就是在不斷發(fā)現(xiàn)簿训、提問、研究米间、解決强品、迭代的過程中不斷進步的。我們的學(xué)習(xí)也是一樣屈糊。
最后的榛,祝所有想要學(xué)習(xí)爬蟲的同學(xué)都能早日實現(xiàn)自己的爬蟲程序。
但是千萬要注意逻锐,請合理夫晌、合法地使用爬蟲,并避免大量高頻訪問某個網(wǎng)站昧诱,不然不要怪老師沒有警告你會被封IP晓淀、封賬號哦!