版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
目錄第1章緒論 11.1研究背景和意義 11.1.1選題的目的及意義 11.1.2國內(nèi)外發(fā)展狀況 11.2研究的基本內(nèi)容與擬解決的主要問題 11.3研究的方法與技術(shù)路線 21.3.1研究方法 21.3.2研究手段 2第2章基于python的網(wǎng)絡爬蟲 42.1python語言簡介 42.2網(wǎng)絡爬蟲 42.2.1網(wǎng)絡爬蟲的定義 42.2.2網(wǎng)絡爬蟲的基本流程 52.3scrapy框架 52.3.1scrapy框架的基本原理 52.3.2scrapy框架的基本流程 72.4分布式網(wǎng)絡爬蟲原理 8第3章網(wǎng)絡爬蟲模型的設(shè)計和實現(xiàn) 93.1網(wǎng)絡爬蟲的爬取對象 93.2網(wǎng)絡爬蟲系統(tǒng)功能架構(gòu) 93.3網(wǎng)絡爬蟲流程設(shè)計 103.4騰訊招聘網(wǎng)頁分析 113.4.1判斷網(wǎng)頁的靜/動態(tài)加載 113.4.2分析一級網(wǎng)頁獲取相應數(shù)據(jù) 123.4.3分析二級網(wǎng)頁獲取相應數(shù)據(jù) 143.5網(wǎng)絡爬蟲的具體實現(xiàn) 153.5.1創(chuàng)建spider項目文件 153.5.2定義Item容器 153.5.3編寫爬蟲程序 163.5.4編寫pipelines.py 193.5.5修改setting.py 20第4章第4章系統(tǒng)功能測試與實現(xiàn) 224.1爬蟲運行測試 224.2選擇要爬取的地區(qū) 224.3爬蟲爬取過程 224.4數(shù)據(jù)庫存儲數(shù)據(jù) 234.5爬蟲爬取結(jié)束 23結(jié)束語 25參考文獻 26致謝 27緒論研究背景和意義選題的目的及意義在早期的互聯(lián)網(wǎng)時代,人們主要通過篩選網(wǎng)絡上大量數(shù)據(jù),然后來獲取需要信息,互聯(lián)網(wǎng)技術(shù)發(fā)展的落后使得搜索技術(shù)影響了所需數(shù)據(jù)的速度和品質(zhì),與此同時,互聯(lián)網(wǎng)一直在快速發(fā)展著,信息的質(zhì)量也變得更加重要。因此,網(wǎng)絡信息的傳播面臨著巨大的機遇和挑戰(zhàn)[1]。如今的大規(guī)模數(shù)據(jù)在不同領(lǐng)域的相同或類似的關(guān)鍵詞的模糊性、搜索系統(tǒng)的整體結(jié)果都包含著復雜的信息。這是為了讓必要的信息出現(xiàn)在畫面上,需要做出額外的努力。在時間上,尤其是網(wǎng)絡快速發(fā)展的情況下,服裝、食品、住宅和旅行與網(wǎng)絡有著密切的關(guān)系。如果想找到好的、滿意的工作,在網(wǎng)上招聘信息中也有選擇。需要有關(guān)招聘新員工的信息將在網(wǎng)上公開。尋找最合適的工作,要求工作地點、工資和其他適當條件,工作經(jīng)驗和培訓將使他們掌握有關(guān)各領(lǐng)域工作的最合適信息[2]。然而在海量數(shù)據(jù)里能夠自由自在的獲取自己所需要的信息,爬蟲就是一個不錯的選擇。國內(nèi)外發(fā)展狀況上世紀九十年代起,網(wǎng)絡爬蟲技術(shù)便開始被研發(fā)。到現(xiàn)在為止,網(wǎng)絡爬蟲技術(shù)已經(jīng)逐步成熟。網(wǎng)絡爬蟲主要包括了網(wǎng)頁搜索策略和網(wǎng)頁分析策略,其中網(wǎng)頁搜索策略包含了廣度優(yōu)先法和最佳度優(yōu)先法;網(wǎng)頁分析策略包含了基于網(wǎng)絡拓撲的分析算法和基于網(wǎng)頁內(nèi)容的網(wǎng)頁分析算法[3]。研究的基本內(nèi)容與擬解決的主要問題本項目主要抓取騰訊招聘網(wǎng)站里有價值的數(shù)據(jù),利用Scapy框架爬取騰訊招聘官方網(wǎng)站主頁上刊登的招聘信息。例如,其中網(wǎng)頁鏈接、職位名稱、職位職責、職位職責、職位利用現(xiàn)有技術(shù)在項目中免除注冊,實現(xiàn)了多個目標,如要求、地點和發(fā)布時間等。同時對爬取得的數(shù)據(jù)進行初步篩選,除去多余的信息,除了可以節(jié)省當?shù)乜臻g外,數(shù)據(jù)科學家對數(shù)據(jù)進行兩次清洗、精制,從而得到更有價值的信息。本項目對爬蟲類的作用機構(gòu)和設(shè)計模式進行了優(yōu)化。同時采用了適當?shù)脑O(shè)計模式,可以及時將內(nèi)存數(shù)據(jù)導入數(shù)據(jù)庫,大幅減少了內(nèi)存資源的占用。研究的方法與技術(shù)路線研究方法如今很多爬蟲都是運用后臺腳本類語言來進行編寫,毫無疑問地,按使用次數(shù)來衡量,比較多的便是運用Python語言。Python發(fā)展了許多優(yōu)秀的庫和框架。本項目將采用Python中的scrapy框架作為爬蟲實現(xiàn)語言對爬蟲進行編寫。爬蟲的工作流程通常是非常復雜的,它需要運用網(wǎng)頁數(shù)據(jù)分析算法去刪除一些毫無作用的鏈接,將需要用到的鏈接保存并且放入url隊列中等待提取,之后根據(jù)編寫的搜索策略從隊列中選擇進一步要獲取的鏈接,重復這個過程直到程序停止。還有,系統(tǒng)往往會保存爬蟲爬取到的所有網(wǎng)頁,然后進行網(wǎng)頁分析、過濾數(shù)據(jù)。如果一個網(wǎng)站不愿意網(wǎng)站數(shù)據(jù)流出,就會根據(jù)爬蟲的特征進行識別,拒絕爬蟲的訪問[4]。一個完整的網(wǎng)絡爬蟲會包括四個模塊:網(wǎng)絡請求模塊、爬取流程控制模塊、內(nèi)容分析提取模塊、反爬蟲模塊。研究手段研究的主要任務(1)使用python的scrapy框架來設(shè)計爬蟲系統(tǒng)。(2)網(wǎng)絡爬蟲需要對有用的數(shù)據(jù)進行提取,再之后篩選出職位名稱等需要的數(shù)據(jù)。(3)最終完成的網(wǎng)絡爬蟲一開始要網(wǎng)頁地址進行分析之后再得到有用的數(shù)據(jù)。(4)最后設(shè)計完成的網(wǎng)絡爬蟲要提取需要的數(shù)據(jù)。研究各階段要求:(1)總體階段要根據(jù)所需的要求來設(shè)計出方案。(2)具體階段要對有疑惑的問題進行解答并設(shè)計出詳細方案,然后選擇最佳的設(shè)計方案。(3)編碼階段要選取適合的開發(fā)工具以及適合的技術(shù)標準。(4)測試階段要進行預測系統(tǒng)的運行結(jié)果,之后通過編譯來測試是否達到需求。設(shè)計開發(fā)學習各種網(wǎng)絡爬蟲相關(guān)的文獻資料,模擬網(wǎng)絡上面關(guān)于爬蟲開發(fā)的開源項目,在環(huán)境為windows操作系統(tǒng)下進行開發(fā)和測試。
基于python的網(wǎng)絡爬蟲python語言簡介作為開源編程語言,Python可以實現(xiàn)很多功能,其語法相對簡單易懂,有很多優(yōu)點,它廣泛使用于各種通用操作系統(tǒng)。此外,由于具有直接面對編程對象的特性,因此可以簡化編程過程,并且可以大大提高編程效率。最重要的是,Pytohon語言有很多優(yōu)點的網(wǎng)絡協(xié)議庫。這可以為獨立識別、分層存儲、程序員創(chuàng)造各種類型的編程邏輯[5]。網(wǎng)絡爬蟲網(wǎng)絡爬蟲的定義網(wǎng)絡爬蟲是一個可以根據(jù)某些設(shè)定的邏輯,自動從網(wǎng)絡上進行數(shù)據(jù)抓取。與傳統(tǒng)的瀏覽器信息搜索方式相比,網(wǎng)絡爬蟲通過搜索網(wǎng)址及時或定期地搜索用戶需求的內(nèi)容并將搜索結(jié)果發(fā)送給用戶的過程更準確、信息量更大、更符合用戶的在線需求[6]。對于python而言,它是被廣泛應用于爬蟲系統(tǒng)設(shè)計的語言之一,這不僅是因為Python在庫的設(shè)計過程中承載了爬蟲系統(tǒng)設(shè)計的必要基礎(chǔ),而且更重要的是在Python語言里開發(fā)了的一個名為Scrapy的框架被廣泛應用于爬蟲系統(tǒng)中,該框架被廣泛應用于當前的計算機操作系統(tǒng)中,它的主要優(yōu)點是能夠有效解決抓取網(wǎng)頁因被多次編寫而產(chǎn)生大量HTML源代碼從而造成信息堆積的問題,運用這一框架,只需要在框架中設(shè)置爬蟲模塊即可以爬取該網(wǎng)頁的數(shù)據(jù)[7]。根據(jù)系統(tǒng)的結(jié)構(gòu)功能,網(wǎng)絡爬蟲可以分為四種類型:(1)通用型網(wǎng)絡爬蟲通用型網(wǎng)絡爬蟲主要用于搜索引擎,之所以對爬取的速度和存儲空間要求比較高是因為它爬取的范圍廣,數(shù)量多。(2)聚焦型網(wǎng)絡爬蟲聚焦型網(wǎng)絡爬蟲是選擇性地爬取一開始便定義好的需求的數(shù)據(jù),它不僅節(jié)省了網(wǎng)絡資源,也滿足特定人員的特定需求。(3)增量型網(wǎng)絡爬蟲增量型網(wǎng)絡爬蟲只會產(chǎn)生新的爬取頁面或數(shù)據(jù)頁面被更改時來進行數(shù)據(jù)抓取,它有效降低數(shù)據(jù)量下載,減少了時間和空間的浪費。(4)深度網(wǎng)絡爬蟲深度網(wǎng)絡爬蟲需要先經(jīng)過注冊用戶登錄,或者是提交相應的表單之后才可以開始不斷地爬取網(wǎng)頁的數(shù)據(jù)[8]。網(wǎng)絡爬蟲的基本流程網(wǎng)絡爬蟲一般由四個流程進行:a).發(fā)送請求通過http庫將請求發(fā)送到目標網(wǎng)站,即發(fā)送給目標站點一個Request,這個Request可以包含headers等信息,然后等待服務器響應。b).獲取響應內(nèi)容請求發(fā)送結(jié)束之后,等待服務器正常響應,響應結(jié)束會返回一個響應內(nèi)容response,這個response可以是結(jié)構(gòu)化數(shù)據(jù),如html、json數(shù)據(jù)包等,也可以是非結(jié)構(gòu)化數(shù)據(jù),如圖片或視頻等。c).解析內(nèi)容一旦接受到響應內(nèi)容時,便可以提取里面的數(shù)據(jù)。當解析的是html數(shù)據(jù),則可以使用正則表達式或第三方解析庫如Beautifulsoup,pyquery等來提取數(shù)據(jù);若是解析json數(shù)據(jù),則可以導入json模塊,將數(shù)據(jù)轉(zhuǎn)化為python類型數(shù)據(jù)然后進行提?。蝗羰欠墙Y(jié)構(gòu)化數(shù)據(jù)的,直接進行提取后保存。d).保存數(shù)據(jù)從response中解析到數(shù)據(jù)一般可寫入數(shù)據(jù)庫或者寫入文本保存。scrapy框架scrapy框架的基本原理在開發(fā)python的網(wǎng)絡爬蟲中可以優(yōu)先選擇scrapy。它主要包括引擎(Engine),調(diào)度器(Scheduler),下載器(Downloader),爬蟲(Spider),項目管道(Pipeline),下載器中間件(Downloader-Middlewares),爬蟲中間件(Spider-Middlewares)等七個組件。如圖2-1所示。圖2-1.Scrapy框架架構(gòu)圖(1)引擎(Engine)引擎負責和進行管理控制整個系統(tǒng)框架所有一切組件之間的數(shù)據(jù)流信息,而且在某些動作發(fā)生時觸發(fā)相應的事務,整個scrapy框架的核心控制組件便是引擎。(2)調(diào)度器(Scheduler)通過調(diào)度器,scrapy框架可以控制哪個網(wǎng)頁優(yōu)先爬取,即控制網(wǎng)頁的爬取優(yōu)先級。它也含有去重功能,能夠去掉重復的網(wǎng)頁。當接受引擎?zhèn)鬟^來的請求后便按照排序傳遞給下載器。(3)下載器(Downloader)下載器采用異步方式與遠程服務器建立連接,下載網(wǎng)頁數(shù)據(jù)并將數(shù)據(jù)返回給引擎。它也可以接收調(diào)度器傳過來的請求,再根據(jù)要求從互聯(lián)網(wǎng)中下載網(wǎng)頁內(nèi)容,并將數(shù)據(jù)傳送給爬蟲。(4)爬蟲(Spider)爬蟲是Scrapy框架核心之一,網(wǎng)頁解析是它的主要工作,然后從目標網(wǎng)頁的數(shù)據(jù)里來進行提取。一個爬蟲項目通??梢該碛卸鄠€爬蟲,而且每個爬蟲r可以解析多個網(wǎng)站,爬取多個網(wǎng)站的數(shù)據(jù)。它由編碼人員負責編寫來解析請求網(wǎng)頁后返回數(shù)據(jù)的代碼,從數(shù)據(jù)中提取出Item和新的網(wǎng)頁地址,并把Item傳給Itempipeline組件。(5)項目管道(Pipeline)項目管道負責處理爬蟲提取的數(shù)據(jù),常見的處理如驗證有效性、清理不需要的信息及數(shù)據(jù)存儲等。通常需要多個數(shù)據(jù)管道,每個管道進行一種數(shù)據(jù)處理。(6)下載器中間件(Downloader-Middlewares)下載中間件位于引擎和下載器之間,是處理引擎和下載器之間的請求和響應的重要部分之一。(7)爬蟲中間件(Spider-Middlewares)爬蟲中間件位于引擎和爬蟲之間,是處理引擎和爬蟲之間的請求和響應的重要部分之一[9]。scrapy框架的基本流程如圖2-2所示,是scrapy框架的流程圖,主要包含8個流程:圖2-2.Scrapy框架流程圖(1)引擎向爬蟲文件索要第一個要爬取的網(wǎng)頁地址。(2)引擎將網(wǎng)頁地址信息交給調(diào)度器,調(diào)度器將網(wǎng)頁地址入隊列。(3)url地址出隊列,這時候的url地址為要爬取的內(nèi)容的網(wǎng)頁地址,由調(diào)度器傳遞給引擎。(4)引擎?zhèn)鬟f給下載器地址,下載器開始爬取。(5)獲取到響應之后,下載器將響應的內(nèi)容傳遞給引擎。(6)引擎將響應傳遞給爬蟲,爬蟲開始解析數(shù)據(jù)。(7)爬蟲提取數(shù)據(jù)之后,將所需的數(shù)據(jù)傳遞給引擎。若此時還有必須繼續(xù)跟進的網(wǎng)頁地址(即二級頁面等),則重復第一個步驟直至結(jié)束。(8)引擎將所需信息數(shù)據(jù)傳遞給管道,由管道進行保存等操作。分布式網(wǎng)絡爬蟲原理Scrapy-redis是scrapy實現(xiàn)分布式功能的主要部分。依靠主從關(guān)系,在這里將核心服務器稱為主服務器,將用于運行爬蟲項目的稱為從服務器。爬取網(wǎng)頁數(shù)據(jù)運用scrapy方式,第一步給爬蟲文件一個或一些初始地址start_urls,然后爬蟲文件開始訪問里面的網(wǎng)絡地址,再根據(jù)編碼人員設(shè)計的表達式來提取里面的數(shù)據(jù),也可以是解析和抓取其它二級網(wǎng)頁信息數(shù)據(jù)等。運用redis數(shù)據(jù)庫,在這里redis數(shù)據(jù)庫只需要存儲url,不需要存儲爬取到的數(shù)據(jù),redis數(shù)據(jù)庫會特殊設(shè)定不一樣的列表字段,來標記這些不同的網(wǎng)站地址,這樣可以達到爬取不重復網(wǎng)絡地址的效果。在主服務器上運用redis數(shù)據(jù)庫,不管有多少個從服務器,從服務器只能獲取主服務器里面redis數(shù)據(jù)庫存儲的網(wǎng)絡地址。由于scrapy-redis自身的隊列擁有特殊的機制,從服務器得到的網(wǎng)絡地址是不會相互沖突的。在每個從服務器結(jié)束數(shù)據(jù)抓取之后,會把爬取到的數(shù)據(jù)匯合并傳輸?shù)降街鞣掌魃?,這個時候爬取到的數(shù)據(jù)不再是存進redis數(shù)據(jù)庫里,而是存進mysql等儲存數(shù)據(jù)的數(shù)據(jù)庫。這種措施的另一個優(yōu)點便是程序的移植性很強,只需要修改路徑問題,把從服務器上的爬蟲項目復制粘貼到到其他從服務器上,便可以運行相同的爬蟲程序[10]。
網(wǎng)絡爬蟲模型的設(shè)計和實現(xiàn)網(wǎng)絡爬蟲的爬取對象本文實現(xiàn)的網(wǎng)絡爬蟲是爬取騰訊招聘網(wǎng)站招聘信息,爬取招聘網(wǎng)站的的一級頁面,里面包含職位名稱、職位類別以及工作地點等,之后再通過分析將每個職位的二級頁面爬取下來,之后再爬取二級頁面數(shù)據(jù),包含職位責任和職位要求。網(wǎng)絡爬蟲系統(tǒng)功能架構(gòu)分布式爬蟲抓取系統(tǒng),如圖3-1所示,主要包含以下功能:圖3-1分布式爬蟲抓取系統(tǒng)架構(gòu)圖(1)爬蟲:爬取策略的設(shè)計、提取數(shù)據(jù)設(shè)計、增量爬取、請求去重(2)中間件:爬蟲防屏蔽中間件(3)數(shù)據(jù)存儲:抓取字段設(shè)計、數(shù)據(jù)存儲本文將騰訊招聘網(wǎng)站為主題的網(wǎng)絡爬蟲劃為爬蟲模塊、中間件模塊、數(shù)據(jù)存儲模塊3個部分。其中爬蟲模塊用來分析提取url地址,實施招聘主題信息網(wǎng)頁的抓取,在滿足爬取規(guī)則的范圍內(nèi)抓取符合招聘主題信息的網(wǎng)頁數(shù)據(jù);中間件模塊主要負責添加user-agent請求頭信息模擬瀏覽器登錄,實現(xiàn)爬蟲防屏蔽功能;數(shù)據(jù)存儲模塊主要將抓取的網(wǎng)頁數(shù)據(jù)存入到數(shù)據(jù)庫中。網(wǎng)絡爬蟲流程設(shè)計由scrapy的結(jié)構(gòu)分析可知,網(wǎng)絡爬蟲從start_url開始,根據(jù)設(shè)計爬蟲并定義的url地址,得到積極響應后,若是html數(shù)據(jù),則可以運用正則表達式或者Xpath去提取數(shù)據(jù);若是json類型的,則導入json模塊加以提取。若是從一級頁面中獲取到更多鏈接,則將這些鏈接添加進待下載隊列當中,對它們進行去重和排序操作,然后等待調(diào)度器的調(diào)度。在整個系統(tǒng)中,鏈接可以分為兩類:一類是目錄頁鏈接,里面包含著崗位名稱和崗位類型,以及其它鏈接,此時我們需要提及崗位名稱、崗位類型和下一頁的鏈接;一類是內(nèi)容詳情頁鏈接,里面包含著崗位職責和崗位要求的信息。網(wǎng)絡需要從每一個目錄頁鏈接當中來提取所需要的數(shù)據(jù)之后,加入到待下載隊列并準備進一步爬取。爬取流程如圖3-2所示。圖3-2.爬蟲流程設(shè)計圖由此流程圖便知,首先要先獲取一個start_url地址,才可以進行爬取任務。所以需要開始進行網(wǎng)頁分析。騰訊招聘網(wǎng)頁分析判斷網(wǎng)頁的靜/動態(tài)加載首先進入騰訊招聘網(wǎng)站(/),我們可以看到如圖3-3所示的騰訊招聘網(wǎng)站主頁,點擊“查看工作崗位”即可得到此招聘網(wǎng)站的大量信息。圖3-3.騰訊招聘網(wǎng)站主頁單擊點開之后便是招聘網(wǎng)站的分頁,如圖3-4所示,這時候可以依據(jù)不同的地區(qū)選擇想要了解的職位信息。以中國的四個一線城市(北京、上海、廣州、深圳)為例,主要分析這四大地區(qū)的網(wǎng)頁地址。圖3-4.騰訊招聘網(wǎng)站分頁判斷網(wǎng)頁靜/動態(tài)加載,主要依據(jù)是查看網(wǎng)頁源代碼中有沒有具體數(shù)據(jù),有數(shù)據(jù)則為靜態(tài)加載,無數(shù)據(jù)則為動態(tài)加載。靜態(tài)加載的數(shù)據(jù)主要是html數(shù)據(jù),提取數(shù)據(jù)可以使用正則表達式或xpath方法。動態(tài)加載則需要利用控制臺并根據(jù)頁面的動作來抓取網(wǎng)絡數(shù)據(jù)包,即json數(shù)據(jù)包的url地址。以騰訊招聘網(wǎng)站為例,由于網(wǎng)頁源代碼中沒有具體數(shù)據(jù),則為Ajax動態(tài)加載,根據(jù)控制臺和頁面刷新可以在XHR上面得到三個異步加載的數(shù)據(jù)包,在Query文件的Preview中發(fā)現(xiàn)了需要爬取的數(shù)據(jù),如圖3-5所示。圖3-5.招聘網(wǎng)站網(wǎng)頁信息分析一級網(wǎng)頁獲取相應數(shù)據(jù) 在XHR得到json數(shù)據(jù)包,此時需要在Headers上面查找有用的信息。如圖3-6所示,需要提取到的url地址便是圖中RequestURL。圖3-6.一級頁面Headers信息RequestURL(一級頁面):/tencentcareer/api/post/Query?timestamp=1584696974713&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex=1&pageSize=10&language=zh-cn&area=cn然而此url地址比較復雜,所以需要分析每個參數(shù)。在Headers底端的QueryStringParameters(查詢參數(shù))欄便有著這個網(wǎng)頁地址的所有參數(shù)。在獲取到北京、上海、廣州、深圳以及不分地區(qū)的招聘網(wǎng)頁地址后,分別得到它們的參數(shù)區(qū)別,如圖3-7所示。圖3-7.北京、上海、廣州、深圳以及不分地區(qū)的招聘網(wǎng)頁地址參數(shù)在這些參數(shù)中,可分析得到,如表3-1所示。表3-1一級頁面各參數(shù)所代表的含義timestamp:時間戳cityId:‘2’為北京,‘3’為上海,‘5’為廣州,‘1’為深圳,‘’為不分地區(qū)pageIndex:頁數(shù)pageSize:10個(招聘職位)由于刪去timestamp這個參數(shù)后依然可以得到json數(shù)據(jù)包,所以重要的參數(shù)分別為cityId、pageIndex、pageSize??傻玫揭患夗撁鎜ne_url:/tencentcareer/api/post/Query?&countryId=&cityId={}&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex={}&pageSize=10&language=zh-cn&area=cn最后再運用format方法即可將字符串分別帶入,得到一個完整的url。代入?yún)?shù)后打開此鏈接,所得到的信息便是我們需要的json數(shù)據(jù)包,里面包含所有招聘職業(yè)的職業(yè)名稱、職業(yè)類別和工作地點等大量數(shù)據(jù),如圖3-8所示。圖3-8.一級頁面Json數(shù)據(jù)包在這個json數(shù)據(jù)包中,我們可以分析得到想要的數(shù)據(jù),如表3-2所示。表3-2一級頁面各參數(shù)所代表的含義RecruitPostName:職位名稱CategoryName:職位類別LocationName:工作地點根據(jù)圖3-8展示的json數(shù)據(jù)包,我們可以知道這些數(shù)據(jù)是需要根據(jù)字典的方式來進行提取,首先由一個大字典含有的‘Data’鍵來對應值,這個值為所需要提取的第二個字典,根據(jù)第二個字典的鍵‘Posts’來獲取數(shù)據(jù)。‘Posts’對應的值為一個列表,在列表中提取字典,所以我們可以根據(jù)以上信息,運用for循環(huán)來編寫提取數(shù)據(jù)的代碼:forjobinhtml['Data']['Posts']:#職位名稱=job['RecruitPostName']#職位列別=job['CategoryName']#工作地點=job['LocationName']在這個數(shù)據(jù)包中沒有我們想要的職位職責和職位要求,所以就需要分析二級網(wǎng)網(wǎng)頁來獲取。分析二級網(wǎng)頁獲取相應數(shù)據(jù) 二級頁面,是在一級頁面中點開一個招聘職位得到的網(wǎng)頁,同理可以得到二級頁面的相應數(shù)據(jù),如圖3-9所示。圖3-9.二級頁面Headers信息RequestURL(二級頁面):/tencentcareer/api/post/ByPostId?timestamp=1584717244516&postId=1237234611482791936&language=zh-cn分析三個不同職位的網(wǎng)頁鏈接參數(shù),如圖3-10所示,將參數(shù)進行對比,可以得到postId是不一致的,可以發(fā)現(xiàn)不同職位間都有著不同的postId來于此對應,而且這個postId在一級頁面的json數(shù)據(jù)包中也有包含,所以可以根據(jù)一級頁面得到的postId來獲取二級頁面的數(shù)據(jù)。圖3-10.網(wǎng)頁參數(shù)對比因此得到二級頁面地址為:/tencentcareer/api/post/ByPostId?&postId={}&language=zh-cn利用format方法代入一個職位的postId,即可得到相應的json數(shù)據(jù)包,如圖3-11所示。圖3-11.二級頁面json數(shù)據(jù)包在這個json數(shù)據(jù)包中,我們可以分析得到想要的數(shù)據(jù)如表3-3所示。表3-3二級頁面各參數(shù)所代表的含義Responsibility:職位責任Requirement:職位要求在這些json數(shù)據(jù)包中,利用提取字典的方式便可以從中爬取到想要的數(shù)據(jù)。分析完一級頁面和二級頁面,即刻開始設(shè)計爬蟲的具體實現(xiàn)。網(wǎng)絡爬蟲的具體實現(xiàn)創(chuàng)建spider項目文件第一步需要建立一個Scrapy項目文件,即在終端中運行更改目錄的命令,把當前位置切換到將要用于保存爬蟲代碼的文件夾中,運行命令“scrapystartproject+自定義的爬蟲目錄名稱”,文件夾中會自動生成爬蟲的項目框架。第二步切換到該爬蟲目錄,可以看到該目錄文件夾里的內(nèi)容:項目配置文件、python模塊、item文件、pipelines管道文件、setting文件和spider目錄文件夾等幾個部分。最后在終端輸入命令“scrapygenspider+爬蟲文件名+爬蟲對象域名”,即可開始進行爬蟲項目設(shè)計。定義Item容器Item負責定義以及儲存獲取的網(wǎng)絡數(shù)據(jù),而且定義Item容器是為了消除由于拼寫錯誤帶來的麻煩,而且它也增加了額外的保護機制。依據(jù)實際情況在item.py中對提取到的數(shù)據(jù)編寫相關(guān)的字段,比如職業(yè)名稱、職業(yè)類別、工作地點、職業(yè)責任和職業(yè)要求。 Item.py關(guān)鍵代碼如下:importscrapyclassTcrecruitItem(scrapy.Item):#名稱tc_name=scrapy.Field()#類別tc_type=scrapy.Field()#工作地點tc_location=scrapy.Field()#職責tc_duty=scrapy.Field()#要求tc_require=scrapy.Field()pass編寫爬蟲程序爬蟲程序spider.py用于爬取一級頁面及其包含的數(shù)據(jù)、二級頁面及其包含的數(shù)據(jù),它的實現(xiàn)內(nèi)容包括:初始下載的鏈接地址即start_urls、后續(xù)跟進網(wǎng)頁的URL鏈接即two_url、采用的算法、提取數(shù)據(jù)生成item。在這里,以中國四大一線城市(北京、上海、廣州、深圳)以及全國范圍為例,根據(jù)騰訊招聘網(wǎng)站地址可以得到這五個地區(qū)的參數(shù),再用format()方法將參數(shù)代入進網(wǎng)站地址里便可以得到地區(qū)對應的json數(shù)據(jù)包,相關(guān)代碼如下:classTcrecruitSpider(scrapy.Spider):name='tcrecruit'allowed_domains=['']a=''city_url='/tencentcareer/api/post/'\'Query?timestamp=1584608233122&countryId=&cityId='#選擇要爬取的地區(qū)choice=input('1.深圳2.北京3.上海4.廣州5.全部\n請選擇:')ifchoice=='1':a=1elifchoice=='2':a=2elifchoice=='3':a=3elifchoice=='4':a=5else:a=''#將網(wǎng)絡地址合并one_url=city_url+str(a)+'&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex={}&pageSize=10&language=zh-cn&area=cn'two_url='/tencentcareer/api/post/ByPostId?&postId={}&language=zh-cn'start_urls=[one_url.format(1)]得到json數(shù)據(jù)包后,要編寫翻頁的函數(shù)以便能獲取大量的職位信息,這里運用for循環(huán)進行翻頁操作,相關(guān)代碼如下:defparse(self,response):forpage_indexinrange(1,21):url=self.one_url.format(page_index)yieldscrapy.Request(url=url,callback=self.parse_one)分析招聘主題信息爬蟲要爬取的數(shù)據(jù)信息包括職位名稱、職位類別、工作地點、職位責任和職位要求;觀察分析騰訊招聘頁面的json數(shù)據(jù)包,再根據(jù)python自帶的json.loads()方法將json類型的數(shù)據(jù)變成python的數(shù)據(jù)類型,然后用字典提取數(shù)據(jù)方式將所需要的數(shù)據(jù)提取出來。在一級頁面能夠獲取到二級頁面的必備參數(shù)postId,然后將postId拼接到two_url便可以進入二級頁面的json數(shù)據(jù)包去提取數(shù)據(jù)。重要代碼如下:defparse_one(self,response):html=json.loads(response.text)forjobinhtml['Data']['Posts']:item=TcrecruitItem()#職位名稱、職位類別、工作地點item['tc_name']=job['RecruitPostName']item['tc_type']=job['CategoryName']item['tc_location']=job['LocationName']#postID:拼接二級頁面的地址post_id=job['PostId']two_url=self.two_url.format(post_id)#交給調(diào)度器yieldscrapy.Request(url=two_url,meta={'item':item},callback=self.parse_two)defparse_two(self,response):item=response.meta['item']html=json.loads(response.text)#職位責任item['tc_duty']=html['Data']['Responsibility']#職位要求item['tc_require']=html['Data']['Requirement']yielditem編寫pipelines.py若要在函數(shù)里面加上可以在終端輸出數(shù)據(jù)的功能,只需要添加相關(guān)代碼:classTcrecruitPipeline(object):defprocess_item(self,item,spider):print(dict(item))returnitem接著便是保存數(shù)據(jù),首先要導入pymysql庫,然后依次編寫自己數(shù)據(jù)庫信息,例如用戶名、密碼、表名等;然后再將爬取的數(shù)據(jù)插入相對于的位置,需要定義一個列表,然后用列表來進行傳遞參數(shù);接著提交到數(shù)據(jù)庫去自動執(zhí)行代碼;最后關(guān)閉數(shù)據(jù)庫。相關(guān)代碼如下:importpymysqlclassTcrecruitMysqlPipeline(object):defopen_spider(self,spider):#打開數(shù)據(jù)庫并輸入端口號賬號密碼等信息self.db=pymysql.connect('','root','moon631166427','tencentdb',charset='utf8')self.cursor=self.db.cursor()defprocess_item(self,item,spider):ins='insertintotcrecruitdatavalues(%s,%s,%s,%s,%s)'job_list=[item['tc_name'],item['tc_type'],item['tc_location'],item['tc_duty'],item['tc_require']]self.cursor.execute(ins,job_list)mit()returnitemdefclose_spider(self,spider):self.cursor.close()self.db.close()當然,保存數(shù)據(jù)的前提需要在數(shù)據(jù)庫創(chuàng)建能與存儲爬蟲數(shù)據(jù)相對應的表格。如圖3-12所示。圖3-12.創(chuàng)建數(shù)據(jù)庫修改setting.py離編寫完scrapy網(wǎng)絡爬蟲程序只差最后一步,便是修改setting.py的參數(shù)和添加scrapy-redis。(1)修改最大并發(fā)量,最好將并發(fā)量修改小一點,這個參數(shù)越小,爬蟲程序便越安全,但爬取時間會變長一些。CONCURRENT_REQUESTS=10(2)修改下載延遲參數(shù),這里將延遲參數(shù)調(diào)至0.3s:DOWNLOAD_DELAY=0.3(3)修改REQUEST_HEADERS請求頭,這里是由下載中間件完成,添加user-agent模擬瀏覽器瀏覽爬取對象的網(wǎng)絡地址:DEFAULT_REQUEST_HEADERS={'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':'en','User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64;rv:6.0)Gecko/20100101Firefox/6.0'}(4)修改item_pipeline項目管道,添加數(shù)據(jù)庫(若想將數(shù)據(jù)存儲進redis,也可以在這里添加redis相對應的管道):ITEM_PIPELINES={'Tcrecruit.pipelines.TcrecruitPipeline':300,'Tcrecruit.pipelines.TcrecruitMysqlPipeline':250,#'scrapy_redis.pipelines.RedisPipeline':250,}(5)添加scrapy-redis:使用scrapy_redis的調(diào)度器SCHEDULER="scrapy_redis.scheduler.Scheduler"使用scrapy_redis自帶的去重機制DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"爬取結(jié)束后清除請求指紋(也可以不清除):SCHEDULER_PERSIST=True定義redis主機的地址和端口號(這里REDIS_HOST為空時,處理器會自己尋找本機電腦的地址):REDIS_HOST=''REDIS_PORT=6379
第4章系統(tǒng)功能測試與實現(xiàn)爬蟲運行測試在CPU為CORE(TM)i5-3317,內(nèi)存為8G,操作系統(tǒng)為WIN10-64位的戴爾筆記本,pycharm版本為2019.2,python版本為3.7.3的環(huán)境下,通過在pycharm建立一個run.py,導入cmdline庫,編寫命令“cmdline.execute(‘scrapycrawltcrecruit‘.split())”,運行run.py來啟動爬蟲進行騰訊招聘信息爬取測試選擇要爬取的地區(qū)如圖4-1所示,爬蟲開始運行,總共可以爬取5個地區(qū)。以深圳地區(qū)為例子,輸入深圳地區(qū)的相應數(shù)字,即可開始爬取騰訊深圳地區(qū)招聘職業(yè)的數(shù)據(jù)。圖4-1.選擇深圳地區(qū)爬蟲爬取過程如圖4-2所示,為爬蟲爬取騰訊深圳地區(qū)招聘職業(yè)的信息,從圖中可以看到‘tc_name’正確對應了招聘職位的職位名稱;‘tc_type’正確對應了職位類別;‘tc_location’正確對應了工作地點,即為深圳地區(qū);‘tc_duty’正確對應了職位責任;‘tc_require’正確對應了職位要求。圖4-2.爬蟲爬取過程數(shù)據(jù)庫存儲數(shù)據(jù)如圖4-3所示,進入數(shù)據(jù)庫并查詢數(shù)據(jù)表里面的數(shù)據(jù);圖4-3.查詢數(shù)據(jù)表如圖4-4,為數(shù)據(jù)表里面呈現(xiàn)出來的內(nèi)容,至此可以說明數(shù)據(jù)庫成功存儲來自爬蟲項目爬取到的數(shù)據(jù)。圖4-4.數(shù)據(jù)表格內(nèi)容爬蟲爬取結(jié)束如圖4-5所示,為爬蟲成功運行并結(jié)束之后顯示的內(nèi)容,由于設(shè)定爬取20頁,每頁20個職位,所以總計成功爬取到的職位個數(shù)為200個。圖4-5.爬蟲運行結(jié)束如圖4-6所示,打開RedisDesktopManager,也可以查到成功爬取的職位個數(shù)為200個,并且這200個職位在scrapy-redis的作用下是不會重復的。圖
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024全新一代智能家居設(shè)備租賃服務合同下載3篇
- 2024年度新能源汽車充電樁安裝與銷售獨家代理合同3篇
- 二項式定理及應用課件
- 寬帶合作合同范例
- 門面提前終止合同范例
- 購房出資合同范例
- 商鋪出兌合同范例
- 黃金產(chǎn)品維修合同范例
- 勞務合同范例兒
- 風帆股合同范例
- 2024-2030年中國鋁汽車緊固件行業(yè)銷售規(guī)模與盈利前景預測報告
- 城市建設(shè)苗木吊裝安全方案
- 中醫(yī)院醫(yī)生作風建設(shè)工作方案(6篇)
- DIY手工坊創(chuàng)業(yè)項目計劃書
- (高清版)DB21∕T 1795-2021 污水源熱泵系統(tǒng)工程技術(shù)規(guī)程
- 2024-2025學年人教版數(shù)學五年級上冊期末檢測試卷(含答案)
- 【MOOC】犯罪心理學-中南財經(jīng)政法大學 中國大學慕課MOOC答案
- 《外盤期貨常識》課件
- 2024江蘇鹽城港控股集團限公司招聘23人易考易錯模擬試題(共500題)試卷后附參考答案
- 2024年三支一扶考試基本能力測驗試題及解答參考
- 中華人民共和國統(tǒng)計法
評論
0/150
提交評論