孫艷梅
西安工商學(xué)院 陜西 西安 710200
Python是一種基于Windows、Linux、UNIX、MAC OS等軟件平臺(tái),用于開(kāi)發(fā)計(jì)算機(jī)應(yīng)用軟件的計(jì)算機(jī)編程語(yǔ)言。此種編程語(yǔ)言最早有荷蘭數(shù)學(xué)及計(jì)算機(jī)科學(xué)家Guido van Rossum在20世紀(jì)90年代初設(shè)計(jì)而成,彼時(shí)用于ABC開(kāi)發(fā)語(yǔ)言的替代品。相較于其他已知的編程語(yǔ)言(如C語(yǔ)言、C++等),Python的數(shù)據(jù)結(jié)構(gòu)更加高級(jí)、開(kāi)發(fā)效率更高,且能夠?qū)崿F(xiàn)面向?qū)ο缶幊獭=陙?lái),隨著Python版本的不斷更新,其內(nèi)加入了大量語(yǔ)言功能項(xiàng),故逐漸被用于獨(dú)立及大型項(xiàng)目開(kāi)發(fā)。
C語(yǔ)言、C++、Java等計(jì)算機(jī)開(kāi)發(fā)語(yǔ)言的核心特性在于:編程人員首先需要經(jīng)過(guò)較長(zhǎng)時(shí)期的學(xué)習(xí),對(duì)這些開(kāi)發(fā)語(yǔ)言的構(gòu)成語(yǔ)法、機(jī)械性思維進(jìn)行充分理解,否則便無(wú)法從事開(kāi)發(fā)工作[1]。其中最基礎(chǔ)、最具代表性的情況是(以C語(yǔ)言為例):在C語(yǔ)言開(kāi)發(fā)架構(gòu)下,計(jì)算機(jī)聽(tīng)從“機(jī)械性指令”。此種“機(jī)械性指令”是C語(yǔ)言的設(shè)計(jì)人員首先應(yīng)該強(qiáng)迫自己的思維朝向計(jì)算機(jī)程序思維進(jìn)行轉(zhuǎn)化。如進(jìn)制問(wèn)題。在人類(lèi)社會(huì)中,廣為人知且廣泛應(yīng)用的進(jìn)制即為十進(jìn)制,即“逢十進(jìn)一”。但在C語(yǔ)言最早期的版本,只有二進(jìn)制,即“逢二進(jìn)一”。在計(jì)算機(jī)程序的理解中,真正起到“計(jì)數(shù)”作用的數(shù)字只有“0”和“1”。其他的數(shù)字,從2到9也可以存在,但其存在意義與其他符號(hào)并無(wú)本質(zhì)差異,即在計(jì)算機(jī)程序的認(rèn)知中,除了0和1之外的數(shù)字不能算作數(shù)字。對(duì)很多編程初學(xué)者而言,在思考計(jì)算機(jī)程序理解方氏時(shí),最容易犯的錯(cuò)誤便是“思維混亂錯(cuò)誤”。如上文描述性語(yǔ)句中多次提到了“數(shù)字”,但每一次出現(xiàn)的“數(shù)字”二字在具體的語(yǔ)境中存在不同的意義。如果存在理解困難,則可以按照下列方式進(jìn)行理解,可以有效實(shí)現(xiàn)“思維轉(zhuǎn)彎”。比如漢語(yǔ)成語(yǔ)“指鹿為馬”原本形容秦二世統(tǒng)治時(shí)期,權(quán)臣趙高將一頭鹿?fàn)康綄m城大殿,當(dāng)著文武百官的面說(shuō)“這是一匹馬”。如果按照計(jì)算機(jī)程序的機(jī)械思維與人類(lèi)大腦的智能思維,從“指鹿為馬”的角度進(jìn)行理解,可作如下解讀:在人類(lèi)社會(huì)中,被稱(chēng)之為“鹿”的一種動(dòng)物,放到計(jì)算機(jī)程序控制算法中,則被命名為“馬”。編程人員若要真正理解程序、編制能夠使程序正常運(yùn)轉(zhuǎn)的算法,則必須拋棄人類(lèi)社會(huì)的邏輯,而采用計(jì)算機(jī)的程序邏輯,真正認(rèn)可“鹿”的存在。總體而言,以C語(yǔ)言、C++、Java為代表的編程語(yǔ)言需要一定的基礎(chǔ),否則無(wú)法入門(mén)。
Python的核心特性在于:此種開(kāi)發(fā)語(yǔ)言具有“簡(jiǎn)單主義開(kāi)發(fā)思想”。所謂“簡(jiǎn)單主義開(kāi)發(fā)”,是指Guido van Rossum及后來(lái)的諸多計(jì)算機(jī)程序研發(fā)人員為Python開(kāi)發(fā)語(yǔ)言設(shè)定了諸多開(kāi)發(fā)功能,希望在“人類(lèi)智能思維”以及“計(jì)算機(jī)機(jī)械思維”之間找到一個(gè)微妙的平衡[2]。換言之,應(yīng)用Python,開(kāi)發(fā)人員無(wú)需對(duì)某種功能的實(shí)現(xiàn)原理(即程序編寫(xiě)邏輯、機(jī)械語(yǔ)言的語(yǔ)法構(gòu)成)進(jìn)行充分研討,兒只需要根據(jù)Python供的特定功能,通過(guò)具體的排列組合、模塊構(gòu)建,即可完成軟件框架的搭建,相關(guān)功能便可實(shí)現(xiàn)。以五子棋小游戲開(kāi)發(fā)過(guò)程為例。無(wú)論是在C語(yǔ)言框架下,還是在Python框架下,首先應(yīng)該通過(guò)最基礎(chǔ)的語(yǔ)言程序,完成游戲大框架(游戲規(guī)則)的設(shè)定,需要給出游戲區(qū)域(棋盤(pán))、對(duì)戰(zhàn)雙方(黑白兩種顏色的棋子)。在此基礎(chǔ)上,確定具體的落子規(guī)則以及某一方的獲勝判定標(biāo)準(zhǔn)。如“黑白兩色棋子交替落下,每一次只能落下一子,當(dāng)一方在橫向、縱向、斜向有5個(gè)棋子連續(xù)排布時(shí),則對(duì)應(yīng)顏色棋子方獲勝”。對(duì)于Python語(yǔ)言來(lái)說(shuō),只要明確上述思路,并在語(yǔ)言軟件庫(kù)內(nèi)尋找能夠?qū)崿F(xiàn)上述功能的程序即可;而對(duì)于C語(yǔ)言而言,需通過(guò)if、while等語(yǔ)句、數(shù)組、指針等基礎(chǔ)語(yǔ)言構(gòu)建方法,逐字逐句完成程序控制算法的編寫(xiě)。至此便可以看出,Python與C語(yǔ)言相比,在便捷程度方面更高。但Python開(kāi)發(fā)語(yǔ)言與C語(yǔ)言之間有較大的聯(lián)系——Python的底層便是基于C語(yǔ)言編寫(xiě)而成,很多標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)同樣是用C語(yǔ)言寫(xiě)成,不僅運(yùn)行速度較快,還因?yàn)橛袠O其簡(jiǎn)單的說(shuō)明文檔的存在,令Python上手難度較低。總之,Python具備可擴(kuò)展性、可嵌入性,開(kāi)發(fā)程序難度較低,故獲得了廣泛應(yīng)用。
在Python語(yǔ)言框架下進(jìn)行計(jì)算機(jī)應(yīng)用軟件程序編寫(xiě)時(shí),首先應(yīng)該完成對(duì)應(yīng)文件的建立。此環(huán)節(jié)的意義在于,為后續(xù)需要爬取的文件內(nèi)容選擇作業(yè)打下基礎(chǔ)。此外,還能夠?qū)崿F(xiàn)爬取內(nèi)容的有效傳輸,完成爬取規(guī)則的定衣服與,最終為開(kāi)發(fā)的應(yīng)用軟件建立良好的運(yùn)行環(huán)境。一般而言,在文件建立環(huán)節(jié),首先需要結(jié)合Scrapy-redis建立3個(gè)文件夾(注:Scrapy是Python下比較注定的爬蟲(chóng)框架,是為了爬取網(wǎng)站數(shù)據(jù),提取結(jié)構(gòu)性數(shù)據(jù)而由Python已經(jīng)提前編寫(xiě)好的應(yīng)用框架。在數(shù)據(jù)挖掘、信息處理、存儲(chǔ)歷史數(shù)據(jù)中均由較為廣泛的應(yīng)用。在該功能出現(xiàn)的早期,盡管應(yīng)用Scrapy能夠完成很多當(dāng)程序功能的編寫(xiě),但對(duì)大規(guī)模分布式框架搭建給予的支持相對(duì)不足。因此,研發(fā)人員逐漸對(duì)Scrapy的隊(duì)列進(jìn)行了適當(dāng)?shù)恼{(diào)度,將start_urls中的起始網(wǎng)址自其內(nèi)分離而出,改成redis讀取模式。至此階段,在Python框架下,多個(gè)客戶端能夠同時(shí)圍繞同一個(gè)redis進(jìn)行讀取,最終實(shí)現(xiàn)了分布式爬蟲(chóng)。不僅如此,即使在同一臺(tái)電腦上,同樣可以進(jìn)行多進(jìn)程爬蟲(chóng)運(yùn)行,這在大規(guī)模抓取過(guò)程中能夠起到非常好的效果),名稱(chēng)分別為Pachong.py、poprlines.py、settings.py。這三個(gè)文件夾的作用分別是:其一,Pachong.py是收納軟件端需要進(jìn)行爬取的文件內(nèi)容設(shè)置的應(yīng)用文件;其二,settings.py主要收納進(jìn)行爬起規(guī)則定義的應(yīng)用文件;其三,poprlines.py主要收納通過(guò)管道實(shí)現(xiàn)頁(yè)面爬取信息向數(shù)據(jù)庫(kù)有效傳入的支持文件。
為了使文件建立階段功能健全且保證萬(wàn)無(wú)一失,需要準(zhǔn)備的功能模塊除了scrapy、scrapy-redis、redis之外,還需具備mysqlab模塊。
需要特別注意,一些版本的Python語(yǔ)言開(kāi)發(fā)軟件中,由于redis模塊可能只提供類(lèi)linux環(huán)境安裝支持,無(wú)法在windows操作系統(tǒng)下進(jìn)行軟件開(kāi)發(fā)。如果待開(kāi)發(fā)的目標(biāo)軟件需要使用mysql進(jìn)行數(shù)據(jù)存儲(chǔ),那么針對(duì)Mysql進(jìn)行配置便是不可或缺的環(huán)節(jié),在安裝完成后還需選取幾個(gè)功能進(jìn)行測(cè)試,能夠自由調(diào)度后方可使用。
mysqladb模塊以及redis模塊的安裝。在實(shí)際開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)一個(gè)問(wèn)題,如果缺少mysqladb模塊以及redis模塊,那么受Python無(wú)法直接操作數(shù)據(jù)庫(kù)這一特性的影響,后續(xù)很多功能在實(shí)現(xiàn)過(guò)程中,由于無(wú)法從數(shù)據(jù)庫(kù)中直接調(diào)取函數(shù),開(kāi)發(fā)效率會(huì)大打折扣。完成上述工作之后,對(duì)三個(gè)主要文件夾進(jìn)行梳理,可以清晰發(fā)現(xiàn):里面已經(jīng)存在2個(gè)爬蟲(chóng),一個(gè)是用來(lái)爬所有的url地址,并將其傳遞給redis。而另外一個(gè)則是根據(jù)爬取出來(lái)的地址處理具體的商品信息。具體而言,在settings.py文件中,程序代碼為:BOT_NAME=‘pbdnoXX(注,該詞匯無(wú)實(shí)際意義,可以替換任何信息,根據(jù)開(kāi)發(fā)的內(nèi)容而定。在上述基礎(chǔ)上,跟Scrapy一樣,需寫(xiě)明spider的位置,且2個(gè)處理數(shù)據(jù)的pipeline中的類(lèi),數(shù)字越小優(yōu)先執(zhí)行。值得注意的是,因?yàn)閿?shù)據(jù)要存放在mysql中,所以需要配置下mysql的信息。而redis是默認(rèn)采用本地的,所以并沒(méi)有配置信息,如果是連接別的主機(jī)的話,需要配置下redis的鏈接地址[3]。
2.2.1 軟件抓取。按照上文所述內(nèi)容完成基本文件(夾)的建立并檢測(cè)無(wú)誤之后,需基于Python語(yǔ)言進(jìn)行軟件爬取和應(yīng)用作業(yè)。其中,首先需要進(jìn)行軟件抓取作業(yè)。一般而言,該環(huán)節(jié)的實(shí)施需要建立在爬蟲(chóng)程序已經(jīng)成功建立、目標(biāo)搜索數(shù)據(jù)有關(guān)的URL能夠自動(dòng)篩選的基礎(chǔ)上。之后,方可將自動(dòng)篩選的URL資源在等待隊(duì)列中予以存放。完成上述操作之后,研發(fā)人員需要對(duì)等待隊(duì)列進(jìn)行重點(diǎn)關(guān)注,完成對(duì)處于等待狀態(tài)的URL資源進(jìn)行抓取后,立刻對(duì)其域名進(jìn)行解讀,務(wù)必獲得對(duì)應(yīng)計(jì)算機(jī)的IP地址。上述操作全部完成后,便需將已經(jīng)解讀出的IP地址等信息下載到軟件開(kāi)發(fā)端計(jì)算機(jī)上,且務(wù)必存儲(chǔ)到本地軟件庫(kù)中。
在上述軟件抓取全過(guò)程內(nèi),必須注意下列幾個(gè)要素:其一,爬蟲(chóng)程序自動(dòng)篩選以及與目標(biāo)搜索數(shù)據(jù)有關(guān)的URL必須放入已經(jīng)被抓取的URL隊(duì)列之中。其二,還應(yīng)利用爬蟲(chóng)程序,重點(diǎn)針對(duì)這些程序在本地存儲(chǔ)并且已經(jīng)完成訪問(wèn)的URL隊(duì)列信息(包含URL域名)進(jìn)行解析。其他剩余的URL應(yīng)該統(tǒng)一完成選取,最終同樣放到等待抓取的URL隊(duì)列之中。重復(fù)循環(huán)上述操作,最終完成對(duì)整個(gè)軟件的抓取。
2.2.2 數(shù)據(jù)信息的存儲(chǔ)與預(yù)處理。應(yīng)用Python進(jìn)行程序開(kāi)發(fā)時(shí),基于搜索引擎進(jìn)行軟件URL抓取時(shí),還應(yīng)該進(jìn)行對(duì)應(yīng)的分析。但需要明確的一個(gè)觀點(diǎn)是:圍繞分析過(guò)程中的數(shù)據(jù)進(jìn)行收集、存儲(chǔ),考慮到本地存儲(chǔ)空間可能會(huì)進(jìn)行一定的限制,故很可能導(dǎo)致會(huì)重復(fù)檢測(cè)一些內(nèi)容。這個(gè)過(guò)程具有“雙刃劍”屬性。良好的一面為,對(duì)用戶而言,一些無(wú)用的數(shù)據(jù)在收集分析的過(guò)程中,會(huì)被刪除;另一些重要的數(shù)據(jù)可能會(huì)被多次分析,并不能被系統(tǒng)“記住”。基于這一實(shí)際情況,進(jìn)行軟件應(yīng)用設(shè)計(jì)時(shí),需要在數(shù)據(jù)爬取階段同時(shí)開(kāi)展篩選工作。比如一些基本功能性語(yǔ)句,或是一些通過(guò)大批量復(fù)制粘貼語(yǔ)句而形成的軟件,可通過(guò)設(shè)置篩選條件的方式,將之直接排除在爬取數(shù)據(jù)以及常規(guī)文件之外。以此為基礎(chǔ),在后續(xù)進(jìn)行篩選時(shí),這些“垃圾”軟件便會(huì)被及時(shí)識(shí)別,占用的本地存儲(chǔ)空間會(huì)下降,可以保證數(shù)據(jù)分析以及爬取作業(yè)始終處于高效率的狀態(tài)。Python語(yǔ)言開(kāi)發(fā)過(guò)程中,預(yù)處理一般是指對(duì)頁(yè)面中的文字信息中的有效部分進(jìn)行提取,并完成對(duì)無(wú)意義文字信息的篩選。在此基礎(chǔ)上,進(jìn)行界面索引、分析處理時(shí)的系統(tǒng)效率會(huì)大幅度增加[4]。
綜上所述,Python開(kāi)發(fā)語(yǔ)言的實(shí)際應(yīng)用過(guò)程中,由于系統(tǒng)編程功能模塊已經(jīng)提供了API接口,故可對(duì)程序編制全過(guò)程進(jìn)行整體維護(hù)和隨時(shí)管理。在Linux操作系統(tǒng)框架下,Python語(yǔ)言是諸多系統(tǒng)管理員最理想的編程工具。相較于C語(yǔ)言、C++等常規(guī)的開(kāi)發(fā)語(yǔ)言,盡管Python具備很多優(yōu)勢(shì),但由于采用“縮進(jìn)”對(duì)語(yǔ)句關(guān)系進(jìn)行區(qū)分,故會(huì)對(duì)很多初學(xué)者造成困擾。因此,現(xiàn)階段,開(kāi)發(fā)人員仍需要對(duì)Python的原理進(jìn)行充分了解,方可編制出令人滿意的程序算法。