国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

前程無憂崗位數據爬取+Tableau可視化分析

233jl / 2316人閱讀

摘要:實際上,前程無憂招聘網站上與數據有關的只有幾百頁,而我們爬取了頁的所有數據,因此在后面進行數據處理時需要把無關的數據剔除掉。

目錄

一、項目背景

二、數據爬取

1、相關庫的導入與說明

2、獲取二級頁面鏈接

1)分析一級頁面url特征

2)構建一級url庫

3)爬取所有二級url鏈接

3、獲取崗位信息并保存

三、數據清洗

1、數據讀取、去重、空值處理

1)相關庫導入及數據讀取

2)數據去重與控制處理

2、“崗位名稱”字段預處理

1)”崗位名稱“字段預覽

2)構建關鍵詞,篩選名稱

3)崗位名稱標準化處理

3、“崗位薪資”字段預處理

4、“公司規模”字段預處理

5、“職位信息”字段預處理

6、其它字段預處理

7、數據存儲

四、Tableau數據可視化展示

1、崗位數量城市分布氣泡圖

2、熱門城市用人需求Top15

?3、用人需求Top15行業及其薪資情況

4、各類型企業崗位需求樹狀分布圖

5、經驗學歷與薪資需求突出顯示表?

6、不同行業知識、技能要求詞云圖

1)傳統制造業

2) 計算機相關行業

3)服務行業?

6、崗位數量與薪資水平地理分布

7、可視化看板最終展示結果

五、源代碼

1、爬蟲源代碼

2、數據預處理源碼


一、項目背景

????????隨著科技的不斷進步與發展,數據呈現爆發式的增長,各行各業對于數據的依賴越來越強,與數據打交道在所難免,而社會對于“數據”方面的人才需求也在不斷增大。因此了解當下企業究竟需要招聘什么樣的人才?需要什么樣的技能?不管是對于在校生,還是對于求職者來說,都顯得十分必要。
? ? ? ? 對于一名小白來說,想要入門數據分析,首先要了解目前社會對于數據相關崗位的需求情況,基于這一問題,本文針對前程無憂招聘網站,利用python爬取了其全國范圍內大數據、數據分析、數據挖掘、機器學習、人工智能等與數據相關的崗位招聘信息。并通過Tableau可視化工具分析比較了不同行業的崗位薪資、用人需求等情況;以及不同行業、崗位的知識、技能要求等。

? ? ? ? ?可視化分析效果圖示例:

二、數據爬取

  • 爬取字段:崗位名稱、公司名稱、薪資水平、工作經驗、學歷需求、工作地點、招聘人數、發布時間、公司類型、公司規模、行業領域、福利待遇、職位信息;
  • 說明:在前程無憂招聘網站中,我們在搜索框中輸入“數據”兩個字進行搜索發現,共有2000個一級頁面,其中每個頁面包含50條崗位信息,因此總共有約100000條招聘信息。當點擊一級頁面中每個崗位信息時,頁面會跳轉至相應崗位的二級頁面,二級頁面中即包含我們所需要的全部字段信息;

????????一級頁面如下:

????????二級頁面如下:

  • 爬取思路:先針對一級頁面爬取所有崗位對應的二級頁面鏈接,再根據二級頁面鏈接遍歷爬取相應崗位信息;
  • 開發環境:python3、Spyder

1、相關庫的導入與說明

import jsonimport requestsimport pandas as pdfrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom lxml import etreefrom selenium.webdriver import ChromeOptions

? ? ? ? 由于前程無憂招聘網站的反爬機制較強,采用動態渲染+限制ip訪問頻率等多層反爬,因此在獲取二級頁面鏈接時需借助json進行解析,本文對于二級頁面崗位信息的獲取采用selenium模擬瀏覽器爬取,同時通過代理IP的方式,每隔一段時間換一次請求IP以免觸發網站反爬機制。?

2、獲取二級頁面鏈接

1)分析一級頁面url特征

# 第一頁URL的特征"https://search.51job.com/list/000000,000000,0000,00,9,99,數據,2,1.html?"# 第二頁URL的特征"https://search.51job.com/list/000000,000000,0000,00,9,99,數據,2,2.html?"# 第三頁URL的特征"https://search.51job.com/list/000000,000000,0000,00,9,99,數據,2,3.html?"

? ? ? ? 通過觀察不同頁面的URL可以發現,不同頁面的URL鏈接只有“.html”前面的數字不同,該數字正好代表該頁的頁碼?,因此只需要構造字符串拼接,然后通過for循環語句即可構造自動翻頁。

2)構建一級url庫

url1 = []for i in range(2000):    url_pre = "https://search.51job.com/list/000000,000000,0000,00,9,99,數據,2,%s" % (1+i) #設置自動翻頁       url_end = ".html?"    url_all = url_pre + url_end    url1.append(url_all)print("一級URL庫創建完畢")

3)爬取所有二級url鏈接

url2 = []j = 0for url in url1:    j += 1    re1 = requests.get(url , headers = headers,proxies= {"http":"tps131.kdlapi.com:15818"},timeout=(5,10))  #通過proxies設置代理ip    html1 = etree.HTML(re1.text)        divs = html1.xpath("http://script[@type = "text/javascript"]/text()")[0].replace("window.__SEARCH_RESULT__ = ","")        js = json.loads(divs)    for i in range(len(js["engine_jds"])):        if js["engine_jds"][i]["job_href"][0:22] == "https://jobs.51job.com":            url2.append(js["engine_jds"][i]["job_href"])        else:            print("url異常,棄用")  #剔除異常url    print("已爬取"+str(j)+"頁")print("成功爬取"+str(len(url2))+"條二級URL")

注意:爬取二級URL鏈接時發現并非爬取的所有鏈接都是規范的,會存在少部分異常URL,這會對后續崗位信息的爬取造成干擾,因此需要利用if條件語句對其進行剔除。

3、獲取崗位信息并保存

option = ChromeOptions()option.add_experimental_option("excludeSwitches", ["enable-automation"])option.add_argument("--proxy-server=http://tps131.kdlapi.com:15818")  #設置代理ipdriver = webdriver.Chrome(options=option)for url in url2:    co = 1    while co == 1:        try:            driver.get(url)            wait = WebDriverWait(driver,10,0.5)            wait.until(EC.presence_of_element_located((By.ID,"topIndex")))        except:            driver.close()            driver = webdriver.Chrome(options=option)            co = 1        else:            co = 0    try:        福利待遇 = driver.find_elements_by_xpath("http://div[@class = "t1"]")[0].text         崗位名稱 = driver.find_element_by_xpath("http://div[@class = "cn"]/h1").text        薪資水平 = driver.find_element_by_xpath("http://div[@class = "cn"]/strong").text        職位信息 = driver.find_elements_by_xpath("http://div[@class = "bmsg job_msg inbox"]")[0].text        公司類型 = driver.find_elements_by_xpath("http://div[@class = "com_tag"]/p")[0].text        公司規模 = driver.find_elements_by_xpath("http://div[@class = "com_tag"]/p")[1].text        公司領域 = driver.find_elements_by_xpath("http://div[@class = "com_tag"]/p")[2].text        公司名稱 = driver.find_element_by_xpath("http://div[@class = "com_msg"]/a/p").text        工作地點 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[0]        工作經驗 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[1]        學歷要求 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[2]        招聘人數 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[3]        發布時間 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[4]    except:        福利待遇 = "nan"         崗位名稱 = "nan"        薪資水平 = "nan"        職位信息 = "nan"        公司類型 = "nan"        公司規模 = "nan"        公司領域 = "nan"        公司名稱 = "nan"        工作地點 = "nan"        工作經驗 = "nan"        學歷要求 = "nan"        招聘人數 = "nan"        發布時間 = "nan"        print("信息提取異常,棄用")    finally:             info = {                "崗位名稱" : 崗位名稱,            "公司名稱" : 公司名稱,            "薪資水平" : 薪資水平,            "工作經驗" : 工作經驗,            "學歷要求" : 學歷要求,            "工作地點" : 工作地點,            "招聘人數" : 招聘人數,            "發布時間" : 發布時間,            "公司類型" : 公司類型,            "公司規模" : 公司規模,            "公司領域" : 公司領域,            "福利待遇" : 福利待遇,            "職位信息" : 職位信息            }        jobs_info.append(info)df = pd.DataFrame(jobs_info)df.to_excel(r"E:/python爬蟲/前程無憂招聘信息.xlsx") 

? ? ? ? 在爬取并剔除異常數據之后,最終得到了90000多條完整的數據做分析,但經過觀察發現,所爬取的數據并非全都與“數據”崗位相關聯。實際上,前程無憂招聘網站上與“數據”有關的只有幾百頁,而我們爬取了2000頁的所有數據,因此在后面進行數據處理時需要把無關的數據剔除掉。在爬取前根據對代碼的測試發現,有些崗位字段在進行爬取時會出現錯位,從而導致數據存儲失敗,為了不影響后面代碼的執行,這里設置了“try-except”進行異常處理,同時使用while循環語句在服務器出現請求失敗時關閉模擬瀏覽器并進行重新請求。

三、數據清洗

1、數據讀取、去重、空值處理

????????在獲取了所需數據之后,可以看出數據較亂,并不利于我們進行分析,因此在分析前需要對數據進行預處理,得到規范格式的數據才可以用來最終做可視化數據展示。

? ? ? ? 獲取的數據截圖如下:

1)相關庫導入及數據讀取

#導入相關庫import pandas as pdimport numpy as npimport jieba#讀取數據df = pd.read_excel(r"E:/python爬蟲/前程無憂招聘信息.xlsx",index_col=0)

2)數據去重與控制處理

  • 對于重復值的定義,我們認為一個記錄的公司名稱和崗位名稱一致時,即可看作是重復值。因此利用drop_duplicates()函數剔除所有公司名稱和崗位名稱相同的記錄并保留第一個記錄。
  • 對于空值處理,只刪除所有字段信息都為nan的記錄。
#去除重復數據df.drop_duplicates(subset=["公司名稱","崗位名稱"],inplace=True)#空值刪除df[df["公司名稱"].isnull()]df.dropna(how="all",inplace=True)

2、“崗位名稱”字段預處理

1)”崗位名稱“字段預覽

? ? ? ? 首先我們對“崗位名稱”的格式進行調整,將其中所有大寫英文字母統一轉換為小寫,例如將"Java"轉換為"java",然后對所有崗位做一個頻次統計,統計結果發現“崗位名稱”字段很雜亂,且存在很多與“數據”無關的崗位,因此要對數據做一個篩選。

df["崗位名稱"] = df["崗位名稱"].apply(lambda x:x.lower())counts = df["崗位名稱"].value_counts() 

2)構建關鍵詞,篩選名稱

? ? ? ? 首先我們列出與“數據”崗位“有關的一系列關鍵詞,然后通過count()與for語句對所有記錄進行統計判斷,如果包含任一關鍵詞則保留該記錄,如果不包含則刪除該字段。

#構建目標關鍵詞target_job = ["算法","開發","分析","工程師","數據","運營","運維","it","倉庫","統計"]#篩選目標數據index = [df["崗位名稱"].str.count(i) for i in target_job]index = np.array(index).sum(axis=0) > 0job_info = df[index]

3)崗位名稱標準化處理

? ? ? ? 基于前面對“崗位名稱”字段的統計情況,我們定義了目標崗位列表job_list,用來替換統一相近的崗位名稱,之后,我們將“數據專員”、“數據統計”統一歸為“數據分析”。

job_list = ["數據分析","數據統計","數據專員","數據挖掘","算法","大數據","開發工程師","運營",            "軟件工程","前端開發","深度學習","ai","數據庫","倉庫管理","數據產品","客服",            "java",".net","andrio","人工智能","c++","數據管理","測試","運維","數據工程師"]job_list = np.array(job_list)def Rename(x,job_list=job_list):    index = [i in x for i in job_list]    if sum(index) > 0:        return job_list[index][0]    else:        return xjob_info["崗位名稱"] = job_info["崗位名稱"].apply(Rename)job_info["崗位名稱"] = job_info["崗位名稱"].apply(lambda x:x.replace("數據專員","數據分析"))job_info["崗位名稱"] = job_info["崗位名稱"].apply(lambda x:x.replace("數據統計","數據分析"))

? ? ? ? 統一之后的“崗位名稱”如下圖所示:

?

3、“崗位薪資”字段預處理

? ? ? ? 對于“崗位薪資”字段的處理,重點在于對其單位格式轉換,在簡單觀察該字段后發現,其存在“萬/年”、“萬/月”、“千/月”等不同單位,因此需要對其做一個統一換算,將數據格式統一轉換為“元/月”,并根據最高工資與最低工資求出平均值。

job_info["崗位薪資"].value_counts()#剔除異常數據index1 = job_info["崗位薪資"].str[-1].isin(["年","月"])index2 = job_info["崗位薪資"].str[-3].isin(["萬","千"])job_info = job_info[index1 & index2]#計算平均工資job_info["平均薪資"] = job_info["崗位薪資"].astype(str).apply(lambda x:np.array(x[:-3].split("-"),dtype=float))job_info["平均薪資"] = job_info["平均薪資"].apply(lambda x:np.mean(x))#統一工資單位job_info["單位"] = job_info["崗位薪資"].apply(lambda x:x[-3:])def con_unit(x):    if x["單位"] == "萬/月":        z = x["平均薪資"]*10000    elif x["單位"] == "千/月":        z = x["平均薪資"]*1000    elif x["單位"] == "萬/年":        z = x["平均薪資"]/12*10000    return int(z)job_info["平均薪資"] = job_info.apply(con_unit,axis=1)job_info["單位"] = "元/月"

說明:首先我們對該字段進行統計預覽,之后做一個數據篩選剔除異常單位與空值記錄,再計算出每個字段的平均工資,接著定義一個函數,將格式換算為“元/月”,得到最終的“平均薪資”字段。

4、“公司規模”字段預處理

? ? ? ? 對于“公司規模”字段的處理較簡單,只需要定義一個if條件語句將其格式做一個轉換即可。

job_info["公司規模"].value_counts()def func(x):    if x == "少于50人":        return "<50"    elif x == "50-150人":        return "50-150"    elif x == "150-500人":        return "150-500"    elif x == "500-1000人":        return "500-1000"    elif x == "1000-5000人":        return "1000-5000"    elif x == "5000-10000人":        return "5000-10000"    elif x == "10000人以上":        return ">10000"    else:        return np.nanjob_info["公司規模"] = job_info["公司規模"].apply(func)

5、“職位信息”字段預處理

job_info["職位信息"] = job_info["職位信息"].apply(lambda x:x.split("職能類別")[0])with open(r"E:/python爬蟲/數據處理/停用詞表.txt","r",encoding = "utf8") as f:    stopword = f.read()stopword = stopword.split()#對“職業信息”字段進行簡單處理,去除無意義的文字,構造jieba分詞job_info["職位信息"] = job_info["職位信息"].apply(lambda x:x.lower()).apply(lambda x:"".join(x)).apply(lambda x:x.strip()).apply(jieba.lcut).apply(lambda x:[i for i in x if i not in stopword])#按照行業進行分類,求出每一個行業下各關鍵詞的詞頻統計,以便于后期做詞云圖cons = job_info["公司領域"].value_counts()industries = pd.DataFrame(cons.index,columns=["行業領域"])industry = pd.DataFrame(columns=["分詞明細","行業領域"])for i in industries["行業領域"]:    words = []    word = job_info["職位信息"][job_info["公司領域"] == i]    word.dropna(inplace=True)    [words.extend(str(z).strip("/"[]").split("/", /"")) for z in word]    df1 = pd.DataFrame({"分詞明細":words,                        "行業領域":i})    industry = industry.append(df1,ignore_index=True)industry = industry[industry["分詞明細"] != "http://n"]industry = industry[industry["分詞明細"] != ""]#剔除詞頻小于300的關鍵詞count = pd.DataFrame(industry["分詞明細"].value_counts())lst = list(count[count["分詞明細"] >=300].index)industry = industry[industry["分詞明細"].isin(lst)]#數據存儲industry.to_excel(r"E:/python爬蟲/數據處理/詞云.xlsx")   

6、其它字段預處理

  • “工作地點”字段:該字段有”市-區“和”市“兩種格式,如”廣州-天河“與”廣州“,因此需要統一轉換為”市“的格式;
  • “公司領域”字段:每個公司的行業字段可能會有多個行業標簽,我們默認以第一個作為改公司的行業標簽;
  • “招聘人數”字段:由于某些公司崗位沒有具體招聘人數,因此我們默認以最低需求為標準,將“招若干人”改為“招1人”,以便于后面統計分析;
  • 其它字段:對于其他幾個字段格式只存在一些字符串空格問題,因此只需要對其進行去除空格即可。
#工作地點字段處理job_info["工作地點"] = job_info["工作地點"].apply(lambda x:x.split("-")[0])#公司領域字段處理job_info["公司領域"] = job_info["公司領域"].apply(lambda x:x.split("/")[0])a = job_info["公司領域"].value_counts()#招聘人數字段處理job_info["招聘人數"] = job_info["招聘人數"].apply(lambda x:x.replace("若干","1").strip()[1:-1])#工作經驗與學歷要求字段處理job_info["工作經驗"] = job_info["工作經驗"].apply(lambda x:x.replace("無需","1年以下").strip()[:-2])job_info["學歷需求"] = job_info["學歷需求"].apply(lambda x:x.split()[0])#公司福利字段處理job_info["公司福利"] = job_info["公司福利"].apply(lambda x:str(x).split())

7、數據存儲

? ? ? ? 我們針對清洗干凈后的數據另存為一個文檔,對源數據不做修改。

job_info.to_excel(r"E:/python爬蟲/前程無憂(已清洗).xlsx")

四、Tableau數據可視化展示

1、崗位數量城市分布氣泡圖

結論分析:從氣泡圖中可以看出,“數據”相關崗位數量較高的城市有:上海、深圳、廣州、北京、杭州、武漢等。

2、熱門城市用人需求Top15

結論分析:通過條形圖可以看出,“數據”相關崗位用人需求達1000人以上的城市有15個,需求由高到低依次為:上海、深圳、廣州、北京、武漢、杭州、成都、南京、蘇州、無錫、西安、長沙、鄭州、重慶。其中上海用人需求高達10000人。

?3、用人需求Top15行業及其薪資情況

結論分析:從不同行業的用人需求與薪資對比可知,用人需求排名前4的行業分別:計算機軟件、互聯網、電子技術、計算機服務;平均薪資排名前4的行業分別為:互聯網、計算機軟件、通信、專業服務。可以發現,“數據”相關崗位在計算機領域需求大,薪資高,前景好。

4、各類型企業崗位需求樹狀分布圖

結論分析:在發布的眾多崗位需求信息中,以民營公司為主,其崗位數量、用人需求極高,但薪資待遇一般,而上市公司的崗位數量一般,但薪資待遇好。

5、經驗學歷與薪資需求突出顯示表?

????????注:顏色深淺表示薪資高低,數字表示招聘人數

結論分析:根據突出顯示表可以發現,在學歷要求方面,大專與本科生需求量較大;經驗要求方面,3年以下相關經驗的崗位占大多數,而薪資方面,學歷越高,經驗越豐富則薪資越高。因此可以判斷數據分析行業還是一個較新興的行業,目前行業的基礎崗位較多,且具有豐富經驗的專家較少。

6、不同行業知識、技能要求詞云圖

1)傳統制造業

2) 計算機相關行業

3)服務行業

?結論分析:上圖通過列舉了傳統制造業、計算機相關行業以及服務業三個行業進行對比分析,三個行業對于“數據”相關崗位工作要求的共同點都是注重相關的行業經驗及數據處理等能力,而計算機相關行業對于技術如開發、數據庫、系統維護等編程能力要求較高,傳統制造業和服務行業則更側重于業務分析、管理、團隊合作綜合型能力等。

6、崗位數量與薪資水平地理分布

7、可視化看板最終展示結果

?

五、源代碼

1、爬蟲源代碼

import jsonimport requestsimport pandas as pdfrom lxml import etreefrom selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver import ChromeOptionsfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECurl1 = []url2 = []jobs_info = []for i in range(2000):    url_pre = "https://search.51job.com/list/000000,000000,0000,00,9,99,數據,2,%s" % (1+i)    #頁面跳轉    url_end = ".html?"    url_all = url_pre + url_end    url1.append(url_all)print("一級URL庫創建完畢")#從json中提取數據并加載headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36",           "Connection": "close",           "Host": "search.51job.com"}j = 0for url in url1:    j += 1    re1 = requests.get(url , headers = headers,proxies= {"http":"tps131.kdlapi.com:15818"},timeout=(5,10))    html1 = etree.HTML(re1.text)        divs = html1.xpath("http://script[@type = "text/javascript"]/text()")[0].replace("window.__SEARCH_RESULT__ = ","")        js = json.loads(divs)    for i in range(len(js["engine_jds"])):        if js["engine_jds"][i]["job_href"][0:22] == "https://jobs.51job.com":            url2.append(js["engine_jds"][i]["job_href"])        else:            print("url異常,棄用")    print("已解析"+str(j)+"頁")print("成功提取"+str(len(url2))+"條二級URL")#爬取崗位數據option = ChromeOptions()option.add_experimental_option("excludeSwitches", ["enable-automation"])option.add_argument("--proxy-server=http://tps131.kdlapi.com:15818") driver = webdriver.Chrome(options=option)for url in url2:    co = 1    while co == 1:        try:             #設置IP代理            driver.get(url)            wait = WebDriverWait(driver,10,0.5)            wait.until(EC.presence_of_element_located((By.ID,"topIndex")))        except:            driver.close()            driver = webdriver.Chrome(options=option)            co = 1        else:            co = 0    try:        福利待遇 = driver.find_elements_by_xpath("http://div[@class = "t1"]")[0].text         崗位名稱 = driver.find_element_by_xpath("http://div[@class = "cn"]/h1").text        薪資水平 = driver.find_element_by_xpath("http://div[@class = "cn"]/strong").text        職位信息 = driver.find_elements_by_xpath("http://div[@class = "bmsg job_msg inbox"]")[0].text        公司類型 = driver.find_elements_by_xpath("http://div[@class = "com_tag"]/p")[0].text        公司規模 = driver.find_elements_by_xpath("http://div[@class = "com_tag"]/p")[1].text        公司領域 = driver.find_elements_by_xpath("http://div[@class = "com_tag"]/p")[2].text        公司名稱 = driver.find_element_by_xpath("http://div[@class = "com_msg"]/a/p").text        工作地點 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[0]        工作經驗 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[1]        學歷要求 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[2]        招聘人數 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[3]        發布時間 = driver.find_elements_by_xpath("http://div[@class = "cn"]//p[@class = "msg ltype"]")[0].text.split("|")[4]    except:        福利待遇 = "nan"         崗位名稱 = "nan"        薪資水平 = "nan"        職位信息 = "nan"        公司類型 = "nan"        公司規模 = "nan"        公司領域 = "nan"        公司名稱 = "nan"        工作地點 = "nan"        工作經驗 = "nan"        學歷要求 = "nan"        招聘人數 = "nan"        發布時間 = "nan"        print("信息提取異常,棄用")    finally:             info = {                "崗位名稱" : 崗位名稱,            "公司名稱" : 公司名稱,            "薪資水平" : 薪資水平,            "工作經驗" : 工作經驗,            "學歷要求" : 學歷要求,            "工作地點" : 工作地點,            "招聘人數" : 招聘人數,            "發布時間" : 發布時間,            "公司類型" : 公司類型,            "公司規模" : 公司規模,            "公司領域" : 公司領域,            "福利待遇" : 福利待遇,            "職位信息" : 職位信息            }        jobs_info.append(info)df = pd.DataFrame(jobs_info)df.to_excel(r"E:/python爬蟲/前程無憂招聘信息.xlsx") 

2、數據預處理源碼

import pandas as pdimport numpy as npimport jieba#數據讀取df = pd.read_excel(r"E:/python爬蟲/前程無憂招聘信息.xlsx",index_col=0)#數據去重與空值處理df.drop_duplicates(subset=["公司名稱","崗位名稱"],inplace=True)df[df["招聘人數"].isnull()]df.dropna(how="all",inplace=True)#崗位名稱字段處理df["崗位名稱"] = df["崗位名稱"].apply(lambda x:x.lower())counts = df["崗位名稱"].value_counts() target_job = ["算法","開發","分析","工程師","數據","運營","運維","it","倉庫","統計"]index = [df["崗位名稱"].str.count(i) for i in target_job]index = np.array(index).sum(axis=0) > 0job_info = df[index]job_list = ["數據分析","數據統計","數據專員","數據挖掘","算法","大數據","開發工程師",            "運營","軟件工程","前端開發","深度學習","ai","數據庫","倉庫管理","數據產品",            "客服","java",".net","andrio","人工智能","c++","數據管理","測試","運維","數據工程師"]job_list = np.array(job_list)def Rename(x,job_list=job_list):    index = [i in x for i in job_list]    if sum(index) > 0:        return job_list[index][0]    else:        return xjob_info["崗位名稱"] = job_info["崗位名稱"].apply(Rename)job_info["崗位名稱"] = job_info["崗位名稱"].apply(lambda x:x.replace("數據專員","數據分析"))job_info["崗位名稱"] = job_info["崗位名稱"].apply(lambda x:x.replace("數據統計","數據分析"))#崗位薪資字段處理index1 = job_info["崗位薪資"].str[-1].isin(["年","月"])index2 = job_info["崗位薪資"].str[-3].isin(["萬","千"])job_info = job_info[index1 & index2]job_info["平均薪資"] = job_info["崗位薪資"].astype(str).apply(lambda x:np.array(x[:-3].split("-"),dtype=float))job_info["平均薪資"] = job_info["平均薪資"].apply(lambda x:np.mean(x))#統一工資單位job_info["單位"] = job_info["崗位薪資"].apply(lambda x:x[-3:])job_info["公司領域"].value_counts()def con_unit(x):    if x["單位"] == "萬/月":        z = x["平均薪資"]*10000    elif x["單位"] == "千/月":        z = x["平均薪資"]*1000    elif x["單位"] == "萬/年":        z = x["平均薪資"]/12*10000    return int(z)job_info["平均薪資"] = job_info.apply(con_unit,axis=1)job_info["單位"] = "元/月"#工作地點字段處理job_info["工作地點"] = job_info["工作地點"].apply(lambda x:x.split("-")[0])#公司領域字段處理job_info["公司領域"] = job_info["公司領域"].apply(lambda x:x.split("/")[0])#招聘人數字段處理job_info["招聘人數"] = job_info["招聘人數"].apply(lambda x:x.replace("若干","1").strip()[1:-1])#工作經驗與學歷要求字段處理job_info["工作經驗"] = job_info["工作經驗"].apply(lambda x:x.replace("無需","1年以下").strip()[:-2])job_info["學歷需求"] = job_info["學歷需求"].apply(lambda x:x.split()[0])#公司規模字段處理job_info["公司規模"].value_counts()def func(x):    if x == "少于50人":        return "<50"    elif x == "50-150人":        return "50-150"    elif x == "150-500人":        return "150-500"    elif x == "500-1000人":        return "500-1000"    elif x == "1000-5000人":        return "1000-5000"    elif x == "5000-10000人":        return "5000-10000"    elif x == "10000人以上":        return ">10000"    else:        return np.nanjob_info["公司規模"] = job_info["公司規模"].apply(func)#公司福利字段處理job_info["公司福利"] = job_info["公司福利"].apply(lambda x:str(x).split())#職位信息字段處理job_info["職位信息"] = job_info["職位信息"].apply(lambda x:x.split("職能類別")[0])with open(r"E:/C++/停用詞表.txt","r",encoding = "utf8") as f:    stopword = f.read()stopword = stopword.split()job_info["職位信息"] = job_info["職位信息"].apply(lambda x:x.lower()).apply(lambda x:"".join(x)).apply(lambda x:x.strip()).apply(jieba.lcut).apply(lambda x:[i for i in x if i not in stopword])cons = job_info["公司領域"].value_counts()industries = pd.DataFrame(cons.index,columns=["行業領域"])industry = pd.DataFrame(columns=["分詞明細","行業領域"])for i in industries["行業領域"]:    words = []    word = job_info["職位信息"][job_info["公司領域"] == i]    word.dropna(inplace=True)    [words.extend(str(z).strip("/"[]").split("/", /"")) for z in word]    df1 = pd.DataFrame({"分詞明細":words,                        "行業領域":i})    industry = industry.append(df1,ignore_index=True)industry = industry[industry["分詞明細"] != "http://n"]industry = industry[industry["分詞明細"] != ""]count = pd.DataFrame(industry["分詞明細"].value_counts())lst = list(count[count["分詞明細"] >=300].index)industry = industry[industry["分詞明細"].isin(lst)]#數據存儲industry.to_excel(r"E:/python爬蟲/數據預處理/詞云.xlsx")       job_info.to_excel(r"E:/python爬蟲/數據預處理/前程無憂(已清洗).xlsx")

?

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121420.html

相關文章

  • 小李飛刀:ppppppython是需要好好學習的

    摘要:直接抄其中一份的結論吧各地區招聘公司數量和平均待遇。可以看出不論是招聘公司的數據還是平均待遇水平主要都是北上廣深杭州占優勢。但事實證明,總是要有一些代價的。要學會看報錯信息。函數定義結束后需要按兩次回車重新回到提示符下。 又是寫在前面的亂七八糟 持續學習的第三天了,持續學習是一個不容易培養的好習慣,但是堅持就是勝利嘛~昨天因為一點點事情,所以沒能學習很長時間,今天要補回來。周末要搬家,...

    Simon 評論0 收藏0
  • node.js 爬取招聘信息分析各職業錢途(爬蟲+動態IP代理+數據視化分析

    摘要:成功爬取了拉鉤網上多個招聘崗位的具體信息后,數據可視化并得出分析結果如下從整體看,北上廣深杭這五個城市前端工程師招聘崗位,北京是遙遙領先,是深圳的兩倍,是廣州的三倍,其次到上海,深圳,杭州,廣州居末。 前前言 本文首發于 github blog 不想看爬蟲過程只想看職位錢途數據分析請看這里:前端招聘崗位分析C++招聘崗位分析JAVA招聘崗位分析PHP招聘崗位分析Python招聘崗位分析...

    546669204 評論0 收藏0
  • 拉勾數據崗位和熱門編程語言現狀分析

    摘要:另外數學成為了一個關鍵詞,編程語言主要是等,運營也出現在詞云中說明數據分析師也需要有運營能力。 功能點 爬取數據 所有公司數據,名稱簡寫,城市,行業,職位數量,人數范圍,標簽,介紹,融資階段,平均工資 github2016年度最受歡迎編程語言相應年數薪水,城市,學歷要求,公司融資階段,公司行業 大數據行業五大崗位相應年數薪水,城市,學歷要求,公司融資階段,公司行業,崗位要求 編程語...

    atinosun 評論0 收藏0
  • EDG奪冠,Python分析一波B站評論,總結:EDG,nb

    摘要:填寫自己對應的網頁更改相應數據的編碼格式遇到請求掛起當前任務,等操作完成執行之后的代碼,當協程掛起時,事件循環可以去執行其他任務。 前言 2012,一個卡牌,一個雷...

    seasonley 評論0 收藏0
  • 如何用Python進行數據分析

    摘要:編程基礎要學習如何用進行數據分析,數據分析師建議第一步是要了解一些的編程基礎,知道的數據結構,什么是向量列表數組字典等等了解的各種函數及模塊。數據分析師認為數據分析有的工作都在處理數據。 showImg(https://segmentfault.com/img/bVbnbZo?w=1024&h=653); 本文為CDA數據分析研究院原創作品,轉載需授權 1.為什么選擇Python進行數...

    lifefriend_007 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<