若是你不知道作什麼,那就學一門雜學吧

序言

這篇文章沒有代碼,請放心閱讀。html

多年之後,面對人工智能研究員那混亂不堪的代碼,我會想起第一次和S君相見的那個遙遠的下午。那時的B公司,仍是一個僅有6我的的小團隊,Mac和顯示器在桌上依次排開,你們坐在一塊兒,不須要稱呼姓名,轉過臉去,對方就知道你在和他說話。一切看起來都那麼美好,咱們全部人,都但願本身和這個公司可以一塊兒成長。前端

彼時S君剛從加拿大回來,老闆把他介紹給咱們,因而S君做爲數據產品經理跟我有了項目上的接觸。正則表達式

創業公司裏面,每個人都須要會不少的技藝,因而S君開始自學Python。數據庫

有一天,S君問我:「你玩MineCraft嗎?「編程

「玩,但我更喜歡在B站上看別人的世界。」我答道。小程序

「我以爲我如今寫程序,像是在玩個人世界。」S君笑着說道。微信小程序

「是否是以爲你已經掌握了Python的基本語法,看着別人把Python用的溜溜轉,而你本身殊不知道用它來作什麼?」瀏覽器

「是這樣的,你懂我。」安全

「那你學一門雜學吧。」微信

因而S君被我誘拐過來跟我一塊兒寫爬蟲。

後來,S君離開了B公司。

三個月後,我也離開了。

今後,咱們再也沒有見過。

編程最重要的能力是變通

S君是一個老實孩子。

在開發一個爬蟲的過程當中,網站接口返回給他的數據看起來是JSON格式,因而他就用Python自帶的JSON庫去解析。結果解析失敗了。由於這些所謂的看起來像JSON的東西,居然沒有雙引號。

難道是JSON的超集?S君一通搜索,發現用YMAL庫也許能夠解析這種數據。因而安裝YMAL庫,一解析又報錯。

難道這些數據直接就是Python的字典?因而S君用上了邪惡的eval。又報錯,由於裏面有null和小寫的true。

「你爲何不試一試直接用正則表達式呢?」我對S君說。

「靠!」S君一拍桌子,旁邊的老闆嚇得把搪瓷杯子裏面的快樂水灑在了白襯衣上。

而後S君用正則表達式花了10秒鐘結束了戰鬥。

寫爬蟲與三峽大壩

有一天,S君興沖沖地跑來跟我說:「我體會到三峽大壩的偉大功能了!」

「你是爬蟲工程師仍是水利工程師?」

「你知道嗎,無論上游的水勢多麼兇猛,從大壩出來之後老是安全而穩定。」S君並無回答個人問題,而是自顧自地說道。

「原來你開始用Kafka。不錯,孺子可教。」

S君吐了一下舌頭:「仍是師傅教導有方。」

前不久,S君的爬蟲剛剛達到了日產數據千萬條的目標。然而他只高興了一天。由於他發現,數據寫到數據庫之後,讀起來很麻煩。

S君有多個數據分析的系統須要從數據庫裏面讀取爬蟲爬好的數據,可是從天天千萬量級的數據中尋找特定的數據是一個很慢的過程。若是程序遇到異常致使崩潰,又得從頭開始讀。

S君問我:「如今我每個數據分析的腳本都要從數據庫裏面讀一次數據,作了太多重複的工做,單機單節點的數據庫快要撐不住了。我是否是要去學習分庫分表搭建集羣啊?」

我告訴S君:「這個後面你天然是須要去作的。但如今,你能夠先試一試Kafka,我已經搭建好了一個Kafka的集羣了,你這樣使用……」。

後來,S君讓全部爬蟲把爬到的數據到直接送進了Kafka,而後再從Kafka裏面讀數據出來,一個Group用來備份原始數據,一份Group用來生成中間表,一份Group用來監控報警,一份Group用來繪製DashBoard。不管爬蟲塞給Kafka的數據有多少,有多快,從Kafka讀數據的地方都能按照本身的節奏來消費和使用。

既然收集了數據就要讓它發光發熱

S君在加拿大留學時學的專業是金融數學和統計。因此他對數據分析也頗有興趣。在他爬蟲收集的數據夠用之後,我跟他講了如何使用Pandas來分析數據。

S君把他分析的酒店價格變化數據給分享給了咱們。不愧是金融+數學+統計學背景的高級知識分子 + 超級強大的Pandas + 超級好用的Jupyter。這份數據不只完美再現了過去一年的價格走勢,還預測了將來的任何變化,多達四十六張圖表彷佛窮盡了全部的組合。

草木竹石皆可破敵

S君曾經遇到過一個特別簡單的電商網站。頁面幾乎像素級抄襲淘寶,可是徹底沒有任何反爬蟲的機制。以S君的水平,從審查元素,到開發完成,僅僅用了半個小時。爬蟲安全平穩又順利地運行了三個星期。

而後,有一天早上,爬蟲死掉了。

S君用盡畢生所學,沒法再從這個網站上爬到任何有價值的信息。這個網站彷佛請來了一個機器行爲對抗的大神級人物。人用瀏覽器一點問題都沒有,但S君的任何隱藏爬蟲的手段都被輕易識破。

S君找到我:「師傅,這個網站我搞不定。」

「你能搞定。動動腦子。」

「我會的全部技術都用上了,徹底看不出破解他反爬蟲機制的方法。」S君已經失去了信心。

「那就,不要用技術去對抗。用你的腦子。」

S君抱着顯示器用頭一遍一遍的撞。

我問S君:「你有沒有思考一個問題,這個網站模仿了淘寶的皮,卻又毫無反爬蟲機制。你以爲他的老闆是一個什麼樣的人?你聽過那個段子嗎?」

S君忽然一躍而起:「我給你一萬元,你幫我作一個網站吧。你想要什麼樣的網站?很簡單,就淘寶那樣的。你是說這個段子嗎?」

「對。」

S君忽然之間榮光煥發:「有辦法了!」

只見S君從新在瀏覽器打開了這個網站,找到了客戶服務熱線。電話一撥通他就開始一通污言穢語罵起來:「……大家網站到底在搞什麼?爲何今天一會能登陸一會不能登陸?找大家老闆來!我來教他怎麼作網站!……」

半小時之後,網站反爬蟲機制所有解除。

此刻,S君面向西面雙手合十,自言自語:「兄弟,對不起了,只有讓你來背這個鍋了。」

你小學上課傳過紙條嗎

「我如今能體會那些半路攔截紙條的人是什麼心態了。」這是S君第一次使用Charles時對我說的話。

今後之後,我不多看到S君分析網頁了。由於他學會了在爬蟲開發的過程當中,首先經過中間人攻擊技術分析微信小程序和手機App。這種方式每每可以直接得到數據,拿到數據之後就能直接儲存,不再用寫煩人的XPath或者長的跟表情符號同樣的正則表達式了。

有一天,我在玩一個網頁版的黑客解密遊戲,在網頁上尋找某個地方隱藏起來的密碼,而後輸入每一關的回答框中,答對才能進入下一關。

遊戲有12關,而我卡在了第6關。只見S君拿着電腦走到我面前,指着第12關的通關頁面跟我炫耀。

「你是否是用MITMProxy替換了這個網站的Js文件?」

「果真仍是瞞不過師傅你啊。」

「你攔截了別人的紙條,作了修改,而後又疊好繼續傳下去,你有考慮過發紙條的人和收紙條的人的感覺嗎?」

「我小學時候不傳紙條,都是妹子直接約個人。」

加密?不存在的

「前端沒有祕密」。S君在成功逆向了一個網站的Js文件之後如是對我說。

「那是由於這個網站的Js代碼就赤裸裸地放在你面前,徹底沒有混淆。」我對S君說道。

「不怕,我能夠用Node.js來運行混淆過的代碼。我已經搭建好Node.js服務了,只要把Js代碼傳進去,他就會把結果給我返回回來。」S君對此彷佛一臉自行。

「你何時學會的Node.js?」

「這不是師傅你說過技多不壓身嗎?既然作爬蟲須要動JavaScript,那我順手就把Node.js給學了。」S君絕不畏懼的表情,彷佛證實他已經猜透了我要問什麼。

「那若是目標沒有網站,只有App呢?」

「不怕,Android 逆向工程我也順便研究了一點。Java我也看得懂。」

「看來這些已經不須要我再教你了。」

我一根指頭就能捏死你,但我不想傷害你

S君有一天問我:「假設你如今在小學課堂上,前面的同窗讓你把紙條傳給後面的女生,你會怎麼作?」

我說:「查看複製/修改刪除/攔截丟棄」。

S君嘿嘿一笑:「好比說,先後三次的紙條分別爲‘據說你奶奶生病了,咱們週末一塊兒去看望她吧‘,’今晚我爸媽不在,去我家玩嗎?’, ‘我剛拿到這個月壓歲錢,老師一下課咱們就去吃好吃的。’」

我說:「女孩漂亮的話,我改一下第二張紙條,改爲‘今晚我爸媽不在,咱們一塊兒去青南家玩嗎?’」。

S君露出了嫌棄的眼神:「師傅,你但是說過你最討厭技術含量低的事情啊,你塗改了紙條,別人不會發現?你筆跡都不同啊!」。

我問S君:「那你有何高見?」

S君擡頭仰望這窗外的天空:「若是是我,那麼我會臨摹第一張紙條上面的生病了 去看望 ,第二張紙條上面的爸媽,第三張紙條上面的 老師這些字的筆跡。而後改換一下順序就變成了:爸媽,我老師生病了,我拿錢去看望她。最後我把這張僞造的紙條拿去找寫紙條的那個同窗他爸媽要錢。」

「我猜,你想用中間人攻擊截取別人的Cookies,而後用這些Cookies偷偷登陸網站,進行你的不可告人的目的。」

S君笑道:「哈哈哈,我想一想都懼怕。可是每當我想到,我擁有一種可怕的力量,而我還能控制住這種力量。我就知道我和街上的普通人不同了。」

你確定薅了直播答題的羊毛吧

去年年末的直播答題着實火了一把。那個時候,我和S君分開已經有一段時間了。我相信,在全民答題的每個夜晚,S君的電腦上必定連着很多於六臺安卓手機。這些手機運行着不一樣的答題平臺,可以自動讀取屏幕上的問題並自動選擇答案。

我把安卓自動化測試技術教給S君,原本是讓他結合爬蟲,實現羣控從而抓取一些難以處理的數據,但我相信他確定會用來答題。

變通,這一點他學的愈來愈好了。

只但願他不要成爲羊毛黨。

後記

後來,我再也沒有見過S君這樣有趣的人。因此我把我教給S君的東西,寫成了一本書:《Python爬蟲開發 從入門到實戰》,如今已在京東,噹噹與亞馬遜上架。但願你也能變成S君同樣有趣而又厲害的人。

爬蟲是一門雜學。由於在一個完整的開發過程當中,須要涉及到的知識能夠包括但不限於:Python,HTML,JavaScript,正則表達式,XPath,數據庫,Redis,消息隊列,Docker,ELK,Hadoop,數據分析,ETL,中間人攻擊,自動化測試技術,可視化……

這其中的任何一項,在一個大公司裏面均可以讓不少人來作。

爬蟲開發,就像這篇文章裏面反覆出現的一個詞:變通——只要可以得到數據,任何技術均可以使用。所謂草木竹石皆可爲劍。爬蟲不該該是一個枯燥的一成不變的模式化的工做。而是一個充滿了創意和挑戰,可以讓旁觀者大呼「我X還能這樣搞」的工做。

爬蟲開發,絕對不只僅是Scrapy,PySpider,requests這些框架或者庫的使用。因此在這本書裏面,我也刻意減小了框架使用說明的部分,而把重點放在了各類突破反爬蟲機制或者使用變通的方法繞過反爬蟲機制的方法論和實踐中。

經過學習爬蟲,你最後不必定選擇爬蟲工程師這個崗位,可是在學習爬蟲的過程當中,你將會接觸到的各類工具,方法,服務組件,都會在你之後的生活和工做中幫到你,讓你知道,在遇到一個問題的時候,解決方法在哪一個地方。

本書讀者交流羣現已開啓,掃碼添加公衆號,回覆:讀者交流 便可得到加羣方式。

相關文章
相關標籤/搜索