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