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