劉子元
摘 要在互聯(lián)網(wǎng)日益發(fā)展的今天,計(jì)算機(jī)應(yīng)用成為生活中不可或缺的一部分。本文所介紹的網(wǎng)絡(luò)爬蟲程序,是從一個(gè)龐大的網(wǎng)站中,將符合預(yù)設(shè)條件的對(duì)象“捕獲”并保存的一種程序。如果將龐大的互聯(lián)網(wǎng)比作一張蜘蛛網(wǎng),爬蟲程序就像網(wǎng)上游弋的蜘蛛,將網(wǎng)上一個(gè)個(gè)“獵物”摘取下來(lái)。
【關(guān)鍵詞】高考作文 Python 爬蟲 互聯(lián)網(wǎng)
1 概述
平時(shí)所說(shuō)的爬蟲,就是網(wǎng)絡(luò)爬蟲,大家可以理解為在互聯(lián)網(wǎng)網(wǎng)頁(yè)上爬行的一只蜘蛛。可以把互聯(lián)網(wǎng)比作一張大網(wǎng),爬蟲就是在這張網(wǎng)上爬來(lái)爬去的蜘蛛,如果遇到需要的有價(jià)值的資源,它就會(huì)爬取下來(lái)。想抓取什么,就可以用代碼控制抓取你想要的內(nèi)容,不需要的那部分可以忽略不計(jì)。
當(dāng)然網(wǎng)絡(luò)爬蟲并不是所有的網(wǎng)頁(yè)都可以抓取,因?yàn)橛行┚W(wǎng)頁(yè)安全性極高,一般無(wú)法獲取到他們的頁(yè)面信息,抓取的資源(數(shù)據(jù))也不是想怎么處理就怎么處理的,而是要在合法的范圍內(nèi)對(duì)數(shù)據(jù)進(jìn)行一定的處理,如果對(duì)這些數(shù)據(jù)隨意的散播或者用于不正當(dāng)交易,是要負(fù)法律責(zé)任的。當(dāng)然,一些保密的數(shù)據(jù)也會(huì)做好安全措施,不能輕易的被爬取。
網(wǎng)絡(luò)爬蟲,最近幾年被廣泛用于互聯(lián)網(wǎng)搜索引擎和其他類似的網(wǎng)站,通過(guò)代碼可以讓程序自動(dòng)采集所有能夠訪問(wèn)到的頁(yè)面內(nèi)容,最終獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式。從功能上來(lái)講,爬蟲一般分為三部分,包含數(shù)據(jù)的采集、數(shù)據(jù)的處理和存儲(chǔ)。前幾年的網(wǎng)絡(luò)爬蟲是從一個(gè)或者多個(gè)初始網(wǎng)頁(yè)的URL地址開始,得到最原始網(wǎng)頁(yè)上的URL,并且在抓取網(wǎng)頁(yè)的過(guò)程中,不間斷的從當(dāng)前網(wǎng)頁(yè)上獲取新的URL放入隊(duì)列,達(dá)到系統(tǒng)要求的停止條件才會(huì)終止。
2 實(shí)驗(yàn)?zāi)康?/p>
對(duì)于高三的學(xué)生來(lái)說(shuō)時(shí)間就是金錢,在緊張的高三生活中,如何快速獲取有參考價(jià)值的信息就顯得比較重要,歷年的真題基本上都是高三學(xué)生必練的。而語(yǔ)文科目在高考中占據(jù)很大比例,語(yǔ)文中的作文又是重中之重,因?yàn)檎Z(yǔ)文中的作文成績(jī)?cè)谡麄€(gè)語(yǔ)文成績(jī)中起著舉足輕重的作用,大家都知道想寫好作文就要多閱讀,但是那么多文章,怎么在短時(shí)間內(nèi)去選取有用的作文呢?近幾年全國(guó)各省份的高考滿分作文是大家都要參考和閱讀的,這些作文以及題目收集起來(lái)比較麻煩。所以,本次試驗(yàn)是運(yùn)用網(wǎng)絡(luò)爬蟲技術(shù),從某網(wǎng)站幫助學(xué)子們快速便捷地抓取最近兩年全國(guó)各地的高考滿分作文,以供日后的參考學(xué)習(xí)。
3 實(shí)驗(yàn)過(guò)程
3.1 實(shí)驗(yàn)環(huán)境
Windows10 64位操作系統(tǒng),Python2+ requests+BS4,所用工具PyCharm。
3.2 技術(shù)分析
3.2.1 如何瀏覽網(wǎng)頁(yè)
網(wǎng)頁(yè)是由什么組成的?一般現(xiàn)在我們看到的網(wǎng)頁(yè)都是Html+CSS組成的,Html是一種超文本標(biāo)記語(yǔ)言,CSS簡(jiǎn)單的說(shuō)就是樣式,只有Html,寫出的網(wǎng)頁(yè)基本上是黑白的,沒(méi)有好看的樣式,所以我們常常看到的五顏六色的顏色就是CSS起的作用,既然是語(yǔ)言,那它就會(huì)具備語(yǔ)言獨(dú)有的特點(diǎn),正是因?yàn)樗凶约旱奶攸c(diǎn),我們才能分析特點(diǎn)然后進(jìn)行頁(yè)面的抓取。我們?cè)L問(wèn)網(wǎng)頁(yè)的過(guò)程,首先會(huì)向服務(wù)器發(fā)送一個(gè)請(qǐng)求,然后經(jīng)過(guò)服務(wù)器的解析,返回給客戶端,用戶就可以看到文字圖片以及一些動(dòng)態(tài)的效果。
因此,用戶通過(guò)瀏覽器看到的網(wǎng)頁(yè)實(shí)質(zhì)是由 HTML代碼寫出來(lái)的,爬蟲爬來(lái)的便是這些內(nèi)容,通過(guò)對(duì)獲取到的HTML源碼的分析和過(guò)濾,實(shí)現(xiàn)對(duì)圖片、文字等資源信息的獲取。本系統(tǒng)是通過(guò)抓取某網(wǎng)站的HTML代碼,并進(jìn)行篩選,最終獲取自己需要的信息。
3.2.2 URL的含義
URL即統(tǒng)一資源定位符,也就是我們經(jīng)常在地址欄輸入的網(wǎng)址,這個(gè)網(wǎng)址就是對(duì)可以從互聯(lián)網(wǎng)上得到的資源的位置和訪問(wèn)方法的簡(jiǎn)潔表示方法,是互聯(lián)網(wǎng)上標(biāo)準(zhǔn)資源的統(tǒng)一地址。互聯(lián)網(wǎng)上的每個(gè)文件都有唯一的URL地址,從它包含的信息可以看出文件的位置以及瀏覽器應(yīng)該怎么處理它。
URL由以下幾部分組成:
(1)第一部分是協(xié)議,比如http、www協(xié)議。
(2)第二部分是服務(wù)器的地址,指出所在服務(wù)器的域名。
(3)第三部分是端口,有的URL并不是,訪問(wèn)一些資源的時(shí)候需要對(duì)應(yīng)的端口號(hào)。
(4)第四部分是路徑,指明服務(wù)器上某資源的位置(其格式與DOS系統(tǒng)中的格式一樣,通常由目錄/子目錄/文件名這樣的結(jié)構(gòu)組成)。與端口一樣,路徑并非是必須的。
爬蟲在爬取數(shù)據(jù)時(shí)需要有一個(gè)目標(biāo)的URL才可以進(jìn)一步獲取數(shù)據(jù),因此,它是操作爬蟲獲取數(shù)據(jù)的基本依據(jù),準(zhǔn)確深入的理解它的含義對(duì)爬蟲的學(xué)習(xí)有很大幫助。
3.2.3 使用的庫(kù)Requests、BS4
負(fù)責(zé)連接網(wǎng)站,處理http協(xié)議。它允許發(fā)送HTTP請(qǐng)求,無(wú)需手工勞動(dòng)。不需要手動(dòng)為URL添加查詢字串,也不需要對(duì)POST數(shù)據(jù)進(jìn)行表單編碼。Keep-alive和HTTP連接池的功能是完全自動(dòng)化的,一切動(dòng)力都來(lái)自于根植在它內(nèi)部的 urllib3。
Bs4負(fù)責(zé)將網(wǎng)頁(yè)數(shù)據(jù)結(jié)構(gòu)化,從而更方便的獲取內(nèi)部數(shù)據(jù),通過(guò)一定的規(guī)則針對(duì)文件內(nèi)容進(jìn)行操作,比如獲取數(shù)據(jù),修改,刪除等。Bs4提供一些簡(jiǎn)單的方法、屬性。它是一個(gè)工具箱,通過(guò)解析文檔為用戶提供需要抓取的數(shù)據(jù),因?yàn)楹?jiǎn)單,所以不需要多少代碼就可以寫出一個(gè)完整的應(yīng)用程序。
Bs4自動(dòng)將輸入文檔轉(zhuǎn)換為Unicode編碼,自動(dòng)格式化為utf-8編碼。用戶不需要考慮編碼方式,如果文檔沒(méi)有指定一個(gè)編碼方式,Bs4會(huì)自動(dòng)猜測(cè)文件內(nèi)容的編碼,當(dāng)然我們推薦自己指定編碼格式,并且也是相當(dāng)簡(jiǎn)單的。
Bs4已成為和lxml一樣出色的python三方包,為用戶靈活地提供不同的解析策略或強(qiáng)勁的速度。
3.2.4 Python語(yǔ)言
在形形色色的計(jì)算機(jī)語(yǔ)言中,C語(yǔ)言、java和Python一直是使用率最高的幾種。根據(jù)國(guó)外某網(wǎng)站調(diào)查,2017年,Python成為當(dāng)前全球使用率最高的計(jì)算機(jī)語(yǔ)言(如圖1所示IEEE發(fā)布2017年編程語(yǔ)言排行榜 )。所以利用該語(yǔ)言進(jìn)行程序編寫是符合當(dāng)前形式的。本系統(tǒng)用python腳本語(yǔ)言開發(fā),該腳本語(yǔ)言與其它編程語(yǔ)言相比的優(yōu)勢(shì)在于它的語(yǔ)法簡(jiǎn)單、系統(tǒng)庫(kù)強(qiáng)大、實(shí)現(xiàn)功能容易、高效率的高層數(shù)據(jù)結(jié)構(gòu)、簡(jiǎn)單的面向?qū)ο缶幊?、代碼結(jié)構(gòu)清晰易懂。如今該語(yǔ)言被廣泛的應(yīng)用于系統(tǒng)后臺(tái)處理和網(wǎng)頁(yè)編程。由于此腳本語(yǔ)言有著這么多的優(yōu)勢(shì),所以筆者通過(guò)該腳本語(yǔ)言實(shí)現(xiàn)了一個(gè)爬蟲、敏感文件掃描和日志分析程序。爬蟲通過(guò)任務(wù)隊(duì)列、線程池實(shí)現(xiàn)多線程并發(fā)爬取網(wǎng)頁(yè),在爬取網(wǎng)頁(yè)之后對(duì)網(wǎng)頁(yè)進(jìn)行解碼分析,獲取目錄結(jié)構(gòu),對(duì)已知的目錄結(jié)構(gòu)進(jìn)行敏感文件掃描。同時(shí)也通過(guò)腳本程序利用攻擊規(guī)則庫(kù)對(duì)用戶請(qǐng)求的web日志進(jìn)行安全分析,提取出日志中的sql注入攻擊。endprint
此語(yǔ)言是所有編程語(yǔ)言中最容易入門的語(yǔ)言,并且其應(yīng)用面非常廣泛,是一種非常有應(yīng)用前景和研究前景的語(yǔ)言。其應(yīng)用領(lǐng)域含括了后臺(tái)開發(fā)、圖像處理、數(shù)據(jù)挖掘、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、網(wǎng)絡(luò)攻擊、SDN、神經(jīng)網(wǎng)絡(luò)、自動(dòng)化運(yùn)維、計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理等。該語(yǔ)言作為一種“膠水語(yǔ)言”可謂無(wú)所不能,甚至能夠開發(fā)安卓應(yīng)用。
3.2.5 程序代碼
以下為本系統(tǒng)部分程序代碼:
coding:utf-8 改行代碼是為了防止程序中的中文出現(xiàn)亂碼;requests和bs4是導(dǎo)入的抓取爬蟲的庫(kù),引入random庫(kù)是為了取到隨機(jī)數(shù),re模塊是為了使用正則表達(dá)式;re.compile(r"http://www.******.com/e/201[76]\d+/\S+.shtml")上面這行代碼用到了正則取到鏈接里面的2016和2017年的數(shù)據(jù),當(dāng)然如果取其他年份的可以寫成[7654]; for link in links:然后利用循環(huán)實(shí)現(xiàn)對(duì)每個(gè)年份鏈接的讀取,這樣就能分別讀取到定義好的年份鏈接,從而取到對(duì)應(yīng)的數(shù)據(jù)。
count += 1if count == 300 print 'craw failed %d %s' % (count, str(e)) 以上代碼可實(shí)現(xiàn)循環(huán)取到所要獲取的作文的數(shù)量,如果獲取到了300篇就中斷,否則就輸入,輸出這里做了一個(gè)格式化的輸入,會(huì)在每一個(gè)作文的前面加上序號(hào),這樣就能直觀的看出來(lái)輸出作文的數(shù)量,當(dāng)然篇數(shù)300這個(gè)值是可以修改的,這里之所以寫300是因?yàn)閺脑摼W(wǎng)站判斷出每年的全國(guó)滿分作文基本沒(méi)有超過(guò)100篇的,這里獲取2年的作文,如果寫的是100,那就只能獲取到100篇。最終寫個(gè)main函數(shù),在該函數(shù)里面就是要調(diào)用寫好的方法,程序最終運(yùn)行的入口就在該函數(shù)里面。
3.3 實(shí)驗(yàn)分析
用戶通過(guò)爬蟲的入口向程序提供需要爬取的目標(biāo),爬取的深度和使用多少個(gè)線程爬取,如果沒(méi)有定義線程數(shù),程序會(huì)初始化為9個(gè)線程爬取。程序?qū)⑴廊〉玫降木W(wǎng)頁(yè)內(nèi)容進(jìn)行解碼分析,提取出里面的URL,并將這些URL做一些處理后加入隊(duì)列進(jìn)行下一步爬取。目標(biāo)爬取完畢之后會(huì)將結(jié)果保存下來(lái),然后再調(diào)用敏感文件掃描模塊對(duì)這些目錄進(jìn)行敏感文件掃描,對(duì)于存在的敏感文件程序會(huì)自動(dòng)將結(jié)果保存下來(lái)。
3.3.1 目標(biāo)網(wǎng)頁(yè)爬取
在目標(biāo)爬取的測(cè)試過(guò)程中,程序在獲得一個(gè)目標(biāo)站點(diǎn)后開始進(jìn)行爬取。首先將這個(gè)目標(biāo)url加入urlQueue隊(duì)列中,在start函數(shù)中從 urlQueue隊(duì)列中獲取第一個(gè)url,隨后調(diào)用線程中addJob函數(shù)將url和工作work函數(shù)同時(shí)加入線程池任務(wù)隊(duì)列中。此時(shí)線程從線程池任務(wù)隊(duì)列中獲取任務(wù),也就是獲取到的url和work函數(shù),隨后線程開始執(zhí)行work函數(shù),work函數(shù)即對(duì)url進(jìn)行爬取,將url加入已爬取的任務(wù)隊(duì)列readUrls中。爬取方法是調(diào)用requests模塊中的get函數(shù)對(duì)目標(biāo)進(jìn)行網(wǎng)頁(yè)抓?。篽tml=requests.get(url),此方法返回一個(gè)html對(duì)象。該對(duì)象中的content屬性為網(wǎng)頁(yè)內(nèi)容:htmldata=html.content。
接下來(lái)是對(duì)返回的網(wǎng)頁(yè)內(nèi)容進(jìn)行解析分析,本程序采用的是python的第三方模塊bs4對(duì)其解析。該模塊是用python寫的一個(gè) HTML/XML解析器,它可以很好的處理不規(guī)范標(biāo)記并生成剖析樹。通常用來(lái)分析爬蟲抓取到的web文檔。對(duì)于不規(guī)則的html文檔,也有很多補(bǔ)全功能,節(jié)省了開發(fā)者的時(shí)間和精力。通過(guò)BS4對(duì)htmldata解析。接著遍歷allurl列表,如果列表中的鏈接沒(méi)有在readUrls中,就將其加入urlQueue隊(duì)列中。如此循環(huán)操作,直到最后達(dá)到爬取的深度停止任務(wù),完成網(wǎng)頁(yè)爬取。
4 結(jié)論
圖2為最終的實(shí)驗(yàn)結(jié)果,爬取到了所需的數(shù)據(jù)。
通過(guò)Python語(yǔ)言編程系統(tǒng),可以迅速地將目標(biāo)網(wǎng)站各網(wǎng)頁(yè)中符合條件的信息抓取并儲(chǔ)存到指定位置。通過(guò)本系統(tǒng),高三學(xué)子能夠快速準(zhǔn)確地收集2016及2017年的高考滿分作文,為以后學(xué)習(xí)成績(jī)的進(jìn)步打下堅(jiān)實(shí)的基礎(chǔ)。
參考文獻(xiàn)
[1]https://www.liaoxuefeng.com.
[2]《用python寫網(wǎng)絡(luò)爬蟲》作者:(澳)Richard Lawson.
[3]http://cn.python-requests.org/zh_CN/latest.
[4]百度百科.
[5]http://www.chinaz.com/news/2017/ 0724/792870.shtml.
[6]《Python網(wǎng)路數(shù)據(jù)采集》作者:(美)Ryan Mitchell.
作者單位
山東淄博實(shí)驗(yàn)中學(xué) 山東省淄博市 255000endprint