python热爱者Python新世界

在北京当 Python 程序员,能买起房吗?

2018-10-27  本文已影响15人  48e0a32026ae

相信各位同学多多少少在拉钩上投过简历,今天突然想了解一下北京Python开发的薪资水平、招聘要求、福利待遇以及公司地理位置。

既然要分析那必然是现有数据样本。本文通过爬虫和数据分析为大家展示一下北京Python开发的现状,希望能够在职业规划方面帮助到大家!!!

爬虫

爬虫的第一步自然是从分析请求和网页源代码开始。从网页源代码中我们并不能找到发布的招聘信息。但是在请求中我们看到这样一条Post请求。

如下图我们可以得知

请求方式:Post

result:发布的招聘信息

total Count:招聘信息的条数

通过实践发现除了必须携带headers之外,拉勾网对IP访问频率也是有限制的。一开始会提示 \'访问过于频繁\',继续访问则会将IP拉入黑名单。不过一段时间之后会自动从黑名单中移除。

针对这个策略,我们可以对请求频率进行限制,这个弊端就是影响爬虫效率。

1 思路

通过分析请求我们发现每页返回15条数据,total Count又告诉了我们该职位信息的总条数。

向上取整就可以获取到总页数。然后将所得数据保存到CSV文件中。这样我们就获得了数据分析的数据源!

Post请求的Form Data传了三个参数:

First : 是否首页(并没有什么用);

PN:页码;

KD:搜索关键字。

2 No bb, show code

# 获取请求结果

# kind 搜索关键字

# page 页码 默认是1

def get_json(kind, page=1,):

# post请求参数

param = {

\'first\': \'true\',

\'pn\': page,

\'kd\': kind

}

header = {

\'Host\': \'www.lagou.com\',

\'Referer\': \'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=\',

\'User-Agent\': \'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\'

}

# 设置代理

proxies = [

{\'http\': \'140.143.96.216:80\', \'https\': \'140.143.96.216:80\'},

{\'http\': \'119.27.177.169:80\', \'https\': \'119.27.177.169:80\'},

{\'http\': \'221.7.255.168:8080\', \'https\': \'221.7.255.168:8080\'}

]

# 请求的url

url = \'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false\'

# 使用代理访问

# response = requests.post(url, headers=header, data=param, proxies=random.choices(proxies))

response = requests.post(url, headers=header, data=param, proxies=proxies)

response.encoding = \'utf-8\'

if response.status_code == 200:

response = response.json()

# 请求响应中的positionResult 包括查询总数 以及该页的招聘信息(公司名、地址、薪资、福利待遇等...)

return response[\'content\'][\'positionResult\']

return None

接下来我们只需要每次翻页之后调用getJSON获得请求的结果,再遍历取出需要的招聘信息即可。

if __name__ == \'__main__\':

# 默认先查询第一页的数据

kind = \'python\'

# 请求一次 获取总条数

position_result = get_json(kind=kind)

# 总条数

total = position_result[\'totalCount\']

print(\'{}开发职位,招聘信息总共{}条.....\'.format(kind, total))

# 每页15条 向上取整 算出总页数

page_total = math.ceil(total/15)

# 所有查询结果

search_job_result = []

#for i in range(1, total + 1)

# 为了节约效率 只爬去前100页的数据

for i in range(1, 100):

position_result = get_json(kind=kind, page= i)

# 每次抓取完成后,暂停一会,防止被服务器拉黑

time.sleep(15)

# 当前页的招聘信息

page_python_job = []

for j in position_result[\'result\']:

python_job = []

# 公司全名

python_job.append(j[\'companyFullName\'])

# 公司简称

python_job.append(j[\'companyShortName\'])

# 公司规模

python_job.append(j[\'companySize\'])

# 融资

python_job.append(j[\'financeStage\'])

# 所属区域

python_job.append(j[\'district\'])

# 职称

python_job.append(j[\'positionName\'])

# 要求工作年限

python_job.append(j[\'workYear\'])

# 招聘学历

python_job.append(j[\'education\'])

# 薪资范围

python_job.append(j[\'salary\'])

# 福利待遇

python_job.append(j[\'positionAdvantage\'])

page_python_job.append(python_job)

# 放入所有的列表中

search_job_result += page_python_job

print(\'第{}页数据爬取完毕, 目前职位总数:{}\'.format(i, len(search_job_result)))

# 每次抓取完成后,暂停一会,防止被服务器拉黑

time.sleep(15)

ok! 数据我们已经获取到了,最后一步我们需要将数据保存下来。

# 将总数据转化为data frame再输出

df = pd.DataFrame(data=search_job_result,

columns=[\'公司全名\', \'公司简称\', \'公司规模\', \'融资阶段\', \'区域\', \'职位名称\', \'工作经验\', \'学历要求\', \'工资\', \'职位福利\'])

df.to_csv(\'lagou.csv\', index=False, encoding=\'utf-8_sig\')

运行main方法直接上结果:

数据分析

通过分析CVS文件,为了方便我们统计,我们需要对数据进行清洗

结论:北京市Python开发的薪资大部分处于15~25k之间。

2 公司分布饼状图

# 绘制饼图并保存

count = df[\'区域\'].value_counts()

plt.pie(count, labels = count.keys(),labeldistance=1.4,autopct=\'%2.1f%%\')

plt.axis(\'equal\') # 使饼图为正圆形

plt.legend(loc=\'upper left\', bbox_to_anchor=(-0.1, 1))

plt.savefig(\'pie_chart.jpg\')

plt.show()

结论:Python开发的公司最多的是海淀区,其次是朝阳区。准备去北京工作的小伙伴大概知道去哪租房了吧

3学历要求直方图

# {\'本科\': 1304, \'大专\': 94, \'硕士\': 57, \'博士\': 1}

dict = {}

for i in df[\'学历要求\']:

if i not in dict.keys():

dict[i] = 0

else:

dict[i] += 1

index = list(dict.keys())

print(index)

num = []

for i in index:

num.append(dict[i])

print(num)

plt.bar(left=index, height=num, width=0.5)

plt.show()

结论:在Python招聘中,大部分公司要求是本科学历以上。但是学历只是个敲门砖,如果努力提升自己的技术,这些都不是事儿

4 福利待遇词云图

# 绘制词云,将职位福利中的字符串汇总

text = \'\'

for line in df[\'职位福利\']:

text += line

# 使用jieba模块将字符串分割为单词列表

cut_text = \' \'.join(jieba.cut(text))

#color_mask = imread(\'cloud.jpg\') #设置背景图

cloud = WordCloud(

background_color = \'white\',

# 对中文操作必须指明字体

font_path=\'yahei.ttf\',

#mask = color_mask,

max_words = 1000,

max_font_size = 100

).generate(cut_text)

# 保存词云图片

cloud.to_file(\'word_cloud.jpg\')

plt.imshow(cloud)

plt.axis(\'off\')

plt.show()

结论:弹性工作是大部分公司的福利,其次五险一金少数公司也会提供六险一金。团队氛围、扁平化管理也是很重要的一方面。

至此,此次分析到此结束。有需要的同学也可以查一下其他岗位或者地区的招聘信息哦~ 希望能够帮助大家定位自己的发展和职业规划。

上一篇下一篇

猜你喜欢

热点阅读