摘要:實際上,前程無憂招聘網站上與數據有關的只有幾百頁,而我們爬取了頁的所有數據,因此在后面進行數據處理時需要把無關的數據剔除掉。
目錄
????????隨著科技的不斷進步與發展,數據呈現爆發式的增長,各行各業對于數據的依賴越來越強,與數據打交道在所難免,而社會對于“數據”方面的人才需求也在不斷增大。因此了解當下企業究竟需要招聘什么樣的人才?需要什么樣的技能?不管是對于在校生,還是對于求職者來說,都顯得十分必要。
? ? ? ? 對于一名小白來說,想要入門數據分析,首先要了解目前社會對于數據相關崗位的需求情況,基于這一問題,本文針對前程無憂招聘網站,利用python爬取了其全國范圍內大數據、數據分析、數據挖掘、機器學習、人工智能等與數據相關的崗位招聘信息。并通過Tableau可視化工具分析比較了不同行業的崗位薪資、用人需求等情況;以及不同行業、崗位的知識、技能要求等。
? ? ? ? ?可視化分析效果圖示例:
????????一級頁面如下:
????????二級頁面如下:
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以免觸發網站反爬機制。?
# 第一頁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循環語句即可構造自動翻頁。
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庫創建完畢")
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條件語句對其進行剔除。
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循環語句在服務器出現請求失敗時關閉模擬瀏覽器并進行重新請求。
????????在獲取了所需數據之后,可以看出數據較亂,并不利于我們進行分析,因此在分析前需要對數據進行預處理,得到規范格式的數據才可以用來最終做可視化數據展示。
? ? ? ? 獲取的數據截圖如下:
#導入相關庫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)
? ? ? ? 首先我們對“崗位名稱”的格式進行調整,將其中所有大寫英文字母統一轉換為小寫,例如將"Java"轉換為"java",然后對所有崗位做一個頻次統計,統計結果發現“崗位名稱”字段很雜亂,且存在很多與“數據”無關的崗位,因此要對數據做一個篩選。
df["崗位名稱"] = df["崗位名稱"].apply(lambda x:x.lower())counts = df["崗位名稱"].value_counts()
? ? ? ? 首先我們列出與“數據”崗位“有關的一系列關鍵詞,然后通過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]
? ? ? ? 基于前面對“崗位名稱”字段的統計情況,我們定義了目標崗位列表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("數據統計","數據分析"))
? ? ? ? 統一之后的“崗位名稱”如下圖所示:
?
? ? ? ? 對于“崗位薪資”字段的處理,重點在于對其單位格式轉換,在簡單觀察該字段后發現,其存在“萬/年”、“萬/月”、“千/月”等不同單位,因此需要對其做一個統一換算,將數據格式統一轉換為“元/月”,并根據最高工資與最低工資求出平均值。
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["單位"] = "元/月"
說明:首先我們對該字段進行統計預覽,之后做一個數據篩選剔除異常單位與空值記錄,再計算出每個字段的平均工資,接著定義一個函數,將格式換算為“元/月”,得到最終的“平均薪資”字段。
? ? ? ? 對于“公司規模”字段的處理較簡單,只需要定義一個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)
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")
#工作地點字段處理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())
? ? ? ? 我們針對清洗干凈后的數據另存為一個文檔,對源數據不做修改。
job_info.to_excel(r"E:/python爬蟲/前程無憂(已清洗).xlsx")
結論分析:從氣泡圖中可以看出,“數據”相關崗位數量較高的城市有:上海、深圳、廣州、北京、杭州、武漢等。
結論分析:通過條形圖可以看出,“數據”相關崗位用人需求達1000人以上的城市有15個,需求由高到低依次為:上海、深圳、廣州、北京、武漢、杭州、成都、南京、蘇州、無錫、西安、長沙、鄭州、重慶。其中上海用人需求高達10000人。
結論分析:從不同行業的用人需求與薪資對比可知,用人需求排名前4的行業分別:計算機軟件、互聯網、電子技術、計算機服務;平均薪資排名前4的行業分別為:互聯網、計算機軟件、通信、專業服務。可以發現,“數據”相關崗位在計算機領域需求大,薪資高,前景好。
結論分析:在發布的眾多崗位需求信息中,以民營公司為主,其崗位數量、用人需求極高,但薪資待遇一般,而上市公司的崗位數量一般,但薪資待遇好。
????????注:顏色深淺表示薪資高低,數字表示招聘人數
結論分析:根據突出顯示表可以發現,在學歷要求方面,大專與本科生需求量較大;經驗要求方面,3年以下相關經驗的崗位占大多數,而薪資方面,學歷越高,經驗越豐富則薪資越高。因此可以判斷數據分析行業還是一個較新興的行業,目前行業的基礎崗位較多,且具有豐富經驗的專家較少。
?結論分析:上圖通過列舉了傳統制造業、計算機相關行業以及服務業三個行業進行對比分析,三個行業對于“數據”相關崗位工作要求的共同點都是注重相關的行業經驗及數據處理等能力,而計算機相關行業對于技術如開發、數據庫、系統維護等編程能力要求較高,傳統制造業和服務行業則更側重于業務分析、管理、團隊合作綜合型能力等。
?
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")
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
摘要:直接抄其中一份的結論吧各地區招聘公司數量和平均待遇。可以看出不論是招聘公司的數據還是平均待遇水平主要都是北上廣深杭州占優勢。但事實證明,總是要有一些代價的。要學會看報錯信息。函數定義結束后需要按兩次回車重新回到提示符下。 又是寫在前面的亂七八糟 持續學習的第三天了,持續學習是一個不容易培養的好習慣,但是堅持就是勝利嘛~昨天因為一點點事情,所以沒能學習很長時間,今天要補回來。周末要搬家,...
摘要:成功爬取了拉鉤網上多個招聘崗位的具體信息后,數據可視化并得出分析結果如下從整體看,北上廣深杭這五個城市前端工程師招聘崗位,北京是遙遙領先,是深圳的兩倍,是廣州的三倍,其次到上海,深圳,杭州,廣州居末。 前前言 本文首發于 github blog 不想看爬蟲過程只想看職位錢途數據分析請看這里:前端招聘崗位分析C++招聘崗位分析JAVA招聘崗位分析PHP招聘崗位分析Python招聘崗位分析...
摘要:另外數學成為了一個關鍵詞,編程語言主要是等,運營也出現在詞云中說明數據分析師也需要有運營能力。 功能點 爬取數據 所有公司數據,名稱簡寫,城市,行業,職位數量,人數范圍,標簽,介紹,融資階段,平均工資 github2016年度最受歡迎編程語言相應年數薪水,城市,學歷要求,公司融資階段,公司行業 大數據行業五大崗位相應年數薪水,城市,學歷要求,公司融資階段,公司行業,崗位要求 編程語...
摘要:填寫自己對應的網頁更改相應數據的編碼格式遇到請求掛起當前任務,等操作完成執行之后的代碼,當協程掛起時,事件循環可以去執行其他任務。 前言 2012,一個卡牌,一個雷...
摘要:編程基礎要學習如何用進行數據分析,數據分析師建議第一步是要了解一些的編程基礎,知道的數據結構,什么是向量列表數組字典等等了解的各種函數及模塊。數據分析師認為數據分析有的工作都在處理數據。 showImg(https://segmentfault.com/img/bVbnbZo?w=1024&h=653); 本文為CDA數據分析研究院原創作品,轉載需授權 1.為什么選擇Python進行數...
閱讀 1318·2021-11-24 09:38
閱讀 3256·2021-11-22 12:03
閱讀 4156·2021-11-11 10:59
閱讀 2317·2021-09-28 09:36
閱讀 1031·2021-09-09 09:32
閱讀 3411·2021-08-05 10:00
閱讀 2527·2021-07-23 15:30
閱讀 2972·2019-08-30 13:12