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