剛開始接觸爬蟲的時候,簡直驚為天人,十幾行代碼,就可以將無數(shù)網(wǎng)頁的信息全部獲取下來,自動選取網(wǎng)頁元素,自動整理成結(jié)構(gòu)化的文件。 利用這些數(shù)據(jù),可以做很多領(lǐng)域的分析、市場調(diào)研,獲得很多有價值的信息。這種技能不為我所用實(shí)在可惜,于是果斷開始學(xué)習(xí)。 - ? - 并非開始都是最容易的 剛開始對爬蟲不是很了解,又沒有任何的計算機(jī)、編程基礎(chǔ),確實(shí)有點(diǎn)懵逼。從哪里開始,哪些是最開始應(yīng)該學(xué)的,哪些應(yīng)該等到有一定基礎(chǔ)之后再學(xué),也沒個清晰的概念。 因?yàn)槭?Python 爬蟲嘛,Python 就是必備的咯,那先從 Python 開始吧。于是看了一些教程和書籍,了解基本的數(shù)據(jù)結(jié)構(gòu),然后是列表、字典、元組,各種函數(shù)和控制語句(條件語句、循環(huán)語句)。 學(xué)了一段時間,才發(fā)現(xiàn)自己還沒接觸到真正的爬蟲呢,而且純理論學(xué)習(xí)很快就忘了,回去復(fù)習(xí)又太浪費(fèi)時間,簡直不要太絕望。把 Python 的基礎(chǔ)知識過了一遍之后,我竟然還沒裝一個可以敲代碼的IDE,想想就哭笑不得。 - ? - 開始直接上手 轉(zhuǎn)機(jī)出現(xiàn)在看過一篇爬蟲的技術(shù)文章后,清晰的思路和通俗易懂的語言讓我覺得,這才是我想學(xué)的爬蟲。于是決定先配一個環(huán)境,試試看爬蟲到底是怎么玩的。(當(dāng)然你可以理解為這是浮躁,但確實(shí)每個小白都想去做直觀、有反饋的事情) 因?yàn)榕鲁鲥e,裝了比較保險的 Anaconda,用自帶的 Jupyter Notebook 作為IDE來寫代碼??吹胶芏嗳苏f因?yàn)榕渲铆h(huán)境出各種BUG,簡直慶幸。很多時候打敗你的,并不是事情本身,說的就是爬蟲配置環(huán)境這事兒。 遇到的另一個問題是,Python 的爬蟲可以用很多包或者框架來實(shí)現(xiàn),應(yīng)該選哪一種呢?我的原則就是是簡單好用,寫的代碼少,對于一個小白來說,性能、效率什么的,統(tǒng)統(tǒng)被我 pass 了。于是開始接觸 urllib、美麗湯(BeautifulSoup),因?yàn)槁爠e人說很簡單。 我上手的第一個案例是爬取豆瓣的電影,無數(shù)人都推薦把豆瓣作為新手上路的實(shí)例,因?yàn)轫撁婧唵吻曳磁老x不嚴(yán)。照著一些爬取豆瓣電影的入門級例子開始看,從這些例子里面,了解了一點(diǎn)點(diǎn)爬蟲的基本原理:下載頁面、解析頁面、定位并抽取數(shù)據(jù)。 當(dāng)然并沒有去系統(tǒng)看 urllib 和 BeautifulSoup 了,我需要把眼前實(shí)例中的問題解決,比如下載、解析頁面,基本都是固定的語句,直接用就行,我就先不去學(xué)習(xí)原理了。 用 urllib 下載和解析頁面的固定句式 當(dāng)然 BeautifulSoup 中的基本方法是不能忽略的,但也無非是 find、get_text()之類,信息量很小。就這樣,通過別人的思路和自己查找美麗湯的用法,完成了豆瓣電影的基本信息爬取。 用 BeautifulSoup 爬取豆瓣電影詳情 ? - 爬蟲漸入佳境 有了一些套路和形式,就會有目標(biāo),可以接著往下學(xué)了。還是豆瓣,自己去摸索爬取更多的信息,爬取多部電影,多個頁面。這個時候就發(fā)現(xiàn)基礎(chǔ)不足了,比如爬取多個元素、翻頁、處理多種情況等涉及的語句控制,又比如提取內(nèi)容時涉及到的字符串、列表、字典的處理,還遠(yuǎn)遠(yuǎn)不夠。 再回去補(bǔ)充 Python 的基礎(chǔ)知識,就很有針對性,而且能馬上能用于解決問題,也就理解得更深刻。這樣直到把豆瓣的TOP250圖書和電影爬下來,基本算是了解了一個爬蟲的基本過程了。 BeautifulSoup 還算不錯,但需要花一些時間去了解一些網(wǎng)頁的基本知識,否則一些元素的定位和選取還是會頭疼。 后來認(rèn)識到 xpath 之后相見恨晚,這才是入門必備利器啊,直接Chrome復(fù)制就可以了,指哪打哪。即便是要自己寫 xpath,以w3school上幾頁的 xpath 教程,一個小時也可以搞定了。requests 貌似也比 urllib 更好用,但摸索總歸是試錯的過程,試錯成本就是時間。 ? - 跟反爬蟲杠上了 通過 requests+xpath,我可以去爬取很多網(wǎng)站網(wǎng)站了,后來自己練習(xí)了小豬的租房信息和當(dāng)當(dāng)?shù)膱D書數(shù)據(jù)。爬拉勾的時候就發(fā)現(xiàn)問題了,首先是自己的請求根本不會返回信息,原來要將自己的爬蟲偽裝成瀏覽器,終于知道別人代碼中那一坨 headers 信息是干啥的了。 在爬蟲中添加 headers 信息,偽裝成真實(shí)用戶 接著是各種定位不到元素,然后知道了這是異步加載,數(shù)據(jù)根本不在網(wǎng)頁源代碼中,需要通過抓包來獲取網(wǎng)頁信息。于是在各種 JS、XHR的文件中 preview,尋找包含數(shù)據(jù)的鏈接。 當(dāng)然知乎還好,本身加載的文件不多,找到了 json 文件直接獲取對應(yīng)的數(shù)據(jù)。(這里要安利一個chrome插件:jsonview,讓小白輕松看懂 json 文件) 瀏覽器抓取 JavaScript 加載的數(shù)據(jù) 在這里就對反爬蟲有了認(rèn)識,當(dāng)然這還是最基本的,更嚴(yán)格的IP限制、驗(yàn)證碼、文字加密等等,可能還會遇到很多難題。但是目前的問題能夠解決不就很好了嗎,逐個擊破才能更高效地學(xué)習(xí)。 比如后來在爬其他網(wǎng)站的時候就被封了IP,簡單的可以通過 time.sleep() 控制爬取頻率的方法解決,限制比較嚴(yán)格或者需要保證爬取速度,就要用代理IP來解決。 當(dāng)然,后來也試了一下 Selenium,這個就真的是按照真實(shí)的用戶瀏覽行為(點(diǎn)擊、搜索、翻頁)來實(shí)現(xiàn)爬蟲,所以對于那些反爬蟲特別厲害的網(wǎng)站,又沒有辦法解決,Selenium 是一個超級好用的東東,雖然速度稍微慢點(diǎn)。 - ? - 嘗試強(qiáng)大的 Scrapy 框架 有了 requests+xpath 和抓包大法,就可以做很多事情了,豆瓣各分類下的電影,58同城、知乎、拉勾這些網(wǎng)站基本都沒問題。不過,當(dāng)爬取的數(shù)據(jù)量級很大,而且需要靈活地處理各個模塊的話,會顯得很力不從心。 于是了解到強(qiáng)大的 Scrapy 框架,它不僅能便捷地構(gòu)建 Request,還有強(qiáng)大的 Selector 能夠方便地解析 Response,然而最讓人驚喜的還是它超高的性能,可以將爬蟲工程化、模塊化。 Scrapy 框架的基本組件 學(xué)會 Scrapy,自己去嘗試搭建了簡單的爬蟲框架,在做大規(guī)模數(shù)據(jù)爬去的時候能夠結(jié)構(gòu)化、工程化地思考大規(guī)模的爬取問題,這使我可以從爬蟲工程的維度去思考問題。 當(dāng)然 Scrapy 本身的 selector 、中間件、spider 等會比較難理解,還是建議結(jié)合具體的例子,參考別人的代碼,去理解其中實(shí)現(xiàn)的過程,這樣能夠更好地理解。 用 Scrapy 爬取了大量租房信息 本地文件搞不動了,上數(shù)據(jù)庫 爬回來大量的數(shù)據(jù)之后就發(fā)現(xiàn),本地的文件存起來非常不方便,即便存下來了,打開大文件電腦會卡得很嚴(yán)重。怎么辦呢?果斷上數(shù)據(jù)庫啊,于是開始入坑 MongoDB。結(jié)構(gòu)化、非結(jié)構(gòu)化的數(shù)據(jù)都能夠存儲,安裝好 PyMongo,就可以方便地在 Python 中操作數(shù)據(jù)庫了。 MongoDB 本身安裝會比較麻煩,如果自己一個人去折騰,很有可能會陷入困境。剛開始安裝的時候也是出現(xiàn)各種BUG,幸得大神小X指點(diǎn),解決了很多問題。 當(dāng)然對于爬蟲這一塊,并不需要多么高深的數(shù)據(jù)庫技術(shù),主要是數(shù)據(jù)的入庫和提取,順帶掌握了基本的插入、刪除等操作??傊?,能夠滿足高效地提取爬下來的數(shù)據(jù)就OK了。 爬取拉勾招聘數(shù)據(jù)并用 MongoDB 存儲 傳說中的分布式爬蟲 這個時候,基本上很大一部分的網(wǎng)頁都能爬了,瓶頸就集中到爬取大規(guī)模數(shù)據(jù)的效率。因?yàn)閷W(xué)了 Scrapy,于是自然地接觸到一個很厲害的名字:分布式爬蟲。 分布式這個東西,一聽不明覺厲,感覺很恐怖,但其實(shí)就是利用多線程的原理讓多個爬蟲同時工作,除了前面學(xué)過的 Scrapy 和 MongoDB,好像還需要了解 Redis。 Scrapy 用于做基本的頁面爬取,MongoDB 用于存儲爬取的數(shù)據(jù),Redis 則用來存儲要爬取的網(wǎng)頁隊列,也就是任務(wù)隊列。 分布式這東西看起來很嚇人,但其實(shí)分解開來,循序漸進(jìn)地學(xué)習(xí),也不過如此。 分布式爬58同城:定義項目內(nèi)容部分 零基礎(chǔ)學(xué)習(xí)爬蟲,坑確實(shí)比較多,總結(jié)如下:
所以跟我一樣,很多人爬坑最大的體會是:盡量不要系統(tǒng)地去啃一些東西,找一個實(shí)際的項目(從豆瓣這種簡單的入手),直接開始就好。 因?yàn)榕老x這種技術(shù),既不需要你系統(tǒng)地精通一門語言,也不需要多么高深的數(shù)據(jù)庫技術(shù),從實(shí)際的項目中去學(xué)習(xí)這些零散的知識點(diǎn),你能保證每次學(xué)到的都是最需要的那部分。 當(dāng)然麻煩的是,在具體的問題中,如何找到具體需要的那部分學(xué)習(xí)資源、如何篩選和甄別,遇到困難時如何有效解決,是很多初學(xué)者面臨的大問題。 關(guān)于爬蟲系統(tǒng)學(xué)習(xí)路線和框架,我有一個系統(tǒng)的學(xué)習(xí)框架圖,希望能幫到大家。 關(guān)于Python-web開發(fā),這是系統(tǒng)學(xué)習(xí)框架圖,希望能幫到你。 我搜索了下爬蟲工程師的薪資待遇。 |
|