崔玉嬌,孫結(jié)冰,祁曉波,凌 強(qiáng),朱 勇
(黑龍江大學(xué) 電子工程學(xué)院,黑龍江 哈爾濱 150080)
隨著互聯(lián)網(wǎng)時(shí)代的高速發(fā)展,大量的數(shù)據(jù)可以通過互聯(lián)網(wǎng)來獲得,可以足不出戶就能獲知世界上的千變?nèi)f化[1]。我們可以在互聯(lián)網(wǎng)上獲取招聘信息,而不再局限于報(bào)紙、雜志等紙質(zhì)媒介,這使得求職者可以快速有效地獲得心儀的招聘信息。每年的9月和4月都是畢業(yè)生找工作的高峰時(shí)期,快速有效地獲得招聘信息成為求職過程中關(guān)鍵一步。為此,本文設(shè)計(jì)了一款基于python的爬蟲程序,目前國內(nèi)比較著名的求職軟件有“智聯(lián)招聘”“前程無憂”“58同城”等,本文主要對“前程無憂”的招聘信息進(jìn)行抓取并分析。現(xiàn)有的數(shù)據(jù)抓取程序抓取方式單一,用戶不能選擇最快的抓取方法,該程序針對此問題進(jìn)行了進(jìn)一步的優(yōu)化,設(shè)計(jì)3種數(shù)據(jù)抓取的方法,用戶可自行選擇,并且可以輸入關(guān)鍵字,匹配招聘信息的地點(diǎn)。設(shè)計(jì)更合理,則用戶使用體驗(yàn)效果會更好[2]。
本文提出的程序通過爬蟲獲取職位信息,包括:工作名稱、標(biāo)題、地點(diǎn)、公司名稱、待遇范圍、工作內(nèi)容、招聘網(wǎng)址以及發(fā)布日期。并將獲得的信息保存在本地,以供后續(xù)的數(shù)據(jù)挖掘及分析。本文的爬蟲程序包含3種爬蟲的方法,包括Re、XPath、BeatuifulSoup,用戶可以自行選擇想要的爬蟲方法,并且輸入職位的關(guān)鍵詞,通過關(guān)鍵詞匹配,獲得相應(yīng)的職位信息。
Python語言語法簡單清晰、功能強(qiáng)大,容易理解。可以在Windows、Linux等操作系統(tǒng)上運(yùn)行;Python是一種面向?qū)ο蟮恼Z言,具有效率高、可簡單地實(shí)現(xiàn)面向?qū)ο蟮木幊痰葍?yōu)點(diǎn)[3-4]。Python是一種腳本語言,語法簡潔且支持動態(tài)輸入,使得Python在很多操作系統(tǒng)平臺上都是一個比較理想的腳本語言,尤其適用于快速的應(yīng)用程序開發(fā)[5]。Python 包括針對網(wǎng)絡(luò)協(xié)議的各個層次進(jìn)行抽象封裝的網(wǎng)絡(luò)協(xié)議標(biāo)準(zhǔn)庫,這使得使用者可以對程序邏輯進(jìn)行進(jìn)一步的優(yōu)化。其次,Python 非常擅長處理字節(jié)流的各種模式,具有很快的開發(fā)速度[6-7]。
網(wǎng)絡(luò)爬蟲[8](Web Crawler),是一種按照一定的規(guī)則,自動提取Web網(wǎng)頁的應(yīng)用程序或者腳本,它是在搜索引擎上完成數(shù)據(jù)抓取的關(guān)鍵一步,可以在Internet上下載網(wǎng)站頁面。爬蟲是為了將Internet上的網(wǎng)頁保存到本地,以供參考[9-10]。爬蟲是從一個或多個初始頁面的URL,通過分析頁面源文件的URL,抓取新的網(wǎng)頁鏈接,通過這些網(wǎng)頁鏈接,再繼續(xù)尋找新的網(wǎng)頁鏈接[11],反復(fù)循環(huán),直到抓取和分析所有頁面。當(dāng)然這是理想情況下的執(zhí)行情況,根據(jù)現(xiàn)在公布的數(shù)據(jù),最好的搜索引擎也只爬取整個互聯(lián)網(wǎng)不到一半的網(wǎng)頁[12]。
本文的爬蟲程序主要分為5個模塊,首先根據(jù)Request URL獲取需要爬取數(shù)據(jù)的頁面,通過Re、XPath、BeautifulSoup三種方法,利用關(guān)鍵詞篩選符合條件的職位信息,其中包括工作名稱、標(biāo)題、地點(diǎn)、公司名稱、待遇范圍、工作內(nèi)容、招聘網(wǎng)址以及發(fā)布日期,并保存在本地,以便后續(xù)的數(shù)據(jù)挖掘及分析。
爬取網(wǎng)頁信息之前需要獲取網(wǎng)頁的信息,并從中找出需要的信息進(jìn)行抓取。首先打開Chrome瀏覽器,進(jìn)入前程無憂的網(wǎng)頁,打開開發(fā)者選項(xiàng),找到其中的network,獲取URL以及請求頭中的headers[13]。在preview中可以看到當(dāng)前網(wǎng)頁的源代碼,可以從源代碼中找到需要爬取的信息,即工作名稱、標(biāo)題、地點(diǎn)、公司名稱、待遇范圍、工作內(nèi)容、招聘網(wǎng)址以及發(fā)布日期,并找出當(dāng)前頁與下一頁的offset值,以便在以下的爬蟲設(shè)計(jì)中使用。
將BeautifulSoup、XPath、Regex三種方法的文件名打包成字典,并標(biāo)上序號,設(shè)計(jì)進(jìn)入程序的頁面,在頁面上顯示提示信息,請用戶選擇一種爬蟲方法,根據(jù)用戶的選擇,進(jìn)入對應(yīng)的程序,待用戶輸入需要查詢的職位關(guān)鍵詞之后啟動爬蟲程序,開始抓取數(shù)據(jù)[14]。在抓取完畢之后,提示用戶數(shù)據(jù)抓取完畢,以保存至本地文件,以供用戶的使用及分析。
正則表達(dá)式(Re)是對字符串(包括普通字符(例如,a~z 之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符及這些特定字符的組合,組成一個“規(guī)則字符串”[15],這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。正則表達(dá)式是一種文本模式,模式描述在搜索文本時(shí)要匹配的一個或多個字符串。
根據(jù)上文獲取的網(wǎng)頁信息,可以將所需信息的字符串用Re表示出來,其中:
‘.*?/.*?(d+)’ #獲取當(dāng)前頁數(shù)
‘.*? ‘'.*? ‘.*? ‘ ’#獲取工作地點(diǎn) ‘’#獲取工資 ‘’#獲取工作發(fā)布的日期 ‘ 通過獲取的日期,用戶可以了解最新的職位信息。根據(jù)職位的詳細(xì)信息,求職者可以快速地了解到公司的要求以及職位的相關(guān)工作信息。通過上述的正則表達(dá)式獲取的信息,存入本地的Excel文件,方便求職者查看。 XPath即為XML路徑語言,它是一種用來確定XML(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)文檔中某部分位置的語言[16]。XPath基于XML的樹狀結(jié)構(gòu),有不同類型的節(jié)點(diǎn),包括元素節(jié)點(diǎn)、屬性節(jié)點(diǎn)和文本節(jié)點(diǎn),提供在數(shù)據(jù)結(jié)構(gòu)樹中找尋節(jié)點(diǎn)的能力。起初XPath的提出的初衷是將其作為一個通用的、介于XPointer與XSLT間的語法模型。但是XPath很快地被開發(fā)者采用來當(dāng)作小型查詢語言。 XPath相對于Re簡單一些,Re語言容易出錯,導(dǎo)致無法正確地獲得需要的信息,通常可以在Chrome中添加XPath Helper插件,可以在查看網(wǎng)頁源代碼是直接復(fù)制成XPath的格式,方便且通常不容易出錯。 在XPath程序中,其中: ‘div[@class="rt"]/span[@class="dw_c_orange"]’#獲取當(dāng)前頁數(shù) ‘∥div[@id='resultList']/div[@class='el']’#獲取工作列表 ‘./p[@class='t1 ']/span/a’#獲取工作名稱 ‘./p[@class='t1 ']/span/a/attribute::href’#獲取職位鏈接 ‘./span[@class='t2']/a/text()’#獲取公司名稱 ‘./span[@class='t3']/text()’#獲取工作地點(diǎn) ‘./span[@class='t4']/text()’#獲取工資 ‘./span[@class='t5']/text()’#獲取職位發(fā)布的日期 ‘∥div[@class='bmsg job_msg inbox']/text()’ #獲取職位詳細(xì)信息 通過XPath和Re的代碼對比,可以明顯發(fā)現(xiàn),XPath的代碼比Re的代碼要簡潔。 BeautifulSoup提供一些簡單的、python式的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能[16]。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數(shù)據(jù),因?yàn)楹唵危圆恍枰嗌俅a就可以寫出一個完整的應(yīng)用程序。BeautifulSoup自動將輸入文檔轉(zhuǎn)換為Unicode編碼,輸出文檔轉(zhuǎn)換為utf-8編碼。不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時(shí),BeautifulSoup就不能自動識別編碼方式了。然后,僅僅需要說明一下原始編碼方式就可以了。 2.5.1 解析庫 本文介紹幾種python解析庫,并作比較,如表1所示,本文所用到的解析器是python標(biāo)準(zhǔn)解析器。 表1 解析庫 解析器使用方法優(yōu)勢劣勢Python標(biāo)準(zhǔn)解析器BeautifulSoup(makeup,″html.parser″)Python的內(nèi)置標(biāo)準(zhǔn)庫、執(zhí)行速度適中、文檔容錯能力強(qiáng)Python2.7.3或3.2.2前的版本中文容錯能力差lxml HTML解析器BeautifulSoup(makeup,″lxml″)速度快、文檔容錯能力強(qiáng)需要安裝C語言庫lxml XML解析器BeautifulSoup(makeup,″XML″)速度快、唯一支持XML的解析器需要安裝C語言庫html5libBeautifulSoup(makeup,″html5lib″)最好的容錯性、以瀏覽器的方式解析文檔、生成HTML5格式的文檔速度慢、不依賴外部擴(kuò)展 2.5.2 標(biāo)簽選擇器 標(biāo)簽選擇器可以選擇元素,獲取名稱、屬性、內(nèi)容,可進(jìn)行嵌套的選擇,能夠獲取子節(jié)點(diǎn)、子孫節(jié)點(diǎn)、父節(jié)點(diǎn)、祖先節(jié)點(diǎn)等。標(biāo)簽選擇器可分為標(biāo)準(zhǔn)選擇器和CSS選擇器,標(biāo)簽選擇器可以根據(jù)標(biāo)簽名、屬性、內(nèi)容查找文檔,有兩個常用的函數(shù),其中,find_all(name,attrs,recursive,text,**kwargs)用來返回所有符合條件的元素;find(name,attrs,recursive,text,**kwargs)用來返回第一個符合條件的元素。CSS選擇器通過select()直接傳入CSS選擇器即可完成元素的選擇。 在本文設(shè)計(jì)的程序中,選擇了CSS選擇器,使用select()函數(shù)完成數(shù)據(jù)的選擇,其中:‘int(str(soup.select('div.rt span.dw_c_orange')[0].nextSibling))’#獲取當(dāng)前頁數(shù) ‘div.dw_table > div.el’ #獲取工作列表; ‘.p.t1 span a’ #獲取工作名稱; ‘p.t1 span a’ #獲取職位鏈接; ‘span.t2 a’ #獲取公司名稱; ‘span.t3’ #獲取工作地點(diǎn); ‘span.t4’ #獲取工資; ‘.span.t5’ #獲取職位發(fā)布的日期; ‘div.job_msg’ #獲取職位詳細(xì)信息 利用本文設(shè)計(jì)的爬蟲程序,進(jìn)行了如下實(shí)驗(yàn):首先進(jìn)入主程序,點(diǎn)擊運(yùn)行程序,程序返回如圖1的界面。 接著,如圖2所示,輸入數(shù)字“2”選擇BeautifulSoup解析方式,并輸入關(guān)鍵詞python啟動爬蟲,程序正常運(yùn)行。 圖2 選擇解析方式并輸入關(guān)鍵詞 程序運(yùn)行完畢后,在本地文件夾中可以找到以“python職位”命名的Excel文件,打開文件可看到如圖3所示的信息。 圖3 保存到本地的文件 本文根據(jù)Python語言簡潔易讀的特性設(shè)計(jì)了3種方法的爬蟲程序,用戶可以自行選擇數(shù)據(jù)解析的方法,并輸入需要查詢的關(guān)鍵詞,即可從龐大的職位數(shù)據(jù)中提取出需要的數(shù)據(jù),方便快捷。本程序通過職位的關(guān)鍵詞、工作地點(diǎn)等信息的匹配,在一定程度上為使用者提供了便利。提取出的詳細(xì)的職業(yè)信息描述,可進(jìn)行進(jìn)一步的分詞,并統(tǒng)計(jì)詞頻,觀察單詞出現(xiàn)的頻率,可更加快速地了解公司及相應(yīng)職位的要求,找到符合求職者的招聘信息。 [1] 房瑾堂.基于網(wǎng)絡(luò)爬蟲的在線教育平臺設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2016. [2] 王碧瑤.基于Python的網(wǎng)絡(luò)爬蟲技術(shù)研究[J].數(shù)字技術(shù)與應(yīng)用,2017(5):76-76. [3] 周中華,張惠然,謝江.基于Python的新浪微博數(shù)據(jù)爬蟲[J].計(jì)算機(jī)應(yīng)用,2014,34(11):3131-3134. [4] 涂小琴.基于Python爬蟲的電影評論情感傾向性分析[J].現(xiàn)代計(jì)算機(jī),2017(35):52-55. [5] 郭麗蓉.基于Python的網(wǎng)絡(luò)爬蟲程序設(shè)計(jì)[J].電子技術(shù)與軟件工程,2017(23):248-249. [6] Lutz M.Learning Python[M].北 京:機(jī)械工業(yè)出版社,2009. [7] 劉志凱,張?zhí)t,劉磊.基于Web的Python3編程環(huán)境[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2015,24(7):236-239. [8] 王大偉.基于 Python的Web API自動化測試方法研究[J].電子科學(xué)技術(shù),2015,2(5):573-581. [9] Hetland M L.Python基礎(chǔ)教程[M].北京:人民郵電出版社,2014:243-245. [10] 涂輝,王鋒,商慶偉.Python3編程實(shí)現(xiàn)網(wǎng)絡(luò)圖片爬蟲[J].電腦編程技巧與維護(hù),2017(23):21-22. [11] 高森.Python網(wǎng)絡(luò)編程基礎(chǔ)[M].北京:電子工業(yè)出版社,2007. [12] 周立柱,林玲.聚焦爬蟲技術(shù)研究綜述[J].計(jì)算機(jī)應(yīng)用,2005,25(9):1965-1969. [13] 姜杉彪,黃凱林,盧昱江,等.基于Python的專業(yè)網(wǎng)絡(luò)爬蟲的設(shè)計(jì)與實(shí)現(xiàn)[J].企業(yè)科技與發(fā)展,2016(8):17-19. [14] 陳琳,任芳.基于Python的新浪微博數(shù)據(jù)爬蟲程序設(shè)計(jì)[J].信息系統(tǒng)工程,2016(9):97-99. [15] 劉娜.Python 正則表達(dá)式高級特性研究[J].電腦編程技巧與維護(hù),2015(22):12-13. [16] 齊鵬,李隱峰,宋玉偉.基于Python的Web數(shù)據(jù)采集技術(shù)[J].電子科技,2012,25(11):118-120.2.4 XPath程序設(shè)計(jì)
2.5 BeautifulSoup程序設(shè)計(jì)

3 實(shí)驗(yàn)結(jié)果


4 結(jié)束語