心路历程
近期python这个岗位可以说是非常的火,火到什么程度呢?基本上每天刷朋友圈,看公众号的时候都能看到底部的python广告、网课,简直是无孔不入。
本着学习的心态,同时也好奇目前python都有哪些岗位在招,薪资方面怎么样?做一个简单地分析。
操作步骤
- 找一个招聘网站,搜寻各个公司招聘Python的相关岗位
- 利用爬虫爬取一下招聘的相关数据
- 通过岗位的关键词制作词云,看看哪些岗位的关键词出现最多
- 看一下哪个阶段的薪资范围占比高
爬虫部分
自己也是边学边写,网上也看了很多教程,目前使用的还是request+re这两个模块,感觉用起来比较顺手,当然同学也说beautiful soup这个好用。目前还没有学到这个,所以暂时就以request来操作。
首先导入模块
import requests
import json
import re
import time
# 创建一个爬虫类,初始化一些属性
class Spider
def __init__(self):
def __init__(self):
# 此处的?page={}指的是翻页时url的动态参数,使用{}方便后面遍历得到翻页url,具体的情况看什么网站
self.url_tmp = 'https://www.xxxx.com/zhaopin?page={}'
self.hearders = '浏览器UA头'
因为爬取的一般是列表页,列表页的话那么肯定需要翻页吧,这个时候就需要通过for循环去得到这些页面的链接了
def get_url(self):
"""获得url列表"""
url_list = [self.url_tmp.format(i) for i in range(1, 100)] # range的大小取决于你想爬多少页的内容
print(url_list)
return url_list
发送一个请求查看一下页面的状态
def parse_url(self, url_list):
"""解析url"""
response = requests.get(url_list, headers=self.hearders)
# print(response)
return response.content.decode()
此处就是重点部分了,通过正则来获取页面的元素及我们所需要的内容,其中需要爬取的内容通过(.*?)来表示,后期通过索引值来对应内容,这里主要爬取招聘的岗位名称、岗位具体链接、简要信息、招聘的公司名称
def get_title(self, html_str):
"""获取页面内需要爬取的内容"""
partion = re.compile('<h3 title="招聘(.*?)">.*?<a href="(.*?)" data-.*?<p class="condition clearfix".*?title="(.*?)">.*?<span class="text-warning">.*?<p class="company-name">.*?<a title="公司(.*?)".*?target="_blank"', re.S)
items = re.findall(partion, html_str)
for item in items:
yield {
'title': item[0],
'urls': item[1],
'info': item[2],
'company_name': item[3]
}
def save_data(self, content_list):
"""保存数据"""
with open('datas/pc_datas.txt', 'a', encoding='utf-8') as a:
for i in content_list:
a.write(json.dumps(i, ensure_ascii=False))
a.write('\n')
print(i)
写个主程序来运行
def run(self):
start = time.time()
url_list = self.get_url()
for url in url_list:
html_str = self.parse_url(url)
content_list = self.get_title(html_str)
self.save_data(content_list)
end = time.time()
print(end-start)
# 实例化对象
if __name__ == '__main__':
p_spider = Spider()
p_spider.run()
完整代码如下
# encoding=utf-8
import requests
import json
import re
import time
class Spider:
def __init__(self):
self.url_tmp = 'https://www.xxxxxxx.com/zhaopin?Page={}'
self.hearders = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
def get_url(self):
"""获得url列表"""
url_list = [self.url_tmp.format(i) for i in range(1, 20)]
print(url_list)
return url_list
def parse_url(self, url_list):
"""解析url"""
response = requests.get(url_list, headers=self.hearders)
print(response)
return response.content.decode()
def get_title(self, html_str):
"""获取页面内需要爬取的内容"""
partion = re.compile('<h3 title="招聘(.*?)">.*?<a href="(.*?)" data-.*?<p class="condition clearfix".*?title="(.*?)">.*?<span class="text-warning">.*?<p class="company-name">.*?<a title="公司(.*?)".*?target="_blank"', re.S)
items = re.findall(partion, html_str)
for item in items:
yield {
'title': item[0],
'urls': item[1],
'info': item[2],
'company_name': item[3]
}
def save_data(self, content_list):
"""保存数据"""
with open('datas/pc_datas.txt', 'a', encoding='utf-8') as a:
for i in content_list:
a.write(json.dumps(i, ensure_ascii=False))
a.write('\n')
print(i)
def run(self):
start = time.time()
url_list = self.get_url()
for url in url_list:
html_str = self.parse_url(url)
content_list = self.get_title(html_str)
self.save_data(content_list)
end = time.time()
print(end-start)
if __name__ == '__main__':
p_spider = Spider()
p_spider.run()
基本上一个比较简易的爬虫就完成了,没有使用多任务,也没设置延迟时间(爬取的内容也不多,对对方的服务器也不会造成太大的压力,如果数据量较大,还是要设置一下时间了,以免搞挂了对方的服务器,不过稍微有点规模的公司都会有反爬虫机制,倒不是太担心,不过嘛,做人留一线哈哈)
上图是爬取的效果,设置了一个time.time()函数,记录一下爬取的速度,看了一下,爬了一页就花了1.2秒,还是比较快的。
词云展示
接下来就是一些分析的活了,现学现用,把爬取到的岗位名称保存到一个txt文档中,通过Python生成词云,当然图快的老哥也可以用网上的应用一键生成。
代码是参考了简书上一位老哥的代码,copy过来改了一下,这里注明一下出处:https://www.jianshu.com/p/28718ba04bc9?from=groupmessage
完整代码如下:
# coding=utf-8
# 导入扩展库
import re # 正则表达式库
import collections # 词频统计库
import numpy as np # numpy数据处理库
import jieba # 结巴分词
import wordcloud # 词云展示库
from PIL import Image # 图像处理库
import matplotlib.pyplot as plt # 图像展示库
# 读取文件
with open('article.txt', 'r', encoding='utf-8')as f:
string_data = f.read()
# 文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式
string_data = re.sub(pattern, '', string_data) # 将符合模式的字符去除
# 文本分词
seg_list_exact = jieba.cut(string_data, cut_all=False) # 精确模式分词
object_list = []
remove_words = [u'的', u',', u'和', u'是', u'随着', u'对于', u'对', u'等', u'能', u'都', u'。', u' ', u'、', u'中', u'在', u'了',
u'通常', u'如果', u'我们', u'需要', ')', '(','(', ')', '工程师'] # 自定义去除词库
for word in seg_list_exact: # 循环读出每个分词
if word not in remove_words: # 如果不在去除词库中
object_list.append(word) # 分词追加到列表
# 词频统计
word_counts = collections.Counter(object_list) # 对分词做词频统计
word_counts_top10 = word_counts.most_common(10) # 获取前10最高频的词
print(word_counts_top10) # 输出检查
# 词频展示
mask = np.array(Image.open('wordcloud.jpg')) # 定义词频背景
wc = wordcloud.WordCloud(
font_path='C:/Windows/Fonts/simhei.ttf', # 设置字体格式
mask=mask, # 设置背景图
max_words=200, # 最多显示词数
max_font_size=100 # 字体最大值
)
wc.generate_from_frequencies(word_counts) # 从字典生成词云
image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案
wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案
plt.imshow(wc) # 显示词云
plt.axis('off') # 关闭坐标轴
plt.show() # 显示图像
主要是通过招聘岗位名称中关键词出现的频次来看招聘岗位的火热程度,也算是间接体现目前python做哪些岗位是比较热门的吧。
我们可以发现,其中算法、测试、数据、分析师、运维、后台这些事比较热门的,非要排一个123的话,具体看字的大小就知道了。
什么,你说为什么没有人工智能?因为没对获取的数据深度加工,且爬取的岗位名称中人工智能关键词就不多,所以没有明显的突出。