閱讀802 返回首頁    go Python


如何入門 Python 爬蟲?

“入門”是良好的動機,但是可能作用緩慢。如果你手裏或者腦子裏有一個項目,那麼實踐起來你會被目標驅動,而不會像學習模塊一樣慢慢學習。另外如果說知識體係裏的每一個知識點是圖裏的點,依賴關係是邊的話,那麼這個圖一定不是一個有向無環圖。因為學習A的經驗可以幫助你學習B。因此,你不需要學習怎麼樣“入門”,因為這樣的“入門”點根本不存在!你需要學習的是怎麼樣做一個比較大的東西,在這個過程中,你會很快地學會需要學會的東西的。當然,你可以爭論說需要先懂python,不然怎麼學會python做爬蟲呢?但是事實上,你完全可以在做這個爬蟲的過程中學習python :D看到前麵很多答案都講的“術”——用什麼軟件怎麼爬,那我就講講“道”和“術”吧——爬蟲怎麼工作以及怎麼在python實現。先長話短說summarize一下:你需要學習基本的爬蟲工作原理基本的http抓取工具,scrapyBloom Filter: Bloom Filters by Example如果需要大規模網頁抓取,你需要學習分布式爬蟲的概念。其實沒那麼玄乎,你隻要學會怎樣維護一個所有集群機器能夠有效分享的分布式隊列就好。最簡單的實現是python-rq: https://github.com/nvie/rqrq和Scrapy的結合:darkrho/scrapy-redis · GitHub後續處理,網頁析取(grangier/python-goose · GitHub),存儲(Mongodb)以下是短話長說:說說當初寫的一個集群爬下整個豆瓣的經驗吧。1)首先你要明白爬蟲怎樣工作。想象你是一隻蜘蛛,現在你被放到了互聯“網”上。那麼,你需要把所有的網頁都看一遍。怎麼辦呢?沒問題呀,你就隨便從某個地方開始,比如說人民日報的首頁,這個叫initial pages,用$表示吧。在人民日報的首頁,你看到那個頁麵引向的各種鏈接。於是你很開心地從爬到了“國內新聞”那個頁麵。太好了,這樣你就已經爬完了倆頁麵(首頁和國內新聞)!暫且不用管爬下來的頁麵怎麼處理的,你就想象你把這個頁麵完完整整抄成了個html放到了你身上。突然你發現, 在國內新聞這個頁麵上,有一個鏈接鏈回“首頁”。作為一隻聰明的蜘蛛,你肯定知道你不用爬回去的吧,因為你已經看過了啊。所以,你需要用你的腦子,存下你已經看過的頁麵地址。這樣,每次看到一個可能需要爬的新鏈接,你就先查查你腦子裏是不是已經去過這個頁麵地址。如果去過,那就別去了。好的,理論上如果所有的頁麵可以從initial page達到的話,那麼可以證明你一定可以爬完所有的網頁。那麼在python裏怎麼實現呢?很簡單import Queue

url_queue = Queue.Queue()

seen = set()

seen.insert(initial_page)

url_queue.put(initial_page)

while(True): #一直進行直到海枯石爛

if url_queue.size()>0:

current_url = url_queue.get() #拿出隊例中第一個的url

store(current_url) #把這個url代表的網頁存儲好

for next_url in extract_urls(current_url): #提取把這個url裏鏈向的url

if next_url not in seen:

seen.put(next_url)

url_queue.put(next_url)

else:

break

寫得已經很偽代碼了。所有的爬蟲的backbone都在這裏,下麵分析一下為什麼爬蟲事實上是個非常複雜的東西——搜索引擎公司通常有一整個團隊來維護和開發。2)效率如果你直接加工一下上麵的代碼直接運行的話,你需要一整年才能爬下整個豆瓣的內容。更別說Google這樣的搜索引擎需要爬下全網的內容了。問題出在哪呢?需要爬的網頁實在太多太多了,而上麵的代碼太慢太慢了。設想全網有N個網站,那麼分析一下判重的複雜度就是N*log(N),因為所有網頁要遍曆一次,而每次判重用set的話需要log(N)的複雜度。OK,OK,我知道python的set實現是hash——不過這樣還是太慢了,至少內存使用效率不高。通常的判重做法是怎樣呢?Bloom Filter. 簡單講它仍然是一種hash的方法,但是它的特點是,它可以使用固定的內存(不隨url的數量而增長)以O(1)的效率判定url是否已經在set中。可惜天下沒有白吃的午餐,它的唯一問題在於,如果這個url不在set中,BF可以100%確定這個url沒有看過。但是如果這個url在set中,它會告訴你:這個url應該已經出現過,不過我有2%的不確定性。注意這裏的不確定性在你分配的內存足夠大的時候,可以變得很小很少。一個簡單的教程:Bloom Filters by Example注意到這個特點,url如果被看過,那麼可能以小概率重複看一看(沒關係,多看看不會累死)。但是如果沒被看過,一定會被看一下(這個很重要,不然我們就要漏掉一些網頁了!)。 [IMPORTANT: 此段有問題,請暫時略過]好,現在已經接近處理判重最快的方法了。另外一個瓶頸——你隻有一台機器。不管你的帶寬有多大,隻要你的機器下載網頁的速度是瓶頸的話,那麼你隻有加快這個速度。用一台機子不夠的話——用很多台吧!當然,我們假設每台機子都已經進了最大的效率——使用多線程(python的話,多進程吧)。3)集群化抓取爬取豆瓣的時候,我總共用了100多台機器晝夜不停地運行了一個月。想象如果隻用一台機子你就得運行100個月了...那麼,假設你現在有100台機器可以用,怎麼用python實現一個分布式的爬取算法呢?我們把這100台中的99台運算能力較小的機器叫作slave,另外一台較大的機器叫作master,那麼回顧上麵代碼中的url_queue,如果我們能把這個queue放到這台master機器上,所有的slave都可以通過網絡跟master聯通,每當一個slave完成下載一個網頁,就向master請求一個新的網頁來抓取。而每次slave新抓到一個網頁,就把這個網頁上所有的鏈接送到master的queue裏去。同樣,bloom filter也放到master上,但是現在master隻發送確定沒有被訪問過的url給slave。Bloom Filter放到master的內存裏,而被訪問過的url放到運行在master上的Redis裏,這樣保證所有操作都是O(1)。(至少平攤是O(1),Redis的訪問效率見:LINSERT – Redis)考慮如何用python實現:在各台slave上裝好scrapy,那麼各台機子就變成了一台有抓取能力的slave,在master上裝好Redis和rq用作分布式隊列。代碼於是寫成#slave.py

current_url = request_from_master()

to_send = []

for next_url in extract_urls(current_url):

to_send.append(next_url)

store(current_url);

send_to_master(to_send)

#master.py

distributed_queue = DistributedQueue()

bf = BloomFilter()

while(True):

if request == 'GET':

if distributed_queue.size()>0:

send(distributed_queue.get())

else:

break

elif request == 'POST':

bf.put(request.url)

好的,其實你能想到,有人已經給你寫好了你需要的:darkrho/scrapy-redis · GitHub4)展望及後處理雖然上麵用很多“簡單”,但是真正要實現一個商業規模可用的爬蟲並不是一件容易的事。上麵的代碼用來爬一個整體的網站幾乎沒有太大的問題。但是如果附加上你需要這些後續處理,比如有效地存儲(數據庫應該怎樣安排)有效地判重(這裏指網頁判重,咱可不想把人民日報和抄襲它的大民日報都爬一遍)有效地信息抽取(比如怎麼樣抽取出網頁上所有的地址抽取出來,“朝陽區奮進路中華道”),搜索引擎通常不需要存儲所有的信息,比如圖片我存來幹嘛...及時更新(預測這個網頁多久會更新一次)如你所想,這裏每一個點都可以供很多研究者十數年的研究。雖然如此,“路漫漫其修遠兮,吾將上下而求索”。所以,不要問怎麼入門,直接上路就好了:)

最後:

自己多問下為什麼學python

如果一門語言沒有改變你的編程思維,那麼它不值得你去學習”。如果這麼說,我們大學的時候,學習了c,c++,java,C#,算是值得學習麼?很多時候是不值得,我覺得我們大學的課程就是用java,c#,c++把"C程序設計"又上了一遍.

這是因為,學校的老師會C和java之類的,所以要跟著規矩開這門課,(這也就是為什麼,許多學校還在教vb,),這也就是為什麼,你所以為的一樣就是大家都有For都有while,都有switch..都有Class...都有int 都有float,所謂的不一樣就是用C有指針,java沒有,這就是為什麼教育是失敗的,這也就是為什麼,我目前認識的幾個編程大牛

python的優點:簡單 我所說的簡單,是相比於象C和C++這樣的語言,你為了編程,要學習許多偏底層的東西.在比如,你在學習一個新的編程範式,或者想要馬上做個例子看看,試驗某個API,如果你是寫java的,你不得不去寫一個main,寫一些構造,即使有IDE這樣的東西,能夠為你帶來代碼生成器,而我做得就是寫一段“腳本”,或者打開python交互式解釋器就行了。

自己認識的python朋友出去工作,工資比較高,然後自己又剛剛好是會python所以選擇學習python,這樣的人比較危險但是也比較有激勵,還有就是覺得python比其他開發語言好用。

學完python前景會咋樣

其實我個人是很看好python未來的就業前景的,因為我認識太多的工程師都已經在學python,很多都是月收入大幾萬的

我個人也並非一直用python。前些年主要用c/c++以及java開發一些通信,移動係統,互聯網通信。近3年開始才轉向python。坦白的說,這可能與你相處的公司以及環境不大一樣。隨便舉個例子,google的protocol buffer協議一出來就具有c++/python/java三種語言支持。google的廣告係統早在03,04年左右就一並對python進行了webservice支持,大部分涉及基礎核心係統的公司,都開始對python進行了擴展支持。甚至開源社區的postgresql數據庫,除了自身的ansi SQL,pgsql,pg/TCL,PG/PERL之外對python進行了內嵌支持,唯獨卻沒有唿聲很高的java。在FREEBSD(MIT)/LINUX(GPL)平台上,對java可能排斥性比較大,但綜合而言,目前python發展還沒有java那種普及,主要是python大部分工作仍然是在較為深入地係統層和框架層做設計開發,例如django,SQLAlchemy,fail2ban,mail郵件係統,twisted等等。這部分對於那種習慣應用前輩們框架的編碼人員而言,缺乏創造力的他們根本無法適用這種開發。尤其在python涉及一些係統層麵需要有較強的c/c++能力,這部分人在國內要麼就累得要死沒時間,要麼就啥都不會就會拷貝代碼,而國內公司也鮮有主動去做這部分基礎勞動的,大多都是等別人做好了在直接拿來用,所以造就了任何技術性的東西出來,國內都是先等等看,然後抄襲應用。

大環境如此,但千萬誤認為先等等看吧。對於一個技術人員而言,缺乏對新技術的渴望與熱情,這是一種非常危險的事情。我工作8年了,按照國內很多的人的說法早已不做代碼了,但又一次在聽一個老外的演講,他說他50多歲仍然每天堅持寫代碼,了解最新的動態,所以他才能做到他們公司的首席科學家,因此它才能時刻指導項目團隊前進並保證項目的質量。他坦言對於一個不寫代碼並且不了解最新的技術動態的技術人員或者技術團隊的負責人而言,這種團隊也就足夠做作小項目,一旦壓力和項目過大,就會有很多問題漏出來。

對於新人而言,無論學習什麼技術,都要以鼓勵的姿態出現。太多用薪水和你個人所看到的現狀去衡量一門技術,那絕對是欠缺眼光的。任何一門技術,一旦有人學習,他有可能逐漸成為這個領域的專家,即便再濫再沒有人用的開發語言技術,他也有可能就是明日的奠基者或者大師。

自己如何確定目標

在生活中學會不斷挖掘自己的潛力。我們都是一個普通人,可能並不清楚自己到底在哪方麵占有優勢。所以,學著在生活中找到自己的優勢,並根據優勢選擇一定的就業方向。

不隨波逐流。不要看周圍的人做什麼,自己就做什麼,也許別人做的並不適合你。別人的優勢很可能會成為你的劣勢。所以,堅定自己的想法,讓自己知道那些方麵適合自己,自己可以勝任。

不斷嚐試可能成為自己的優勢。你不知道什麼適合自己,所以才要大膽、勇敢地嚐試。找到一種可以屬於你的獨特的優勢。

堅定信念。一旦你堅定了自己的信念,就不要被別人的意見或是諷刺或是嘲笑所幹擾。別人不是你,不懂的你在想什麼,不清楚你開始這件事的源頭。你的事情,不了解你的人,沒有資格輕易評說。

不茫然,不多想。別讓太多的事幹擾到你奮鬥下去的信念。夢想不容許太多的雜念。那些雜念隻會讓你的心愈來愈脆弱,多為一個人考慮,到頭來,傷害的還是自己。

選擇自己學習方法

每個人都有適合自己的方法,有的人去選擇自學,有的人選擇看視頻學習,有的人選擇報名培訓班,那在這個時候,你就要自己考慮清楚,到底那樣對的幫助是最大的,個人覺得是跟著培訓班最好的,畢竟人家的實戰項目多,我們學軟件開發的都知道實戰項目對於學好一門語言是 很重要的。

學習python有那些誤區

具體裏麵的誤區非常的多,那些就不需要我去寫出來,我給你說的一般都是心態的問題,首先一個覺得自己會java和c++,然後我學習python就很牛,但是你要知道語言是有很多相同的地方,但是不是通用,一定要自己學習的仔細。還有一種就是覺得我不會英語,我要先去把英語學習好在來學python。因為自己想還壞主意然後學習,這樣的都是容易找進誤區的。

怎麼樣才能學好python

感覺寫的好,對你有幫助,就點個讚唄,別光隻收藏哈.~( ̄ ̄)~

最後更新:2017-10-08 15:35:55

  上一篇:go Python2和Python3哪個更適合初學者學習來爬蟲呢?
  下一篇:go 機器學習實戰:Python信用卡欺詐檢測