郭麗蓉
(山西警察學(xué)院 網(wǎng)絡(luò)安全保衛(wèi)系,山西 太原 030021)
隨著網(wǎng)絡(luò)的普遍應(yīng)用以及移動終端的發(fā)展,人們越來越離不開網(wǎng)絡(luò),據(jù)CNNIC統(tǒng)計,截至2017年12月,中國網(wǎng)民規(guī)模達(dá)到7.72億,其中手機(jī)網(wǎng)民比例高達(dá)97.5%[1],網(wǎng)絡(luò)給人們的工作、生活、學(xué)習(xí)等方式帶來了極大的便利,比如網(wǎng)絡(luò)辦公、出行網(wǎng)約、吃飯外賣、上課MOOC等,大家樂在其中,在使用網(wǎng)絡(luò)的過程中用戶在網(wǎng)絡(luò)中也會產(chǎn)生一系列的數(shù)據(jù),比如,用戶每天的生活軌跡在手機(jī)全天候的打開GPS的情況下,手機(jī)上的某地圖通常會自動根據(jù)用戶的軌跡分析比如用戶大概經(jīng)過多長時間到達(dá)公司等,同時,網(wǎng)絡(luò)也會隨時隨地提供大量的數(shù)據(jù)供用戶使用,用戶一般會使用自己習(xí)慣使用的搜索引擎搜索自己需要的內(nèi)容,但又往往需要從搜索結(jié)果中進(jìn)行仔細(xì)鑒別,因此,如何從海量數(shù)據(jù)中精確搜索到需要的信息,可專門設(shè)計針對某一主題的搜索工具——網(wǎng)絡(luò)爬蟲。大數(shù)據(jù)時代的來臨,使得網(wǎng)絡(luò)爬蟲在網(wǎng)絡(luò)應(yīng)用中的地位越來越重要。
網(wǎng)絡(luò)爬蟲,又稱網(wǎng)絡(luò)蜘蛛,是一種能夠按照預(yù)定的規(guī)則自動獲取網(wǎng)頁內(nèi)容的程序腳本。根據(jù)實現(xiàn)的技術(shù)和結(jié)構(gòu)可以分為通用型、聚焦型、增量式、深層網(wǎng)絡(luò)爬蟲等類型。通過爬蟲能夠為大數(shù)據(jù)分析提供更高質(zhì)量的數(shù)據(jù)源[2]。
Python是一種面向?qū)ο蟮慕忉屝陀嬎銠C(jī)程序設(shè)計語言,其源代碼開放,語法簡潔清晰,可讀性強(qiáng),移植性強(qiáng),目前在機(jī)器學(xué)習(xí)及人工智能等領(lǐng)域應(yīng)用比較多的一門語言。據(jù)統(tǒng)計,目前Python語言已經(jīng)處于最受歡迎的編程語言前三位。國際上排名前100名的高校開設(shè)Python程序設(shè)計課程的比例達(dá)80%,國內(nèi)眾多高校也在構(gòu)建基于Python語言的教學(xué)體系[3]。
此外,Python語言對異常的處理可以讓用戶正確地捕獲到程序代碼所發(fā)生的錯誤,其內(nèi)置的數(shù)據(jù)結(jié)構(gòu)滿足對不同數(shù)據(jù)的處理,豐富的第三方庫為快速創(chuàng)建網(wǎng)絡(luò)程序提供了基礎(chǔ),其程序代碼可以嵌入到許多計算機(jī)語言中還允許加入其它,比如用C或C++編寫的模塊等特性[4]。
本文通過對我院校園網(wǎng)招聘信息進(jìn)行匯總,如果每次都下載網(wǎng)頁或者通過復(fù)制粘貼等方式去實現(xiàn),費(fèi)時費(fèi)力,而開發(fā)一個簡單的爬蟲來實現(xiàn)招聘信息的自動下載,提高了工作效率,具體實施過程如下:
1) 制定爬蟲功能:實現(xiàn)校園網(wǎng)招聘信息的自動下載。
2) 爬蟲實現(xiàn)過程分析:決定開發(fā)爬蟲的工具以及如何實現(xiàn)。
基于Python的諸多優(yōu)點(diǎn),使用Python設(shè)計爬蟲,根據(jù)爬蟲的功能,需要確定網(wǎng)頁初始URL,在招聘信息不止一頁的情況下,分析URL特點(diǎn)得到URL列表,分析每個URL地址中的鏈接并獲取其內(nèi)容,將其以.txt的文件形式保存到本地硬盤。
3) 爬蟲具體實現(xiàn),必要的地方已加注釋說明
Python的特點(diǎn)之一即是擁有豐富而強(qiáng)大的基本庫及第三方庫的支持,根據(jù)該爬蟲的功能需要對網(wǎng)頁進(jìn)行獲取以及解析,并對相關(guān)內(nèi)容以文件的形式進(jìn)行保存,需要的庫有ruquests、lxml以及os庫,故將其導(dǎo)入(代碼如下)。
import requests
from lxml import etree
import os
根據(jù)該爬蟲功能是將校園網(wǎng)的招聘信息自動下載,首要的是對網(wǎng)頁URL進(jìn)行分析,通過對比分析發(fā)現(xiàn),招聘信息共28頁,特征前面均為http://222.31.20.3/department/zjzx/html/list_1685_ 后面加上頁數(shù)即是真正的URL,但是最后一頁的URL卻不是http://222.31.20.3/department/zjzx/html/list_1685_28.html,而是http://222.31.20.3/department/zjzx/html/list_1685.html ,所以需要用條件來進(jìn)行對網(wǎng)頁URL的判斷,通過循環(huán)來實現(xiàn)對每一個頁面的獲取(代碼如下)。
for i in range(28,-1,-1):
if i!=0:
link="http://222.31.20.3/department/zjzx/html/list_1685_"+str(i)+".html"
else:
link="http://222.31.20.3/department/zjzx/html/list_1685.html"
#模擬瀏覽器頭部信息。
headers={"User-Agent":"Mozilla/5.0 (Windows NT 6.1)
#調(diào)用requests庫的get方法獲取網(wǎng)頁內(nèi)容。
r=requests.get(link,headers=headers)
#調(diào)用lxml庫的etree中的HTML對內(nèi)容進(jìn)行解析,使用xpath方法獲取相應(yīng)標(biāo)簽的內(nèi)容,此處關(guān)鍵是識別標(biāo)簽,通過F12檢查器找到標(biāo)簽進(jìn)行識別或者直接右鍵copy xpath均可。
root=etree.HTML(r.content)
job_list=root.xpath("http://div[@class='newslist']/ul/li/h2/a")
for job in job_list:
#識別每條招聘信息的鏈接及標(biāo)題
href=job.xpath("@href")[0]
title=job.xpath("@title")[0]
print(title,href)
#構(gòu)建每一條招聘信息的URL
url="http://222.31.20.3/"+href
#解析每條招聘信息URL
response=requests.get(url,headers=headers)
root1=etree.HTML(response.content)
#分別獲取每條招聘信息的發(fā)布日期、標(biāo)題以及具體招聘要求。
date=root1.xpath("http://div[@class='mess']/span/text()")[0]
title=root1.xpath("http://div[@class='name']/text()")[0]
cont=root1.xpath("http://*[@id='MyContent']/p/text()")
#使用遍歷列表的方法將每條招聘信息保存到對應(yīng)的文件,為了更好的識別每條招聘信息,文件名以日期+標(biāo)題命名,便于統(tǒng)計。
for c in cont:
if os.path.exists("d:/zsjy/"):
pass
else:
os.mkdir('d:/zsjy/')
f=open("d:/zsjy/"+date+title+".txt","a",encoding="utf-8")
f.write(c)
f.close()
以上代碼在編輯中需嚴(yán)格遵循Python的縮進(jìn)規(guī)則,方可正確運(yùn)行。
4) 結(jié)果比較(因數(shù)據(jù)量大,截取部分?jǐn)?shù)據(jù))
圖1為原始網(wǎng)頁信息、圖2爬蟲運(yùn)行過程中輸出網(wǎng)頁信息、圖3為保存結(jié)果、圖4為打開某個招聘文件,通過比較,該爬蟲運(yùn)行正常。
圖1 原始網(wǎng)頁信息界面
本文只是實現(xiàn)了一個簡單的爬蟲,如果遇到爬蟲爬取的數(shù)據(jù)量大,功能性要求更高,速度要求更快的情況下,可以使用Python的框架實現(xiàn),比如使用Scrapy,其提供了basic、crawl、csvfeed、xmlfeed等實現(xiàn)相應(yīng)爬蟲的模板,為開發(fā)者節(jié)省更多的時間和代碼,在時間性能上,可以使用多線程、多進(jìn)程等來提高爬蟲速度,使用代理來反反爬蟲等,來盡可能提高爬蟲的性能。但是在實際開發(fā)使用爬蟲的過程中,一定要注意約束自己的網(wǎng)絡(luò)爬蟲行為,將請求的速度限定在一個合理的范圍之內(nèi),以免因頻繁的對服務(wù)器訪問導(dǎo)致服務(wù)器產(chǎn)生巨大的壓力進(jìn)而封鎖IP以及不必要的法律糾紛。
圖2 爬蟲運(yùn)行過程中解釋器輸出的網(wǎng)頁信息
圖3 保存結(jié)果
圖4 打開某個招聘文件的內(nèi)容
[1] 第41次《中國互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計報告》[Z].中國互聯(lián)網(wǎng)信息中心,2018.03.
[2] 韋瑋. 精通Python網(wǎng)絡(luò)爬蟲[M].北京:機(jī)械工業(yè)出版社,2017.
[3] 趙廣輝.面向新工科的Python程序設(shè)計交叉融合案例教學(xué)[J].計算機(jī)教育,2017(8):27-31.
[4] 劉春茂,裴雨龍. Python程序設(shè)計案例課堂[M].北京:清華大學(xué)出版社,2017.