利用爬虫获取岗位信息 分析市场需求

心路历程

近期python这个岗位可以说是非常的火,火到什么程度呢?基本上每天刷朋友圈,看公众号的时候都能看到底部的python广告、网课,简直是无孔不入。

本着学习的心态,同时也好奇目前python都有哪些岗位在招,薪资方面怎么样?做一个简单地分析。

操作步骤

  1. 找一个招聘网站,搜寻各个公司招聘Python的相关岗位
  2. 利用爬虫爬取一下招聘的相关数据
  3. 通过岗位的关键词制作词云,看看哪些岗位的关键词出现最多
  4. 看一下哪个阶段的薪资范围占比高

爬虫部分

自己也是边学边写,网上也看了很多教程,目前使用的还是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的话,具体看字的大小就知道了。

什么,你说为什么没有人工智能?因为没对获取的数据深度加工,且爬取的岗位名称中人工智能关键词就不多,所以没有明显的突出。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容