相關(guān)鏈接: 浙江安全網(wǎng) 浙江質(zhì)量網(wǎng) 浙江論文網(wǎng) 浙江資訊網(wǎng)
中圖分類號:TN915 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2015)03-0000-00
隨著“互聯(lián)網(wǎng)+”時(shí)代的到來,電子商務(wù)也進(jìn)入了一個(gè)新的發(fā)展時(shí)期,2014年電子商務(wù)的交易額超過了12萬億元,電子商務(wù)的飛速發(fā)展產(chǎn)生了大量的交易數(shù)據(jù),這些數(shù)據(jù)可以在許多領(lǐng)域產(chǎn)生驚人的價(jià)值。相關(guān)數(shù)據(jù)已經(jīng)成為一種重要的生產(chǎn)資料,越來越多的人認(rèn)識到電子商務(wù)產(chǎn)生的數(shù)據(jù)的價(jià)值,并且在許多領(lǐng)域進(jìn)行了應(yīng)用。目前比較成功的應(yīng)用已經(jīng)有許多,例如推薦系統(tǒng)[1,2]利用采集到的用戶歷史訪問行為預(yù)測和推薦其可能感興趣的其他商品;浙江利用中關(guān)村電子產(chǎn)品的成交價(jià)格制作電子指數(shù)來監(jiān)測政府采購中協(xié)議供貨產(chǎn)品的價(jià)格[3];利用阿里巴巴網(wǎng)站原材料的成交情況數(shù)據(jù)可以對區(qū)域經(jīng)濟(jì)做出預(yù)警;抓取淘寶的商品的價(jià)格信息,根據(jù)同類產(chǎn)品成交的平均價(jià)格可以幫助用戶判斷假貨等。目前國內(nèi)已經(jīng)有大量的公司和個(gè)人從事互聯(lián)網(wǎng)數(shù)據(jù)的采集和處理。通過從電子商務(wù)網(wǎng)站采集到的數(shù)據(jù),用戶可以進(jìn)行數(shù)據(jù)分析,對于互聯(lián)網(wǎng)公司來說,這是非常重要的。例如:利用采集到的數(shù)據(jù)作分析,可以對消費(fèi)者進(jìn)行細(xì)分以便進(jìn)行精準(zhǔn)化營銷;利用CRM來管理消費(fèi)者的整個(gè)生命周期,以此提高消費(fèi)者的忠誠度,避免消費(fèi)者的流失;利用電商數(shù)據(jù)的分析來發(fā)現(xiàn)現(xiàn)有經(jīng)營模式的不足,以作改進(jìn),從而讓顧客有更好的購物體驗(yàn);利用消費(fèi)者的購買數(shù)據(jù),挖掘消費(fèi)者的潛在需求,提供銷售,擴(kuò)大影響力等等?傊杉降碾娚虜(shù)據(jù)可以幫助用戶實(shí)現(xiàn)數(shù)據(jù)化運(yùn)營。雖然,已經(jīng)進(jìn)入了大數(shù)據(jù)時(shí)代,但是目前數(shù)據(jù)的流通是比較困難的,數(shù)據(jù)大多掌握在一些大的互聯(lián)網(wǎng)公司手中。因?yàn)閿?shù)據(jù)已經(jīng)變成一種生產(chǎn)資料,已經(jīng)進(jìn)入了數(shù)據(jù)為王的時(shí)代,大量的中小用戶無法拿到自己需求的數(shù)據(jù),這也影響到了互聯(lián)網(wǎng)技術(shù)的進(jìn)一步發(fā)展,因此開發(fā)一種中小用戶能夠方便使用、易于擴(kuò)展、性能優(yōu)異的電子商務(wù)網(wǎng)站信息采集系統(tǒng)就顯得非常重要了。
1 Web信息采集技術(shù)的現(xiàn)狀
Web信息采集一般使用爬蟲技術(shù)來實(shí)現(xiàn),目前常用的爬蟲有三類:分布式爬蟲Apache Nutch和Heritrix;使用Java語言開發(fā)的爬蟲Crawler4j、WebCollector、WebMagic等;非Java語言爬蟲Scrapy[4]、curl、火車頭、MetaSeeker等。Nutch和Heritrix雖然功能強(qiáng)大,但是由于這兩種爬蟲主要是針對搜索引擎的功能而設(shè)計(jì)的,很多功能普通用戶用不上,而且想要針對電商網(wǎng)站交易數(shù)據(jù)進(jìn)行精細(xì)化信息采集比較困難,使用復(fù)雜,應(yīng)用難度大。Crawler4j等爬蟲框架功能比較簡單,用戶需要自行添加許多代碼才能完成實(shí)際的采集。而火車頭和MetaSeeker等軟件使用正則表達(dá)式進(jìn)行信息抽取,可維護(hù)性差,靈活性與可擴(kuò)展性也不好,并且支持集群的商業(yè)版價(jià)格比較高,普通用戶無法承受。
如果爬蟲是用于大規(guī)模的網(wǎng)站信息抽取,那么爬蟲的效率、可擴(kuò)展性和可維護(hù)性等是必須考慮的核心因素。大規(guī)模爬蟲涉及到很多問題:多線程的并發(fā)調(diào)度問題、異步I/O機(jī)制、集群爬取、爬蟲之間的消息通訊、判斷重復(fù)的機(jī)制、核心任務(wù)調(diào)度等,此時(shí)爬蟲開發(fā)使用的語言和所選用的框架就具有重大的意義了。由于PHP語言對多線程和異步I/O的支持不好,所以不建議使用這種語言進(jìn)行開發(fā)。當(dāng)對一些垂直網(wǎng)站進(jìn)行爬取的時(shí)候可以使用Nodejs,但由于Nodejs在分布式爬取、底層的消息通訊等方面的支持較弱,不太適合做大規(guī)模爬蟲的框架。
另一方面,大量電商網(wǎng)站為了保證企業(yè)內(nèi)數(shù)據(jù)閉環(huán),往往采用了反爬取技術(shù),例如使用圖片代替文本來顯示價(jià)格信息等,同時(shí)多采用Ajax技術(shù)來異步傳輸數(shù)據(jù),這就大大增加了電商網(wǎng)站交易信息采集的困難。此外,還有對爬蟲爬取的速率的限制等問題,如果爬取速度過高,就有可能被禁止訪問。為了解決這些問題,必須采用多種技術(shù)手段突破電商網(wǎng)站的種種限制,實(shí)現(xiàn)精細(xì)化信息采集的目的。而隨著電子商務(wù)的迅速發(fā)展,每天海量交易產(chǎn)生的數(shù)據(jù)量也非常驚人,因此,還要求爬蟲使用的框架必須易于擴(kuò)展,信息采集的復(fù)雜度要低。
2 基于Scrapy和casperjs的框架設(shè)計(jì)
系統(tǒng)使用的整體框架如圖1所示。
本文使用基于Scrapy和casperjs的框架設(shè)計(jì)了一個(gè)采集效率高,可擴(kuò)展性強(qiáng),基于云計(jì)算平臺,能夠完全適應(yīng)國內(nèi)電子商務(wù)網(wǎng)站信息采集任務(wù)的爬蟲系統(tǒng),并且已經(jīng)成功用于阿里巴巴、淘寶、京東等國內(nèi)電商網(wǎng)站以及越南、馬來西亞、菲律賓等東南亞國家的電商網(wǎng)站數(shù)據(jù)抓取。
Scrapy是使用Python開發(fā)的一個(gè)速度快、效率高的web和屏幕數(shù)據(jù)抓取的框架,多用于抓取web站點(diǎn)并從結(jié)構(gòu)復(fù)雜的Web頁面中提取出結(jié)構(gòu)化的數(shù)據(jù)。Scrapy的用途非常廣泛,可以用于自動(dòng)化測試、監(jiān)測、數(shù)據(jù)挖掘等任務(wù)。Scrapy 的底層是基于Twisted網(wǎng)絡(luò)引擎,用戶只需要開發(fā)其中的幾個(gè)模塊就可以實(shí)現(xiàn)一個(gè)功能相當(dāng)復(fù)雜的web爬蟲,可以用來進(jìn)行網(wǎng)頁信息抽取和抓取網(wǎng)站上的圖片等。使用Scrapy的優(yōu)勢是開發(fā)相對簡單,信息抽取以后還可以利用Python豐富的第三方庫進(jìn)行后續(xù)數(shù)據(jù)處理和展示。
Scrapy是使用python語言開發(fā)的,python是一種動(dòng)態(tài)語言,為了提高Scrapy 爬蟲的執(zhí)行效率,可以使用Pypy庫進(jìn)行速度優(yōu)化,優(yōu)化以后程序的執(zhí)行時(shí)間縮短為原先的25%-30%,這樣就大大提高了基于Scrapy的網(wǎng)絡(luò)爬蟲的執(zhí)行效率。如果電商網(wǎng)站需要登錄以后才能訪問,可以使用FormRequest實(shí)現(xiàn)用戶登錄或者調(diào)用casperjs實(shí)現(xiàn)后臺自動(dòng)登錄和交互的功能。對于許多需要輸入驗(yàn)證碼才能采集的數(shù)據(jù),可以使用Scrapy豐富的第三方驗(yàn)證碼自動(dòng)識別模塊,可以實(shí)現(xiàn)大多數(shù)電商網(wǎng)站的自動(dòng)登錄。 如果電商網(wǎng)站的頁面內(nèi)容是由JavaScript或者Ajax動(dòng)態(tài)生成的(例如淘寶、天貓),用普通的先請求頁面再進(jìn)行解析的方法就失效了,往往只能解析出當(dāng)前頁面獲取的數(shù)據(jù),后續(xù)數(shù)據(jù)由于Ajax異步加載的原因,會(huì)出現(xiàn)大量的空數(shù)據(jù)。此外,天貓和淘寶的許多商品在同一頁面因?yàn)椴煌目钍教峁┝硕喾N選擇,詳情頁面的價(jià)格顯示是利用JavaScript動(dòng)態(tài)執(zhí)行來顯示的,這些價(jià)格需要通過點(diǎn)擊才能采集到正確的價(jià)格信息,無法通過普通的獲取頁面信息然后通過正則表達(dá)式、CSS選擇器或者利用Xpath的方式獲取到所需要的信息。為了解決這類問題需要借助一個(gè)類似Firefox和谷歌Chrome瀏覽器的JavaScript解析引擎來動(dòng)態(tài)解析頁面上的JavaScript代碼。在這種情況下,我們使用casperjs和phantomjs組合來解決異步數(shù)據(jù)加載和抓取的問題。phantomjs是一個(gè)服務(wù)器端基于 WebKit的JavaScript API。它不需要普通瀏覽器就可以全面支持HTML協(xié)議,而且速度快,原生支持各種標(biāo)準(zhǔn),例如:DOM處理、JSON、CSS選擇器、SVG以及Canvas。在信息采集的時(shí)候可以通過phantomjs來進(jìn)行JavaScript的渲染,這樣就可以采集到淘寶、天貓等采用異步數(shù)據(jù)加載的電商網(wǎng)站的數(shù)據(jù),同時(shí)根據(jù)情況還可以修改配置,使得phantomjs不采集圖片。為了提高采集效率和采集系統(tǒng)安全性,casperjs不能訪問本地存儲(chǔ)和數(shù)據(jù)庫,而是采用http服務(wù)負(fù)責(zé)數(shù)據(jù)中轉(zhuǎn)。Phantomjs自帶的web服務(wù)器性能非常有限,1.x版本只支持10個(gè)連接,遠(yuǎn)遠(yuǎn)滿足不了數(shù)據(jù)采集的需求,因此必須自行實(shí)現(xiàn)一個(gè)http服務(wù)。本文系統(tǒng)所用的http服務(wù),是利用基于python語言的django MVC框架實(shí)現(xiàn)的,開發(fā)簡單,框架復(fù)雜度適中,正好適合作為數(shù)據(jù)中轉(zhuǎn)使用。整個(gè)url的分發(fā)流程如圖2所示。
為了解決這類問題需要借助一個(gè)類似Firefox和谷歌Chrome瀏覽器的JavaScript解析引擎來動(dòng)態(tài)解析頁面上的JavaScript代碼。在這種情況下,我們使用casperjs和phantomjs組合來解決異步數(shù)據(jù)加載和抓取的問題。
由于電商網(wǎng)站數(shù)據(jù)量巨大,為了有效采集信息,我們用redis實(shí)現(xiàn)集群采集,redis中存儲(chǔ)了爬蟲的請求、狀態(tài)和統(tǒng)計(jì)等信息,能夠?qū)Ψ植荚谠破脚_各個(gè)節(jié)點(diǎn)上的爬蟲實(shí)現(xiàn)集中式的管理,而且結(jié)合使用Pypy優(yōu)化Python的執(zhí)行效率,解決了爬蟲的性能瓶頸問題,再加上redis的高效率和易于擴(kuò)展的特點(diǎn)來實(shí)現(xiàn)高效下載。如果redis存儲(chǔ)或者訪問速度過慢的時(shí)候,我們可以增大redis集群的數(shù)量和爬蟲節(jié)點(diǎn)的數(shù)量進(jìn)行改善。對于底層用于存儲(chǔ)的數(shù)據(jù)庫系統(tǒng),我們使用了mongodb集群。
為了解決爬蟲可能被電商網(wǎng)站封禁的問題,我們在系統(tǒng)中設(shè)計(jì)了賬號代理模塊。爬蟲在進(jìn)行分布式抓取的時(shí)候,可以自動(dòng)驗(yàn)證并使用互聯(lián)網(wǎng)上的免費(fèi)代理,避免了單一IP請求量過大帶來的被封的風(fēng)險(xiǎn)。系統(tǒng)還實(shí)現(xiàn)了一個(gè)基于Scrapy的下載中間件,通過不停的變換user-agent來規(guī)避風(fēng)險(xiǎn)。用戶可以有針對性的設(shè)計(jì)和使用反監(jiān)控策略,針對不同的電商網(wǎng)站使用不同規(guī)則。此外還引入了隨機(jī)抓取時(shí)間間隔,模擬用戶瀏覽等仿生策略,最大程度上接近真實(shí)用戶的頁面訪問方式,一方面降低了對目標(biāo)電商網(wǎng)站的服務(wù)器負(fù)載的影響,另一方面也降低了爬蟲被禁用的風(fēng)險(xiǎn)。系統(tǒng)使用了智能訪問速度動(dòng)態(tài)控制技術(shù),跟據(jù)網(wǎng)絡(luò)探針返回的網(wǎng)絡(luò)延遲,分析出Scrapy節(jié)點(diǎn)和被訪問網(wǎng)站的響應(yīng)速度,根據(jù)這個(gè)時(shí)間差來動(dòng)態(tài)改變發(fā)起請求的時(shí)間間隔,以防速度不匹配帶來的數(shù)據(jù)丟失的可能。系統(tǒng)還可配置最大并行請求的個(gè)數(shù),每個(gè)域名的最大并行請求個(gè)數(shù)和系統(tǒng)進(jìn)行并行處理的items的個(gè)數(shù)。系統(tǒng)實(shí)現(xiàn)了一個(gè)針對爬蟲集群的狀態(tài)收集器,并將各個(gè)節(jié)點(diǎn)的實(shí)時(shí)信息,用graphite以動(dòng)態(tài)圖表的形式進(jìn)行實(shí)時(shí)顯示,一旦某個(gè)節(jié)點(diǎn)出現(xiàn)異?梢栽趫D上顯示出來。
3 結(jié)語
本文設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于Scrapy和casperjs的面向電子商務(wù)網(wǎng)站的Web信息采集系統(tǒng),該系統(tǒng)具有可擴(kuò)展性好、易于使用、適用范圍廣等特點(diǎn),通過使用Pypy庫大大增強(qiáng)了Python程序的執(zhí)行效率,同時(shí)redis和mongodb的引入使得爬蟲可以比較容易的部署在云平臺上。本系統(tǒng)在實(shí)際中運(yùn)行表現(xiàn)良好,已實(shí)現(xiàn)了阿里巴巴價(jià)格數(shù)據(jù)、淘寶、京東等國內(nèi)電商網(wǎng)站和東南亞國家電商網(wǎng)站交易數(shù)據(jù)的采集,并且利用這些數(shù)據(jù)建設(shè)了廣西財(cái)經(jīng)數(shù)據(jù)中心的網(wǎng)絡(luò)電商數(shù)據(jù)庫。