標籤:gen chrome _id none 行業 資料處理 大資料時代 速度 方式
人工智慧的快速發展以及大資料時代的來臨,使得 Python 語言不僅在人工智慧領域大放異彩,在資料處理上也有著得天獨厚的優勢,在 Web 開發、網路編程、自動化營運、遊戲開發、金融等領域扮演著越來越重要的角色。
百度搜尋指數表明,2017 年 7 月份開始,Python 的搜尋指數已經超過了 Java。Python 語言的熱門由此可見一斑。
Python很容易學!小編有弄一個交流,互問互答,資源共用的交流學習基地,如果你也是Python的學習者或者大牛都歡迎你來!?:548+377+875!一起 學習共同進步!
本文中,筆者決定在拉勾網(一家為互連網從業者提供工作機會的招聘網站)上爬取相關 Python 職位資訊,對職位元據(薪酬、學曆要求、地區資訊、工作經驗等)進行圖形可視化分析。
01
前期準備
1、網頁分析
開啟拉勾網網站搜尋 Python,可以發現每頁有 15 條職位資訊資料,最多有 30 頁資料可以查看,共 450 條職位資訊。我們需要擷取的資訊包括:職位、公司名稱、薪酬範圍、所在地區、學曆要求、工作經驗、公司融資情況、公司人數、工作要求描述。
2、請求資料分析
通過 Chrome 瀏覽器訪問拉勾網,開啟 Console 控制台可以發現,當進行翻頁的時候,是通過 xhr 的請求方式請求的。通過觀察,我們可以發現,URL 裡面的 city 代表的是城市,post 參數 kd 代表的是搜尋的職位,pn 是 page number,表示頁碼。
3、職位列表JSON返回資料的分析擷取
通過 JSON 庫進行資料的解析,擷取相關資訊。需要注意的是,我們需要記得保留 positionID,用於下一步擷取工作描述資訊。
def get_lagou(page,city,kd):
url = "https://www.lagou.com/jobs/positionAjax.json"
querystring = {"px": "new", "city": city, "needAddtionalResult": "false", "isSchoolJob": "0"}
payload = "first=false&pn=" + str(page) + "&kd="+str(kd)
cookie = "JSESSIONID=" + get_uuid() + ";"
"user_trace_token=" + get_uuid() + "; LGUID=" + get_uuid() + "; index_location_city=%E6%88%90%E9%83%BD; "
"SEARCH_ID=" + get_uuid() + ‘; _gid=GA1.2.717841549.1514043316; ‘
‘_ga=GA1.2.952298646.1514043316; ‘
‘LGSID=‘ + get_uuid() + "; "
"LGRID=" + get_uuid() + "; "
headers = {‘cookie‘: cookie,‘origin‘: "https://www.lagou.com",‘x-anit-forge-code‘: "0",‘accept-encoding‘: "gzip, deflate, br",‘accept-language‘: "zh-CN,zh;q=0.8,en;q=0.6",‘user-agent‘: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",‘content-type‘: "application/x-www-form-urlencoded; charset=UTF-8",‘accept‘: "application/json, text/javascript, */*; q=0.01",‘referer‘: "https://www.lagou.com/jobs/list_Java?px=new&city=%E6%88%90%E9%83%BD",‘x-requested-with‘: "XMLHttpRequest",‘connection‘: "keep-alive",‘x-anit-forge-token‘: "None",‘cache-control‘: "no-cache",‘postman-token‘: "91beb456-8dd9-0390-a3a5-64ff3936fa63"}
response = requests.request("POST", url, data=payload.encode(‘utf-8‘), headers=headers, params=querystring)
# print(response.text)
hjson = json.loads(response.text)
for i in range(15):
positionName=hjson[‘content‘][‘positionResult‘][‘result‘][i][‘positionName‘]
companyId = hjson[‘content‘][‘positionResult‘][‘result‘][i][‘companyId‘]
positionId= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘positionId‘]
salary = hjson[‘content‘][‘positionResult‘][‘result‘][i][‘salary‘]
city= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘city‘]
district= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘district‘]
companyShortName= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘companyShortName‘]
education= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘education‘]
workYear= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘workYear‘]
industryField= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘industryField‘]
financeStage= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘financeStage‘]
companySize= hjson[‘content‘][‘positionResult‘][‘result‘][i][‘companySize‘]
job_desc = get_job_desc(positionId)
positionName_list.append(positionName)
salary_list.append(salary)
city_list.append(city)
district_list.append(district)
companyShortName_list.append(companyShortName)
education_list.append(education)
workYear_list.append(workYear)
industryField_list.append(industryField)
financeStage_list.append(financeStage)
companySize_list.append(companySize)
#job_desc_list.append(job_desc)
4、擷取工作資訊描述
通過觀察發現,開啟具體職位的詳細頁面時,URL 裡面的數值(例如的 URL 裡面的 4789029)就是職位的 positionID,該 positionID 可以通過上一步的職位列表 JSON 返回資料擷取。
通過 requests 請求頁面資訊,再通過 xpath 擷取工作描述資訊。
def get_job_desc(id):
url = "https://www.lagou.com/jobs/"+str(id)+".html"
cookie = "JSESSIONID=" + get_uuid() + ";"
"user_trace_token=" + get_uuid() + "; LGUID=" + get_uuid() + "; index_location_city=%E6%88%90%E9%83%BD; "
"SEARCH_ID=" + get_uuid() + ‘; _gid=GA1.2.717841549.1514043316; ‘
‘_ga=GA1.2.952298646.1514043316; ‘
‘LGSID=‘ + get_uuid() + "; "
"LGRID=" + get_uuid() + "; "
headers = {‘cookie‘: cookie,‘origin‘: "https://www.lagou.com",‘x-anit-forge-code‘: "0",‘accept-encoding‘: "gzip, deflate, br",‘accept-language‘: "zh-CN,zh;q=0.8,en;q=0.6",‘user-agent‘: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",‘content-type‘: "application/x-www-form-urlencoded; charset=UTF-8",‘accept‘: "application/json, text/javascript, */*; q=0.01",‘referer‘: "https://www.lagou.com/jobs/list_Java?px=new&city=%E6%88%90%E9%83%BD",‘x-requested-with‘: "XMLHttpRequest",‘connection‘: "keep-alive",‘x-anit-forge-token‘: "None",‘cache-control‘: "no-cache",‘postman-token‘: "91beb456-8dd9-0390-a3a5-64ff3936fa63"}
response = requests.request("GET", url, headers=headers)
x = etree.HTML(response.text)
data = x.xpath(‘//*[@id="job_detail"]/dd[2]/div/*/text()‘)
return ‘‘.join(data)
02
資料擷取 —— 爬蟲
1、設定 cookies 和 headers
如果不設定相關資訊,會不允許爬取,返回提示:“您操作太頻繁,請稍後再訪問”。所以,我們需要設定 headers 和 cookies 資訊。
def get_lagou(page,city,kd):
url = "https://www.lagou.com/jobs/positionAjax.json"
querystring = {"px": "new", "city": city, "needAddtionalResult": "false", "isSchoolJob": "0"}
payload = "first=false&pn=" + str(page) + "&kd="+str(kd)
cookie = "JSESSIONID=" + get_uuid() + ";"
"user_trace_token=" + get_uuid() + "; LGUID=" + get_uuid() + "; index_location_city=%E6%88%90%E9%83%BD; "
"SEARCH_ID=" + get_uuid() + ‘; _gid=GA1.2.717841549.1514043316; ‘
‘_ga=GA1.2.952298646.1514043316; ‘
‘LGSID=‘ + get_uuid() + "; "
"LGRID=" + get_uuid() + "; "
headers = {‘cookie‘: cookie,‘origin‘: "https://www.lagou.com",‘x-anit-forge-code‘: "0",‘accept-encoding‘: "gzip, deflate, br",‘accept-language‘: "zh-CN,zh;q=0.8,en;q=0.6",‘user-agent‘: "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",‘content-type‘: "application/x-www-form-urlencoded; charset=UTF-8",‘accept‘: "application/json, text/javascript, */*; q=0.01",‘referer‘: "https://www.lagou.com/jobs/list_Java?px=new&city=%E6%88%90%E9%83%BD",‘x-requested-with‘: "XMLHttpRequest",‘connection‘: "keep-alive",‘x-anit-forge-token‘: "None",‘cache-control‘: "no-cache",‘postman-token‘: "91beb456-8dd9-0390-a3a5-64ff3936fa63"}
2、延時設定和分頁爬取
避免爬取速度過快被封,設定延時時間為 3-5 秒。通過 for 迴圈進行分頁資料的爬取。
def main(pages,city,job):
for n in range(1, pages+1):
get_lagou(n,city,job)
time.sleep(round(random.uniform(3, 5), 2))
write_to_csv(city,job)
03
資料存放區與處理
1、CSV 資料存放區
由於資料量不大,最多 450 條資料,採用 CSV 的儲存方式。
2、資料處理
● 薪酬資料處理
後續統計月薪的佔比,由於薪酬範圍是可以自訂範圍,沒有一個統一的標準。例如薪酬可以是 10k-20k、5k-8k、11k-18k、10k-16k 等情況,後續不利於薪酬範圍的可視化,所以將薪酬歸納分類到這幾種:2k 以下、2k-5k、5k-10k、10k-15k、15k-25k、25k-50k、50k 以上。
假如薪酬為 10k-20k, 則認為在 10k-15k、15k-25k 這兩種歸類裡面都包含。採用Regex進行歸類匯總:
def salary_categorize(salarys):
dict = {‘2k以下‘: 0, ‘2k-5k‘: 0, ‘5k-10k‘: 0,‘10k-15k‘:0,‘15k-25k‘:0,‘25k-50k‘:0,‘50k以上‘:0}
for salary in salarys:
if re.match(‘^[0-1]k-*|.*-[0-1]k$‘,salary)!=None:
dict[‘2k以下‘] += 1
if re.match(‘^[2-4]k-*|.*-[2-4]k$‘,salary)!=None:
dict[‘2k-5k‘] += 1
if re.match(‘^[5-9]k-*|.*-[5-9]k$‘, salary)!=None:
dict[‘5k-10k‘] += 1
if re.match(‘^1[0-4]k-*|.*-1[0-4]k$‘, salary)!=None:
dict[‘10k-15k‘] += 1
if re.match(‘^1[5-9]k-*|^2[0-4]k-*|.*-1[5-9]k$|.*-2[0-4]k$‘, salary)!=None:
dict[‘15k-25k‘] += 1
if re.match(‘^2[5-9]k-*|^[3-4][0-9]k-*|.*-2[5-9]k$|.*-[3-4][0-9]k$‘, salary)!=None:
dict[‘25k-50k‘] += 1
if re.match(‘^[5-9][0-9]k-*|.*-[5-9][0-9]k$|^d{3,}k-*|.*-d{3,}k$‘, salary)!=None:
dict[‘50k以上‘] += 1
return dict
● 行業資訊處理
公司所屬行業可以是多個,一般以逗號分隔,但存在部分是以頓號和空格分隔的情況,還有可能存在沒有寫明相關行業的情況。對此,通過 Python 的 re 庫可以處理多個分隔字元分隔的資料,所屬行業為空白,則跳過。
def industryField_counts(csv_file):
industryFields = []
d = pd.read_csv(csv_file, engine=‘python‘, encoding=‘utf-8‘)
info = d[‘industryField‘]
for i in range(len(info)):
try:
data = re.split(‘[,、 ]‘,info[i])
except:
continue
for j in range(len(data)):
industryFields.append(data[j])
counts = Counter(industryFields)
return counts
04
資料視覺效果與解讀
1、公司相關情況分析
從行業情況和公司規模來看,移動互連網佔有 40% 的需求,資料服務+大資料+人工智慧佔了 10% 的比例。Python 非常強大,適合的領域包括 Web 開發、網路編程、爬蟲、雲端運算、人工智慧、自動化營運等,所以不管公司規模是大還是小,融資情況如何,都普遍需要 Python 相關的職位的人才。
2、城市需求分析
從分析,可以發現,需求量主要集中在中國三大經濟圈:京津冀,長三角,珠三角。主要分布在北京(40%)、上海(16%)、深圳(15%)、廣州(6%)、成都(6%)和杭州(6%)這 6 個城市。而北京的互連網創業氣氛冠絕中國,註冊在北京的互連網公司遠遠高於在其他城市的公司,需求量也是最大的。
3、薪酬與工作經驗分析
從工作經驗的要求來看,大部分集中在 3-5 年和 1-3 年這兩個區間,至於工作經驗和薪酬之間的相關性,觀察發現,1-3 年工作經驗的薪酬普遍在 15-25K,符合常態分佈的規律,3-5 年工作經驗的薪酬普遍在 15k-25k 和 25k-50k 這兩個區間,以 15k-25k 這個區間的居多。達到 5-10 年工作經驗的,薪酬在 25k-50K 這個區間的居多。
4、學曆要求和工作經驗分析
從學曆要求來看,大部分都要求至少本科以上,這部分佔了約 80% 的比例。所以不要在相信讀書無用論這種觀點了,學曆至少是工作的敲門磚。
工作經驗上,普遍要求是 1-5 年,這部分佔了 84% 的比例。1年以下和經驗不限的,佔了約 9%,5-10 年的佔了約 7% 的比例。
05
總結
TIOBE 8 月程式設計語言指數熱門排行榜已經公布了,排名前三的雖然依舊是 Java、C、C++。但 Python 非常接近 TIOBE 索引的前 3 位。Python 這樣的上漲趨勢,同樣可以在 TIOBE 索引排行中體現,互連網業界也開始普遍採用 Python。Python 程式設計語言最初是 Perl 的繼承者,用於編寫構建指令碼和各種粘合軟體。但後來逐漸進入其他領域。如今,在大型嵌入式系統中運行 Python 是很常見的。因此,Python 完全有可能進入前三名,甚至在未來取代 Java 成為新的第一名。
從目前 Python 的就業前景來看,總結如下:
● Python 就業情況樂觀,從 TIOBE 8 月程式設計語言指數熱門排行榜以及百度指數的搜尋數來看,Python 的受歡迎程度越來越高。
● 在中國地區,Python 相關職位的需求量,依然集中在三大經濟圈,特別是在北京、上海、深圳這幾個城市。從行業需求來看,主要集中在移動互連網、資料服務、大資料分析等行業。
● 從拉勾網的資料分析可知,大部分 Python 的相關職位都要求在本科和本科以上,工作經驗要求在 1-5 年的居多。因為 Python 在大資料和人工智慧領域的爆發性發展, 導致 Python 方向崗位的薪水在水漲船高,從資料分析來看,月薪在 10K-50K 不等。
都說 Python 趕超 Java,爬取拉勾網資料發現它的薪資已高至 50K