python爬取前程無憂和拉勾資料分析崗位並分析

lanyu發表於2021-09-09

一、明確需求

分析資料分析崗位的招聘情況,包括地區分佈、薪資水平、職位要求等,瞭解最新資料分析崗位的情況。

環境:python 3.6

設計的工具:Tableau工具(主要是生成圖方便,用matplotlib也可以達到同樣的效果)

二、資料採集

 首先編寫爬蟲,這裡主要是爬取前程無憂和拉勾網,直接上前程無憂的程式碼:

關於前程無憂爬蟲程式碼,網上有很多教程,不過大部分只取了地區、職位、工資和日期這幾個欄位,沒有涉及到崗位要求和崗位職責,因為要了解職位的需求以及後面方便畫詞雲,我就自己寫了一個程式碼。說一下拉勾和前程無憂兩者的區別,前程無憂爬了2000頁,不過大概只有前24頁是跟資料分析有關的崗位,拉勾網的資料量比較少,全國主要城市爬下來,一共也才2000多條,而且基本集中在北京上海杭州。調整一下前程無憂爬蟲格式跟拉勾一樣,把兩個表格合併起來一起分析。

# -*- coding:utf-8 -*-
import urllib
import re,codecs
import time,random
import requests
from lxml import html
from urllib import parse

key='資料分析'
key=parse.quote(parse.quote(key))
headers={'Host':'search.51job.com',
        'Upgrade-Insecure-Requests':'1',
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
def get_links(page):
    url =''+key+',2,'+ str(page)+'.html'
    r= requests.get(url,headers,timeout=10)
    s=requests.session()
    s.keep_alive = False
    r.encoding = 'gbk'
    reg = re.compile(r'class="t1 ">.*? ', re.S)
    links = re.findall(reg, r.text)
    return links
#多頁處理,下載到檔案
def get_content(link):
    r1=requests.get(link,headers,timeout=10)
    s=requests.session()
    s.keep_alive = False
    r1.encoding = 'gbk'
    t1=html.fromstring(r1.text)
    try:
        job=t1.xpath('//div[@class="tHeader tHjob"]//h1/text()')[0]
        company = t1.xpath('//p[@class="cname"]/a/text()')[0]
        print(company)
        label=t1.xpath('//p[@class="t2"]/span/text()')
        education=t1.xpath('//div[@class="t1"]//span[2]/text()')[0]
        salary = re.findall(re.compile(r'.*?(.*?)',re.S),r1.text)[0]
        area = t1.xpath('//div[@class="tHeader tHjob"]//span[@class="lname"]/text()')[0]
        companytype=t1.xpath('//p[@class="msg ltype"]/text()')
        workyear=t1.xpath('//div[@class="t1"]//span[1]/text()')[0]
        describe = re.findall(re.compile(r'
(.*?)任職要求',re.S),r1.text)         require =  re.findall(re.compile(r'
.*?任職要求(.*?)
',re.S),r1.text)         try:             file = codecs.open('51job.xls', 'a+', 'utf-8')             item = str(company)+'t'+str(job)+'t'+str(education)+'t'+str(label)+'t'+str(salary)+'t'+str(companytype)+'t'+str(workyear)+'t'+str(area)+'t'+str(workyear)+str(describe)+'t'+str(require)+'n'             file.write(item)             file.close()             return True         except Exception as e:             print(e)             return None         #output='{},{},{},{},{},{},{},{}n'.format(company,job,education,label,salary,area,describe,require)         #with open('51job.csv', 'a+', encoding='utf-8') as f:             #f.write(output)     except:         print('None') for  i in range(1,2000):     print('正在爬取第{}頁資訊'.format(i))     try:         #time.sleep(random.random()+random.randint(1,5))         links=get_links(i)         for link in links:             get_content(link)             #time.sleep(random.random()+random.randint(0,1))     except:         continue         print('有點問題')



三、資料探索和預處理:

資料爬取完了,大概有十萬條資料,看起來還不錯。

圖片描述


然而問題來了:

1.資料有重複,需要去重。

2.崗位不是全部是資料分析,也有招聘店長、銷售、運營之類的崗位,需要去除無關資料。

利用pandas模組,短短几行程式碼就可以實現了,而且資料很快。

# -*- coding: UTF-8 -*-
import pandas as pd
import numpy as np

data=pd.read_excel('51joball.xlsx',sheet_name='Sheet1',header=0)
df=pd.DataFrame(data)
df=df[True- df.公司.duplicated()]#去重
df=df[df.職位.str.contains(r'.*?資料.*?|.*?分析.*?')]#提取包含資料或者分析的崗位
df.to_excel('new51job.xlsx')

接下來還有一個問題需要處理,就是資料規範化,薪資待遇這欄,有的是千/月,有的是萬每年,有的是元/天,有的是K每月,不規劃化,無法進行分析。地區這一欄,有的有區,有的沒區,我們規劃到城市這個級別就好了。這裡利用xlrd模組讀取Excel表格,當然換成pandas一樣也可以。

#coding:utf8
import xlrd
import codecs
import re
#載入Excel資料,獲得工作表和行數
def load_from_xlsx(file):
    data = xlrd.open_workbook(file)
    table0 = data.sheet_by_name('Sheet1')
    nrows = table0.nrows
    return table0, nrows
#利用正規表示式提取月薪,把待遇規範成千/月的形式
def get_salary(salary):
    if '-'in salary: #針對1-2萬/月或者10-20萬/年的情況,包含-
        low_salary=re.findall(re.compile('(d*.?d+)'),salary)[0]
        high_salary=re.findall(re.compile('(d?.?d+)'),salary)[1]
        if u'萬' in salary and u'年' in salary:#單位統一成千/月的形式
            low_salary = float(low_salary) / 12 * 10
            high_salary = float(high_salary) / 12 * 10
        elif u'萬' in salary and u'月' in salary:
            low_salary = float(low_salary) * 10
            high_salary = float(high_salary) * 10
    else:#針對20萬以上/年和100元/天這種情況,不包含-,取最低工資,沒有最高工資
        low_salary = re.findall(re.compile('(d*.?d+)'), salary)[0]
        high_salary=""
        if u'萬' in salary and u'年' in salary:#單位統一成千/月的形式
            low_salary = float(low_salary) / 12 * 10
        elif u'萬' in salary and u'月' in salary:
            low_salary = float(low_salary) * 10
        elif u'元'in salary and u'天'in salary:
            low_salary=float(low_salary)/1000*21#每月工作日21天
    return low_salary,high_salary

def main():
    data = load_from_xlsx(r'new51job.xlsx')
    table, nrows = data[0], data[1]
    print('一共有{}行資料,開始清洗資料'.format(nrows))
    for i in range(1,nrows):
        id=table.row_values(i)[0]
        company=table.row_values(i)[1]
        position = table.row_values(i)[2]
        education = table.row_values(i)[3]
        welfare = table.row_values(i)[4]
        salary=table.row_values(i)[5]
        area = table.row_values(i)[6][:2]#地區取到城市,把區域去掉
        companytype = table.row_values(i)[7]
        companysize = table.row_values(i)[8]
        field = table.row_values(i)[9]
        experience = table.row_values(i)[10]
        responsibility = table.row_values(i)[11]
        requirement = table.row_values(i)[12]
        if salary:#如果待遇這欄不為空,計算最低最高待遇
            getsalary=get_salary(salary)
            low_salary=getsalary[0]
            high_salary=getsalary[1]
        else:
            low_salary=high_salary=""
        print('正在寫入第{}條,最低工資是{}k,最高工資是{}k'.format(i,low_salary,high_salary))
        output = '{}t{}t{}t{}t{}t{}t{}t{}t{}t{}t{}t{}t{}t{}n'.format(id, company, position, education, welfare,low_salary, high_salary, area, companytype,companysize, field, experience, responsibility,requirement)
        f=codecs.open('51jobanaly.xls','a+')
        f.write(output)
        f.close()
if __name__=='__main__':
    main()

看看清洗之後的效果

圖片描述

四、資料視覺化與分析

1.各地區招聘公司數量和平均待遇。

    用tebleau生成地理圖十分方便強大。可以看出不論是招聘公司的資料還是平均待遇水平主要都是北上廣深杭州佔優勢。成都緊隨其後。

圖片描述

2.公司型別

可以看出招聘的公司主要是民營企業和一些創業公司為主。

圖片描述

3.公司規模和公司領域

可以看出招聘公司的規模在50-500人規模為主,招聘的領域主要是網際網路公司,金融緊隨其後。

圖片描述

4.經驗和學歷要求

學歷這裡主要是大專本科為主,要求不算很高。

圖片描述

5崗位要求和崗位職責

直接生成現在最流行的詞雲,具體程式碼看

圖片描述圖片描述


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2035/viewspace-2802459/,如需轉載,請註明出處,否則將追究法律責任。

相關文章