目 錄
1 引言.............................................................5
1.1 Python的介紹...................................................5
1.2 數據采集(爬蟲)介紹............................................5
1.2.1 什么是爬蟲....................................................5
1.2.2 通用爬蟲和聚焦爬蟲............................................5
1.2.3 數據采集研究現狀..............................................6
1.3 數據清洗介紹....................................................6
1.4 數據可視化介紹..................................................6
1.4.1 數據可視化發展史..............................................6
1.4.2 數據可視化研究概述............................................7
2 數據采集(爬蟲)技術實現..........................................8
2.1 采集需求........................................................8
2.2 爬蟲設計流程....................................................8
2.3 采集網站分析....................................................9
2.4 采集代碼實現....................................................10
3 數據清洗技術.....................................................13
4 數據可視化技術...................................................14
4.1 可視化技術實現.................................................14
4.1.1 字段確認.....................................................14
4.1.2 數據獲取.....................................................15
4.1.2.1 獲取薪資數據...............................................15
4.1.2.2 獲取城市數據...............................................16
4.1.2.3 獲取學歷數據...............................................17
4.1.2.4 獲取工作性質數據...........................................18
4.1.2.5 獲取工作經驗數據...........................................19
4.1.3 可視化實現.................................................19
4.2 數據展示與分析.................................................20
4.2.1 薪資可視化...................................................20
4.2.2 城市地區分布.................................................21
4.2.3 學歷要求.....................................................21
4.2.4 工作性質.....................................................22
4.2.5 工作經驗.....................................................24
1 引言
1989年,軟件工程師蒂莫西·約翰·伯納斯-李爵士(Sir Timothy John Berners-Lee)發明了萬維網,直至今日,已經有三十年的了,這三十年來,互聯網發展特別的迅速,網絡的發展,造成了World Wide Web成了大批數據的載體,而如何利用這些數據來改善人們的生活和工作是一個值得研究的課題。
應屆生畢業,面臨着最緊急的事,那就是找工作,但是很多畢業生不知道自己想要做的工作崗位的地區分布、薪資待遇等方面的情況。本腳本就是基於Python的一個數據采集和數據可視化,以java為例,使用requests庫采集智聯招聘上的網站的有關java的職位數據,並存儲到阿里雲數據庫中,之后對數據庫中的相關職位信息進行修正,可視化等操作,利用這些數據來了解java的職位信息。
1.1 Python
Python編程語言和java編程語言一樣,都是一種高級編程語言,不過不同於Java語言的是,Python是解釋型,Java是編譯型。
Python和Perl語言相同, Python和Perl語言的源代碼都是遵循 GPL協議。
1.2 數據采集(爬蟲)介紹
1.2.1 什么是爬蟲
什么是爬蟲?搜索引擎就是爬蟲的一個典型示例,像百度、谷歌等等這些都屬於搜索引擎。網絡爬蟲的別稱有很多,像網絡機器人、網絡追逐者,還有人很形象地稱之為網絡蜘蛛,它的本質上是一個程序或者一個腳本,通過某些特定的規則自動的去爬取網絡中的數據。
一般來說,爬蟲是模擬瀏覽器請求服務器。它可以使用某些規則自動請求網頁且抓取有用的數據。
1.2.2 通用爬蟲和聚焦爬蟲
爬蟲分為通用爬蟲和聚焦爬蟲。
通用爬蟲:它是各大搜索引擎(Google,百度,搜狗)的重要組成部分,主要是用來下載互聯網的網頁到本地,來形成一個互聯網內容的鏡像備份。
聚焦爬蟲:它是一種面向特定需求的網絡爬蟲的程序,它和通用爬蟲的區別在於,聚焦爬蟲不但會下載網頁,還會對網頁里面的內容進行篩選,盡量只提取與需求相關的數據。
本設計就是一個爬取智聯招聘的聚焦爬蟲。
1.2.3 數據采集研究現狀
目前,網絡數據采集技術基本上是通過網絡蜘蛛(或數據采集機器人)、分詞系統、任務索引系統等垂直搜索引擎技術的綜合應用完成的。隨着海量網絡信息的增長和互聯網技術的發展,人們對信息獲取和分類的需求日益增加。
人們通常通過上述技術收集大量的信息和數據,然后對其進行兩次分類和處理,以最大化網絡數據的價值和效益,使其更加專業。
在我國,有許多企業從事“海量數據收集”,其中大部分是通過垂直搜索引擎技術實現的。同時,一些企業也實現了各種技術的綜合應用。例如,“火車收集器”是垂直搜索引擎網絡雷達中的信息跟蹤、自動索引和自動排序技術,它結合了海量數據收集和后處理。
一般來說,從事大規模數據收集的企業屬於計算機數據分析的研究范疇。
1.3 數據清洗介紹
數據清理:重新檢查和驗證數據以糾正現有錯誤、刪除重復信息並提供數據一致性的過程。
數據清理是對臟數據進行清理的過程,是指查找和糾正數據文件中可識別錯誤的過程,包括檢查數據一致性、處理丟失和無效值等。因為在數據倉庫中,數據是一個面向特定主題的數據集,從許多不同的業務中提取出來。系統中包含歷史數據,必然會出現數據錯誤和數據之間的沖突或者重復的數據。顯然,這些非要求的數據不是我們所需要的,那么我們就稱它們為臟數據。我們使用特定的規則來清理臟數據,這就是數據清理。數據清理的任務是對不符合要求的數據進行過濾,並將過濾結果傳遞給業務主管部門。我們在提取相關數據之前,需要先看看這些數據是否需要過濾或者刪除。不完全數據、重復數據和不正確數據是不符合要求的主要數據。數據清理不同於問卷審查。輸入后的數據清理通常由計算機完成,而不是手動完成。
1.4 數據可視化介紹
1.4.1 數據可視化發展史
數據可視化始於20世紀50年代,當時計算機圖形學仍處於早期開發階段,人們使用計算機制作第一個圖形和圖表。1987年,Maxine Brown和其他人撰寫了美國國家科學基金會的一份報告,該報告極大地刺激和促進了數據可視化領域。本文重點介紹了新計算機可視化技術的必要性和重要性。隨着計算機的發展,計算機的計算能力迅速提高。越來越多的大規模、復雜的數值模型被建立起來,產生了各種異常大的數據集。與此同時,人們使用顯微鏡和掃描儀等數據采集設備來生成大數據集,也使用能夠存儲文本、數值和多媒體信息的大型數據庫來收集大量數據。隨着數據量的增加,需要更先進的計算機圖形技術和方法來處理和可視化這些數據集。
數據可視化最初是指科學計算中的可視化:即在科學和工程實踐中使用計算機建模和仿真。隨着時代的發展,人們越來越關注視覺數據,包括行政、金融、商業、數字媒體等大型數據集。
從那時起,數據可視化已經成為一個不斷發展的概念,其邊界越來越大。所以當我們定義它時,最好是更寬泛。數據可視化是一種相對先進的技術,允許用戶使用圖形,用戶界面,計算機視覺和圖像處理。通過表面、立體、屬性和動畫建模、表達和顯示、數據的直觀解釋。
1.4.2 數據可視化研究概述
通過數據可視化,我們可以增強數據的呈現效果,讓用戶更直觀地查看數據,從而發現大量數據中的稀有銀。可視化具有廣泛的應用范圍,但主要涉及社會可視化、數據挖掘數據可視化、文本數據可視化、交通可視化、生物醫學可視化、網絡數據可視化等領域。通過卡片可視化模型,將數據可視化過程分為數據預處理、繪制、顯示和交互三個階段。
目前,高維數據已成為計算機領域的研究熱點。這里的高維數據意味着每個樣本數據包含超過四維的空間特征。然而,人們對數據的理解主要集中在低維空間的表示上。如果只分析高維數據的抽象數據值,就很難獲得有用的信息。與高維數據仿真相比,低維空間可視化技術更直觀、簡單。此外,高維空間元素比低維空間元素更為復雜,更容易在人們的分析中引起混淆。我們可以將高維數據的信息映射到二維或三維空間,這有助於高維數據與低維數據的交互,有助於數據分類和聚類。
分層數據是分層的,或分層的。層次數據可視化主要有兩種方法:樹圖和節點鏈接圖。樹形圖通過一系列嵌套的塊和環顯示分層數據。
網絡數據是一個更自由但更復雜的網絡。
隨着大數據時代的到來,數據可視化也應運而生。在大數據分析中,可視化分析是必不可少的重要工具和手段。只有真正理解可視化概念的本質,才能更好地研究和應用數據可視化,以獲得數據背后的隱藏值。
2 數據采集(爬蟲)技術
2.1 采集需求
本次采集的網站是智聯招聘,需要獲取其中的一些職位的信息,來完成后面的數據可視化部分,需要獲取的信息包括但不限於:每個職位獨有的ID,職位所在的城市,職位薪資,職位福利,職位類型,職位要求的最低學歷,職位標簽,職位要求的工作經驗。
2.2 爬蟲設計流程

圖1 爬蟲設計流程圖
2.3 采集網站分析
我們在網站上搜索智聯招聘,進入后,搜索相關職位,以”java“為例,搜索”java“,在搜索結果出來之后,右擊去查看網頁的源代碼,效果如圖1所示:

圖2 源代碼效果圖
仔細尋找發現並沒有我們所需要的數據,表明數據不是從原網頁中傳遞過來的,所以我們所需要的數據應該是從其他的請求傳遞過來的,我們按下F12,進入開發者模式,點擊Network-->點擊XHR-->點擊如圖2所示的requests-->在response中可以看到我們需要的數據就在這里。

圖3 尋找數據來源
我們看一些這里服務器返回的數據的格式,是一個json的類型,那就很好解析了。
2.4 采集代碼實現
現在就開始正式的構造請求,來用代碼模擬客戶端向服務器發送請求數據,我們需要構造請求頭和相關參數來請求網頁,相關代碼如下圖:

圖4 請求模塊代碼圖
上圖是請求模塊,我們打印輸出一下請求到的數據,如下圖所示:

圖5 請求到的數據
看到的數據和在瀏覽器上的數據相同,那么接下來就是對數據進行解析了,由於數據為json的格式,解析起來也是很方便的,如下圖是解析模塊的代碼:

圖6 解析模塊代碼圖
解析后,我們將得到的單條數據構造成字典類型(dict),多條字典組成列表,方便之后的存儲,如下圖:

圖7 存儲的相關格式
解析數據完成后,要將解析的數據存儲起來,為了方便后面做數據可視化的時候調用它,我們將數據庫放在了阿里雲服務器上。而存儲的方式也有很多種,可以存儲成文件,包括csv格式,txt格式等,也可以存儲到數據庫中。而且流行的數據庫類型有很多,大致的分為兩類:關系型數據庫和非關系型數據庫,關系型數據庫(Relational database)有MySQL、Oracle2、DB2等;非關系型數據庫(NoSQL)包括MongoDB、Redis、Flare等。本腳本存儲使用的是關系型數據庫中的MySQL,建立一個MySQL數據表來存儲數據,並根據爬取的信息來設置字段,如下圖所示是創建數據庫表格時的DDL(數據庫模式定義語言):

圖8 創建數據庫表格時的DDL
在建好數據表后,我們使用Python,來連接數據庫,並將解析后的數據存儲到數據表中,我們使用批量存儲的方法,每次存儲1000條數據,避免頻繁地連接數據庫,造成數據庫堵塞,存儲模塊部分代碼如圖:

圖9 數據存儲模代碼圖塊
3 數據清洗部分
數據清洗部分,主要是使用代碼清洗MySQL數據庫中的一些字段,包括salary(薪資)字段,city(城市)字段。
例如,在salary字段中,大部分類似如5K-10K的樣式,也有一些像薪資面議無法判斷薪資范圍的,我們需要將這些“臟”數據清除或者轉換成相同且容易處理的格式
如圖是數據清洗的部分代碼:

圖10 數據清洗的部分代碼
4 數據可視化技術
4.1 可視化技術實現
可視化技術的實現主要是分為三個部分,分別是:字段確定,數據獲取,可視化實現。
4.1.1 字段確定
數據清洗完成之后,要進行的就是數據可視化,在此之前我們先看一下阿里雲數據庫中采集到的職位數據,如下圖所示:

圖11 職位數據
采集到的數據有很多:職位名稱(jobname),職位專屬ID(job_id),招聘職位的公司所在的城市(city)等等。但是,並不是所有的數據都進行可視化操作,所以在這之前我們需要確定哪些字段來進行數據可視化分析,可視化字段包括:薪資,城市,學歷要求,工作性質,工作經驗。
4.1.2 數據獲取
其實有很多的工具都可以來做數據可視化,不過我們將使用的是應用最廣的matplotlib庫,來對java的職位數據進行可視化。
我們創建一個新的Python文件來進行可視化操作,由於matplotlib庫在做表格的時候默認不顯示中文,我們通過matplotlib.rcParams["font.family"] = 'simhei'來設置中文顯示。
在進行可視化時,我們通過使用pymysql庫鏈接數據庫獲取相關數據,寫一個select_one函數將代碼進行包裝,以便之后更好的復用它,相關代碼如下圖所示:

圖12 從數據庫獲取數據的相關代碼
操作數據庫的相關代碼可以復用,但是SQL語句需要重寫,下面介紹不同可視化的sql語句的寫法。
圖13 SQL語句之獲取薪資數據
4.1.2.1 獲取城市數據
在數據庫中,對應薪資的字段信息的字段是:city。city表示的是公司的具體地址信息。我們列舉12個常見的城市作為統計關鍵字,使用SQL語句中的like關鍵字進行匹配,獲取並統計city字段中各類城市出現的次數。如圖是獲取城市分布數據的SQL語句:

圖14 SQL語句之獲取城市分布數據
4.1.2.2 獲取薪資數據
在數據庫中,對應薪資的字段信息的字段是:salary和salary_code。salary表示的是具體的薪資數據;salary_code是進行數據清洗之后,所分配的薪資范圍,例如:510表示薪資范圍在5k到10k;1015表示薪資范圍在10k到15k;以此類推。
我們需要通過SQL查詢語句獲取並統計salary_code字段中各類薪資出現的次數。如圖是獲取薪資數據的SQL語句:

4.1.2.3 獲取學歷數據
在數據庫中,對應薪資的字段信息的字段是:edu_level_name和edu_level_code。edu_level_name表示的是學歷信息;edu_level_code是學歷信息標號,方便提取。本科學歷對應標號4,碩士學歷對應標號3等等。
我們需要通過SQL查詢語句獲取並統計edu_level_code字段中各類學歷出現的次數。如圖是獲取學歷數據的SQL語句:

圖15 SQL語句之獲取學歷數據
4.1.2.4 獲取工作性質數據
在數據庫中,對應薪資的字段信息的字段是:emplType。emplType字段是工作性質,包括全職、校園、實習、兼職或臨時。使用SQL來統計出各類工作性質的數量,如下圖所示:

圖16 SQL語句之獲取工作性質數據
4.1.2.5 獲取工作經驗數據
在數據庫中,對應薪資的字段信息的字段是:workingExp_name,workingExp_code。workingExp_name字段是工作經驗,包括不限、無經驗、1年以下、1至3年、3至5年、5至10年、10年以上。workingExp_code字段是工作經驗標號,不限用-1標識、無經驗用0標識、1年以下用1標識,1至3年用103標識,以此類推。使用SQL語句統計出各類工作經驗的數量,如下圖所示:

圖17 SQL語句之獲取工作經驗數據
4.1.3 可視化實現
獲取到相關數據之后,下面就是最后一步的可視化實現,由於從數據庫獲取到的數據是字典類型(dict),我們先用x來等於字典全部的鍵,用y來等於字典全部的值。用python做可視化很簡單,使用plt.bar(x,y),就能得到一個直方圖,通過show()將圖展示出來,並使用savefig()將圖存儲成圖片。如下圖是可視化的部分代碼:

圖18 可視化部分代碼
4.2 數據展示與分析
可視化代碼完成並運行后,會得到五張圖片,下面展示這五張圖片並進行分析。
4.2.1 薪資待遇
可視化薪資效果如下:

圖19 薪資待遇可視化圖
根據上圖可以看到java的主要薪資分布在5k到15k之間,薪資待遇比一般的傳統行業要高一點,薪資10k以上職位大概占總職位的50%,做java想月薪過萬還是很有可行性的。
4.2.2 城市地區分布
由於城市太多,可視化之后看起來很不方便,選取了主流的12個城市,效果如圖所示:

圖20 職位城市分布情況
可以看到,java職位最多地還是北京其次是上海,再后面就是深圳,職位主要還是分布在一線城市,二線城市也有一定的崗位,但是相對來說還是少一點。
4.2.3 學歷要求
按學歷分包括:博士,碩士,本科,大專以及大專以下,由於有些崗位並沒有填要求或者沒有要求,就放在不限類中,效果如下圖所示:

圖21 學歷要求可視化圖
學歷要求主要是本科以上、和大專以上,各占一半左右,相對來說,做java學歷要求並不是很高,本科學歷已經滿足大部分需求。
4.2.4 工作性質
工作性質如下圖所示,包括全職、校園、實習、兼職或者臨時。

圖22 工作性質可視化圖
根據數據的可視化可以看到,公司在招聘java相關職位的時候,更多地希望是全職,校園招聘和實習相對來說少的多。
4.2.5 工作經驗

圖23 工作經驗可視化圖
就java 職位而言,有不少公司在招聘的時候並沒有設定經驗要求,而設定經驗要求的公司,更多是想招聘1至3年和3至5年的應聘者,而無經驗或者1年以下的需求就很少,所以剛畢業應屆生可能在找工作的並不是很輕松,但是還是有機會的。