


摘? 要:隨著科學技術的發展,網絡資源對人們的生活產生巨大的影響,為了進一步簡化查找和精準定位網絡資源,網絡爬蟲技術日漸興起。由于Python語言的強兼容性,基于Python的網絡爬蟲技術成為了一種主流爬蟲技術。針對學生求職的需求,文章采用基于Python的網絡爬蟲技術,設計拉勾網的崗位信息爬取程序,實現了對崗位信息的保存,為后續的查看使用提供便利。
關鍵詞:Python;網絡爬蟲;數據解析
中圖分類號:TP311? ? 文獻標識碼:A? 文章編號:2096-4706(2023)06-0085-04
Design and Implementation of Web Crawler for Lagou APP Based on Python
FENG Xiaolei
(Wuhan University of Communication, Wuhan? 430205, China)
Abstract: With the development of science and technology, network resources have a huge impact on people's lives. In order to further simplify the search and accurately locate the network resources, Web crawler technology is rising day by day. Due to the strong compatibility of Python language, Web crawler technology based on Python has become a mainstream crawler technology. In response to the needs of seeking jobs of students, this paper adopts the Web crawler technology based on Python to design the job information crawling program of Lagou APP, which realizes the saving of job information and provides convenience for the subsequent viewing and using.
Keywords: Python; Web crawler; data parsing
0? 引? 言
近年來,Python語言作為一種新的流行語言,由于其強大的功能模塊和平臺兼容性,尤其在網絡爬蟲中的應用越來越普遍。隨著互聯網的飛速發展,給日常生活帶來了較多的便利,也形成了依賴的慣性。但是目前網絡資源質量參差不齊,數量巨大,往往存在資源查找難,數據獲取難得情況,例如,目前應用較廣得求職和招人的網站拉勾網,為了解決這一難題,本文利用Python語言設計拉勾網的網絡爬蟲,便于進一步的數據整合提供規范有效的數據源。
大數據時代已經到來,網絡爬蟲技術已成為這個時代不可或缺的一項技術,企業需要數據來分析用戶行為、產品的不足之處以及競爭對手的信息等,而這一切的首要條件就是數據的采集。在互聯網社會中,數據是無價之寶,一切皆為數據,誰擁有了大量有用的數據,誰就擁有了決策的主動權。如何有效地采集并利用這些信息成了一個巨大的挑戰,而網絡爬蟲是自動采集數據的有效手段。網絡爬蟲是一種按照一定的規則,自動抓取互聯網海量信息的程序或腳本。網絡爬蟲的應用領域很廣泛,如搜索引擎、數據采集、廣告過濾、大數據分析等。
1? 相關概念
1.1? Python
根據IEEE Spectrum 2021最新的研究報告顯示依然是世界上最受歡迎的語言。Python社區提供了豐富的第三方模塊,它們的使用方式與標準庫類似,相對簡單,容易使用和學習。它們的功能同樣豐富多樣,資料全面,覆蓋數據分析,深度學習,金融分析等多個領域,并且已形成穩定的使用機制。Python有著非廣泛的應用,幾乎所有大中型互聯網公司都在使用Python,例如國外的Google、Youtube、Dropbox,國內的百度、新浪、搜狐、騰訊、阿里、網易、淘寶、知乎、豆瓣、汽車之家、美團,等等。Python 語言很早就用來編寫網絡爬蟲。Google等搜索引擎公司大量地使用Python語言編寫網絡爬蟲。從技術層面上將,Python 提供有很多服務于編寫網絡爬蟲的工具,例如urllib、Selenium 和 BeautifulSoup等,還提供了一個網絡爬蟲框架Scrapy。
1.2? 網絡爬蟲
隨著大數據時代的到來,網絡爬蟲在互聯網中的地位越來越重要。網絡爬蟲技術針對互聯網中的海量數據,如何自動高效地獲取互聯網中我們感興趣的信息進行程序設計。網絡爬蟲,又稱為網頁蜘蛛、網絡機器人,是一種按照一定的規則,自動請求萬維網網站并提取網絡數據的程序或腳本。目前的互聯網已經邁入大數據時代,通過對海量的數據進行分析,能夠產生極大的商業價值,因此網絡爬蟲技術興起。網絡爬蟲通過源碼獲取、數據解析、數據保存等步驟,實現對互聯網數據的提取。通過網絡爬蟲對數據信息進行自動獲取采集,比如應用于搜索引擎中對站點進行爬取收錄,應用于數據分析與挖掘中對數據進行采集,應用于金融分析中對金融數據進行采集,除此之外,還可以將網絡爬蟲應用于輿情監測與分析、目標客戶數據的收集等各個領域。
網絡爬蟲的工作原理為:首先根據業務需求選出待爬取的目標網頁,將這些網頁的URL地址作為種子URL,通過DNS服務器將URL地址轉換為對應網站服務器的IP地址;然后將種子URL放入待抓取的URL隊列中,爬蟲程序從待抓取的URL隊列中逐個順次讀取URL地址;網頁下載器通過網站服務器對網頁進行下載,獲取URL地址對應的頁面源碼,下載到的網頁為網頁文檔形式;根據爬取規則對網頁文檔中的URL進行抽取,將獲取到URL存入爬取隊列中;將獲取到的源碼進行數據解析,獲取需要的信息;對未進行抓取的URL繼續循環抓取,直至待抓取URL隊列為空。
2? 拉勾網爬蟲程序設計思路
本文設計需求主要針對畢業生應聘工作,充分利用基于Python的網路爬蟲相關技術,對所需網頁數據進行獲取,以便后期分析和查找。本次網絡爬蟲程序設計思路包括:確定目標網址、請求網站源碼、解析崗位信息、保存崗位信息,其中程序功能流程圖如圖1所示。
在圖1中,首先爬取的目標網頁為“https://www.lagou.com/wn/zhaopin”,其次崗位信息為公司名稱、崗位名稱,最后保存崗位信息為json格式文件。
3? 功能模塊實現
基于拉勾網爬蟲程序設計思路,程序功能模塊實現主要包括請求網址源碼、解析崗位信息、保存崗位信息,詳細實現方式如下。
3.1? 請求網址源碼
URL是互聯網上標準資源的地址,它包含了文件的位置以及瀏覽器處理方式等信息,URL地址由協議頭、服務器地址、文件路徑三部分組成,請求網址源碼首先通過瀏覽器自帶的源碼檢查工具,查看頁面request的信息和源碼,然后編寫Python腳本進行頁面網址請求。其中通過瀏覽器自帶的檢查工具獲取的信息為:Request Method: GET;User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36;Request URL:https://www.lagou.com/wn/zhaopin。獲取網頁請求的相關信息,除了可以使用瀏覽器自帶的檢查工具,也可以使用Fiddler插件工具,進行網頁發起請求的相關信息進行捕獲。
基于以上檢查網頁,獲取的請求網頁的相關信息,利用Python自帶的urllib庫的request方法進行網頁的url請求,其中url為“https://www.lagou.com/wn/zhaopin”,urllib庫是Python內置的HTTP請求庫,它可以看作是處理URL的組件集合。將獲取的響應response信息進行讀取和編碼轉換,形成html信息,將其記錄在程序根目錄下的lagou.html文件中,對獲取的源碼進行保存,其中相關代碼如下所示:
url = "https://www.lagou.com/wn/zhaopin"
response = urllib.request.urlopen(url)
html = response.read().decode('utf-8')
with open('./lagou.html', 'w', encoding='utf-8') as f:)
f.write(html)
上述源碼中,調用的是urllib.request模塊中的urlopen方法,它傳入了一個百度首頁的URL,使用的協議是HTTP,這是urlopen方法最簡單的用法。urlopen方法可以接收多個參數,定義格式如下:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None),其中,url -- 表示目標資源在網站中的位置;data -- 用來指明向服務器發送請求的額外信息;timeout -- 該參數用于設置超時時間,單位是秒;context -- 實現SSL加密傳輸,該參數很少使用。使用urlopen方法發送HTTP請求后,服務器返回的響應內容封裝在一個HTTPResponse類型的對象中。HTTPResponse類屬于http.client模塊,該類提供了獲取URL、狀態碼、響應內容等一系列方法。
3.2? 解析崗位信息
了解網頁的數據和結構以后,我們可以借助網頁解析器(用于解析網頁的工具)從網頁中解析和提取出有價值的數據,或者是新的URL列表。Python支持一些解析網頁的技術,分別為正則表達式、XPath、Beautiful Soup和JSONPath。本文基于Python的拉勾網網絡爬蟲設計和實現使用XPath方法,XPath即為XML路徑語言,用于確定XML樹結構中某一部分的位置。XPath技術基于XML的樹結構,能夠在樹結構中遍歷節點(元素、屬性等)。XPath使用路徑表達式選取XML文檔中的節點或者節點集,這些路徑表達式代表著從一個節點到另一個或者一組節點的順序,并以“/”字符進行分隔。XPath使用路徑表達式在文檔中進行導航,它從某個節點開始,之后順著文檔樹結構的節點進一步查找。
使用Google Chrome瀏覽器打開目標網址網頁,在崗位信息上面右擊選擇“檢查”,瀏覽器底部打開一個窗口,并顯示選中元素周圍的HTML層次結構,定位之后進行層級結果分析,編寫XPath語句。
3.2.1? XPath解析
利用瀏覽器的XPath插件工具,對網頁頁面的元素進行XPath分析,其中定位到的崗位和公司信息的XPath為“//div[@id="jobList"]/div/div/div/div/div/a”,如圖2所示,頁面中高亮的信息為對應的XPath可以定位的信息。
利用如上的XPath信息進行崗位信息定位解析,首先利用etree中的parse方法,將獲取的lagou.html文件轉化為html文檔,然后對html文檔利用xpath方法,對其進行解析,獲取對應的有效崗位信息,其中源碼如下所示:
html = etree.parse('lagou.html')
result = html.xpath('//div[@id="jobList"]/div/div/div/div/div/a')
以上源碼中,在調用函數時,如果沒有提供解析器,那么就使用默認的解析器,函數會返回一個ElementTree類型的對象。在ElementTree類或Elements類的API文檔中,提供了find()、findall()、iterfind()三個常用的方法,可以滿足大部分搜索和查詢需求,并且這些方法的參數都是XPath語句。
3.2.2? BeautifulSoup解析
除了以上使用XPath方法解析數據,還可以使用BeautifulSoup對數據進行解析,將復雜的HTML文檔轉換成樹結構(HTML DOM),這個結構中的每個節點都是一個Python對象。首先創建Soup對象,根據HTML或者XML文件創建BeautifulSoup對象;然后根據DOM樹進行各種節點的搜索,只要獲得了一個節點,就可以訪問節點的名稱、屬性和文本,在搜索節點的時候,我們也可以按照節點的名稱、節點的屬性或者節點的文字進行搜索。通過分析網頁源碼,可以崗位信息在標簽a下,因此,使用find_all方法獲取a標簽下的信息,進而獲取崗位信息,其中源碼如下所示:
soup = BeautifulSoup(html, 'lxml')
result = soup.find_all('a')
如上源碼中,在創建BeautifulSoup對象時,明確解析器為lxml,如果沒有明確地指定解析器,那么BeautifulSoup對象會根據當前系統安裝的庫自動選擇解析器,解析器的選擇順序為:lxml、html5lib、Python標準庫。
3.3? 保存崗位信息
對于這種針對小范圍用戶以及小規模的爬蟲而言,可以將爬蟲結果匯合到一個文件進行持久化存儲即可,無需通過數據庫進行存儲,因此本文中將獲取的崗位信息進行保存時,是保存在json文件中,首先非常輕量,只有幾個方括號和花括號會占用額外空間。其次json能夠無限拓展數據的關系層次,就像樹狀圖,樹的根部能無止境的分叉。這就很大程度解決了csv、xlsx這種只有行列兩個維度的局限性,非常適合現在復雜關系的數據存儲。在Python中,json格式的文件可以用json庫或者pandas中的read_json來處理。其中保存崗位信息的源碼如下:
items = {"position": position,"company": company}
local_file = open("job.json", "a")
local_file.write(json.dumps(items, ensure_ascii=False) + "\n")
通過運行腳本保存為job.json,其中文件如圖3所示。
除了以上保存為文件之外,另外還可以保存到數據庫中,如關系型數據庫MySQL非關系型數據庫MongoDB、Redis等。MongoDB是一個基于分布式文件存儲的數據庫。由C++語言編寫,旨在為Web應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。
4? 結? 論
本文針對畢業生查找工作信息過程中,存在崗位信息相對需求分散的問題,通過Python語言設計網絡爬蟲系統,通過獲取源碼、崗位信息解析和崗位信息保存,在拉勾網中獲取有效的相關崗位信息,最終對崗位信息進行保存,為進一步使用分析作為準備工作。
參考文獻:
[1] 李杰秦.基于Python語言下網絡爬蟲的技術特點及應用設計 [J].數字通信世界,2020(1):209-210.
[2] 張宇超.基于標簽路徑和關鍵詞特征的Web新聞抽取方法研究與實現 [D].西安:西安電子科技大學,2021.
[3] 孫握瑜.基于Python的新浪微博爬蟲程序設計與實現 [J].科技資訊,2022,20(12):34-37.
[4] 裴麗麗.基于Python對豆瓣電影數據爬蟲的設計與實現 [J].電子技術與軟件工程,2019(13):176-177.
[5] 李傳科.基于Python的網頁數據爬蟲設計分析 [J].信息與電腦:理論版,2020,32(24):130-132.
[6] 簡悅,汪心瀛,楊明昕.基于Python的豆瓣網站數據爬取與分析 [J].電腦知識與技術,2020,16(32):51-53.
[7] 李鑫欣,關菁華.基于Python的豆瓣讀書網站用戶信息采集 [J].電腦知識與技術,2019,15(8):4-6.
作者簡介:馮曉磊(1988—),女,漢族,河南汝州人,中級工程師,碩士研究生,研究方向:大數據與人工智能。
收稿日期:2022-10-29