Python1707A學(xué)員感言:寫爬蟲很簡單又很難
來源:
奇酷教育 發(fā)表于:
通過這次做項目,使我對項目開發(fā)有了進一步的認識。做項目的時候,最重要的不是自己如何快速地將自己分配的任務(wù)做完,而是要注重團隊合作
通過這次做項目,使我對項目開發(fā)有了進一步的認識。做項目的時候,最重要的不是自己如何快速地將自己分配的任務(wù)做完,而是要注重團隊合作。一開始組內(nèi)必須對這個項目的數(shù)據(jù)庫的命名進行討論,定義表的屬性的數(shù)據(jù)類型,表與表之間會有關(guān)聯(lián),所以有的屬性的類型與長度必須定義一致,這樣訪問數(shù)據(jù)庫時才不會出錯。如果一開始不將這些步驟統(tǒng)一下來的話,就會給后面的編程帶來一系列的問題。
整個一周的項目,第一天我們就對項目的數(shù)據(jù)庫以及數(shù)據(jù)表有了初步的建立,然后后面還有許多模塊需要分工,當然,有些具體的模塊需要完成的功能,都還不甚清楚,因此我們第一天就針對這個web項目做了一個簡單的Django框架的搭建,以及前期項目比較依賴的登錄注冊部分給完善了出來。
整個項目包含了有:購物車,商品列表頁,商品詳情頁,訂單頁面,支付頁面,個人用戶信息完善頁面,首頁的完善展示和一些小功能,然而我們組有5個人呢,我有身為組長,其中最重要的一部分,商品數(shù)據(jù)的獲取部分就是由我來做的。
從第二天開始,我們就開始按照各自的分工開始寫自己的項目了,但是,一旦開始些項目之后,隨之而來的各種問題就出現(xiàn)了,例如商品列表頁面需要一些基礎(chǔ)的數(shù)據(jù)部分,這些數(shù)據(jù)是需要我來爬取,具體的商品需要分類,這些商品類型也是需要我首先爬取一部分基礎(chǔ)的測試數(shù)據(jù)的,還有一部分商品詳情頁的內(nèi)容也是需要我先爬取一部分基礎(chǔ)測試數(shù)據(jù)的,因此,我就開始了我的基礎(chǔ)測試數(shù)據(jù)的爬取。
我選擇的是爬蟲,因此為了起初為了效率,我是選擇的比較高效率的scrapy框架來爬取數(shù)據(jù)的,但是,當寫了一段時間代碼之后,發(fā)現(xiàn)自己對著一套框架并不熟悉,底層封裝的各種代碼,的用途都不是很熟悉,感覺就是寫代碼根本就是不可控制的,這就很難受,幾經(jīng)猶豫,最終我轉(zhuǎn)回了基本的requests模塊,雖說比較基礎(chǔ),但也還沒到了urllib2的那種程度,因此寫起來也就比較得心應(yīng)手了,同時感覺可控制性也比較強,一天下來,商品列表的爬取代碼也寫的差不多了,到了爬取數(shù)據(jù)的時候終于還是出了不少問題。
比如,再匹配頁面數(shù)據(jù)的時候,我選擇的是使用Xpath來匹配頁面數(shù)據(jù),明明在網(wǎng)頁上使用的xpath查詢工具能夠匹配到數(shù)據(jù),可是寫在代碼里面就是匹配不到數(shù)據(jù),這個問題一直困擾了,我很長時間,直到我上網(wǎng)百度之后,才發(fā)現(xiàn),有些問題還是自己的問題,當順利解決之后,最終還是選擇了使用正則與Xpath的混合使用完成了商品類型列表的爬取部分。當然,這也是我第二天完成了自己爬取組內(nèi)基礎(chǔ)測試數(shù)據(jù)部分的爬取。
由于我寫的是爬蟲,當項目的數(shù)據(jù)模型類基本定下來之后,就只需要關(guān)心自己的數(shù)據(jù)問題與數(shù)據(jù)庫的數(shù)據(jù)的對應(yīng)問題就可以了,可是,身為項目小組中的組長,我還是要肩負一部分的責(zé)任的,一天下來,組內(nèi)成員也積累了不少問題,比如,白天在代碼同步的時候,總會有些人因為在提交之前沒有更新,其他人再更新的時候,就會莫名的有一部分代碼被刪掉,這些都是更行代碼不同步的問題,當然,其他問題也在討論的時候得到了一一的解決。
到了第三天,真正需要完整的爬取整站的數(shù)據(jù)的時候,終于還是出了不少問題,例如:這次我們的模板是個全英文的電商網(wǎng)站模板,因此,我在爬取國內(nèi)網(wǎng)站的中文數(shù)據(jù),放在一塊就會顯得非常的不倫不類的感覺,在幾經(jīng)權(quán)衡之下,我選擇了爬取國外同樣的一個大型電商網(wǎng)站。
又經(jīng)過了一天的奮斗之后,寫完了一套代碼,問題總是在不經(jīng)意間到來,由于爬的是國外網(wǎng)站的數(shù)據(jù),因此爬取數(shù)據(jù)的時候,效率就異常的低,幾乎是兩三秒爬取一條的商品數(shù)據(jù),然而整站的數(shù)據(jù)算下來幾乎能達到40000條數(shù)據(jù),這樣肯定是不行的,何況還要保存,入庫,如果整個爬下來之后再入庫肯定是不行的,首先內(nèi)存就會不支持,因此,不得已我就考慮會不會是我的代碼的性能問題。
于是乎,又接下來的一天我就對代碼做了大量的修改,完全改成了多進程多線程式的操作,可是結(jié)果仍不盡如人意,效率不見提升,反而又降低了不少,經(jīng)過跟組員門的討論之后,考慮應(yīng)該是數(shù)據(jù)量是固定的,多線程爬取的話,就會造成并發(fā)量過大,同時發(fā)送的請求量占用了大量的帶寬,導(dǎo)致了下行數(shù)據(jù)的速度非常緩慢。
不得已,我又對代碼做了大量的修改,于是乎,第三個版本就是,單純的雙進程,一個寫入數(shù)據(jù),一個爬取數(shù)據(jù),這樣下來,效率倒也還好,但是也就跟剛開始差不多,就這樣爬取了一整天,期間跟其他組員共同完成了許多其他難以解決的問題。
問題的出現(xiàn)總是不可避免的,出現(xiàn)了就要解決,這次的問題就是,爬了整天的數(shù)據(jù),到最后,一直只是寫入,卻并沒有保存,因此到了最后需要加快進度,于是就又一次修改代碼,在爬取數(shù)據(jù) 的時候,沒爬取一類自動保存一次,當然,為了不重復(fù)爬取,同時增加了指紋集合的功能,這次總算能有一部分數(shù)據(jù)了。
當然,最后肯定不能就這樣草草結(jié)束,項目還并不完整,結(jié)束以后,一些細節(jié)以及數(shù)據(jù),仍然需要完成??傮w來說,在此次項目中,我們小組雖說經(jīng)歷了各種困難,但我們都憑借各種途徑解決掉了,增加了項目協(xié)同開發(fā)的經(jīng)驗的同時,我也覺得這就是一種自我提升的手段,相信對以后自己的工作中會有很大的用處的。