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