python爬取前程无忧分析一波机械职位信息

简介: 秋招这个时候已经开始了,正所谓知己知彼方能百战不殆,今天就从招聘网站下手分析一波机械的就业前景。这次获取数据的网站是前程无忧,之所以选择前程无忧,是因为数据获取没有什么难度,再者前程无忧提供的岗位信息比智联招聘,拉勾提供的数据都多。

秋招这个时候已经开始了,正所谓知己知彼方能百战不殆,今天就从招聘网站下手分析一波机械的就业前景。
这次获取数据的网站是前程无忧,之所以选择前程无忧,是因为数据获取没有什么难度,再者前程无忧提供的岗位信息比智联招聘,拉勾提供的数据都多。
看了一下,前程无忧提供了 2000页/50条 数据,考虑到数据可能有些重复,这里获取 48569 条数据。

数据获取

  • 用到的爬虫框架是 scrapy
  • 解析库 xpath、re、pymongo
  • 保存数据用 mongodb
  • 数据处理用 pyecharts。

打开 https://www.51job.com/ 在搜索框输入机械,跳转到的网页是这个样子的:

img_9691cd73f088b14a1a392a1fc9534ecf.png

这里面的字段还不足以满足我们的需求,还想获取职位描述,和公司的类型,例如国企还是民营等这些数据。于是我们点开看看每一条数据的字段。

img_eae3be55d52f6760572c197031a5bef8.png
具体字段

框起来的就是我们要获取的内容。
接下来上代码,使用scrapy 提供的默认模板创建爬虫项目。

class A51jobSpider(scrapy.Spider):
    name = '51job'
    allowed_domains = ['51job.com']
    keyword = quote('机械')
    headers = {
        'Host': 'search.51job.com',
        'Referer': 'https://www.51job.com/',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
       }

    def start_requests(self):
        '''获取开始抓取的页面'''
        for i in range(1,1000):
            url = 'https://search.51job.com/list/000000,000000,0000,00,9,99,'+ self.keyword + ',2,{}.html'.format(str(i))
            yield scrapy.Request(url=url,headers=self.headers,callback=self.parse_detial_url)
  def parse_detial_url(self,response):
        '''获取详情页的url'''
        s = etree.HTML(response.text)
        detail_urls = s.xpath('//*[@id="resultList"]/div/p/span/a/@href')
        for detial_url in detail_urls:
            url = detial_url
            yield scrapy.Request(url=url,headers=self.headers,callback=self.parse)

这里通过重写 start_request 获取详情信息图片的链接,接下来解析具体字段数据:

 def parse(self, response):
        '''解析详情页具体字段'''
        item = JixieItem() # 实例化类
        s = etree.HTML(response.text)
        jobs = s.xpath('//div[@class="tHeader tHjob"]/div/div[1]/h1/text()')
        if jobs:
            item['job'] = jobs[0].strip()
        else:
            item['job'] = ''
        companys = s.xpath('//div[@class="tHeader tHjob"]/div/div[1]/p[1]/a[1]/text()')
        if companys:
            item['company'] = companys[0].strip()
        else:
            item['company'] = ''
        company_types = s.xpath('//div[@class="com_tag"]/p/text()')
        if company_types:
            item['company_type'] = company_types[0]
        else:
            item['company_type'] = ''
        data = s.xpath('//div[@class="tHeader tHjob"]/div/div[1]/p[2]/text()')
        if data:
            item['area'] = data[0].strip()
            item['experience'] = data[1].strip()
            item['degree'] = data[2].strip()

        salarys = s.xpath('//div[@class="tHeader tHjob"]/div/div[1]/strong/text()')
        if salarys:
            item['salary'] = salarys[0].strip()
        else:
            item['salary'] = ''
        describes = re.findall(re.compile('<div class="bmsg job_msg inbox">(.*?)div class="mt10"', re.S), response.text)
        if describes:
            item['describe'] = describes[0].strip().replace('<p>', '').replace('</p>','').replace('<p>','').replace('<span>','').replace('</span>','').replace('\t','')
        yield item

items.py 文件了定义了具体的字段。items 是保存爬取数据的容器,使用方法和字典差不多。不过,相比字典,item 多了额外的保护机制,可以避免拼写错误或者定义字段的错误。

class JixieItem(scrapy.Item):
    # 定义抓取的字段
    job = Field()
    company = Field()
    company_type = Field()
    area = Field()
    experience = Field()
    degree = Field()
    salary = Field()
    describe = Field()

接下来把数据保存到 MongoDB 中,这里的代码格式是一样的,几乎不需要修改就可以从 scrapy 的文档中拿过来用:

class MongoPipeline(object):
    def __init__(self,mongo_uri,mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
    @classmethod
    def from_crawler(cls,crawler):
        return cls(
            mongo_uri = crawler.settings.get('MONGO_URI'),
            mongo_db = crawler.settings.get('MONGO_DB')
        )
    def open_spider(self,spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
    def process_item(self,item,spider):
        name = item.__class__.__name__
        self.db[name].insert(dict(item))
        return item
    def close_spider(self,spider):
        self.client.close()

数据获取成功,看一下数据:


img_9818354af818ec667c3ee1defb4b05d1.png

数据分析

这一部分才是重头戏

先看一下学历占比

img_dbf35dcf073f2c27b008358266853c7b.png
学历占比

可以看到硕士需求不多,并不是说需求不多,而是在大的环境下,相对来说少。这里的大环境是指据统计全国本科及以上学历比例不到 10%
细心的小伙伴在求职时可以发现虽说公司打着学历要求不高,可任职要求已经完全超出了对学历的要求,所以能提高学历尽力提高学历,提高竞争力。

再来看一下工作经验在机械中的要求

img_b803fcb78415f980f9337e642ab43cc9.png
工作经验

可以看到机械相关职位在招聘时对工作经验的要求占了很大的一部分,这对应届毕业生求职来说可是个好消息。同时看到五年以后的需求没有那么大了,这是招聘公司不需要工作经验久的员工了吗?
猜测
1、对于机械行业来说,公司福利待遇基本上一样,求职者在五六年经验后,基本生活工作稳定,不会再想着跳槽从新开始。
2、现在招聘旺季是给应届毕业生。

img_854cd639aa9c9a87e875f524b1f5b080.png
公司类型

虽说民营公司占了大部分,但是能去国企还是尽量去国企。在同等情况下上市公司和有融资的公司都是不错的选择(工资高,福利好),当然在你拿到对应 offer 再说吧。


img_c650bc91ccb75547e42b50a02b7d335d.jpe
机械词云图.jpg

这里是根据职位描述生成的词云图,由于数据量比较大,这张图的参考价值不是很大,其实是想获取哪些具体的专业技能要求最多,但还是看出绘图软件需求高一些。同时不能忽略软实力的重要,办公软件也是要熟练掌握的。

总结

综上所述,机械的就业前景还是挺不错的,同时自身实力过硬也是必须的。没事的时候看看招聘网站上的任职要求和自身实力匹配一下,补充一下自身实力,在招聘的时候才能有所进退。

最后点赞是一种态度。

目录
相关文章
|
5天前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
在现代数据分析中,高维时间序列数据的处理和预测极具挑战性。基于矩阵分解的长期事件(MFLEs)分析技术应运而生,通过降维和时间序列特性结合,有效应对大规模数据。MFLE利用矩阵分解提取潜在特征,降低计算复杂度,过滤噪声,并发现主要模式。相比传统方法如ARIMA和深度学习模型如LSTM,MFLE在多变量处理、计算效率和可解释性上更具优势。通过合理应用MFLE,可在物联网、金融等领域获得良好分析效果。
22 0
使用Python实现基于矩阵分解的长期事件(MFLEs)时间序列分析
|
7天前
|
数据可视化 算法 数据挖掘
Python时间序列分析工具Aeon使用指南
**Aeon** 是一个遵循 scikit-learn API 风格的开源 Python 库,专注于时间序列处理。它提供了分类、回归、聚类、预测建模和数据预处理等功能模块,支持多种算法和自定义距离度量。Aeon 活跃开发并持续更新至2024年,与 pandas 1.4.0 版本兼容,内置可视化工具,适合数据探索和基础分析任务。尽管在高级功能和性能优化方面有提升空间,但其简洁的 API 和完整的基础功能使其成为时间序列分析的有效工具。
60 37
Python时间序列分析工具Aeon使用指南
|
3天前
|
机器学习/深度学习 运维 数据可视化
Python时间序列分析:使用TSFresh进行自动化特征提取
TSFresh 是一个专门用于时间序列数据特征自动提取的框架,支持分类、回归和异常检测等机器学习任务。它通过自动化特征工程流程,处理数百个统计特征(如均值、方差、自相关性等),并通过假设检验筛选显著特征,提升分析效率。TSFresh 支持单变量和多变量时间序列数据,能够与 scikit-learn 等库无缝集成,适用于大规模时间序列数据的特征提取与模型训练。其工作流程包括数据格式转换、特征提取和选择,并提供可视化工具帮助理解特征分布及与目标变量的关系。
34 16
Python时间序列分析:使用TSFresh进行自动化特征提取
|
2天前
|
数据采集 缓存 API
python爬取Boss直聘,分析北京招聘市场
本文介绍了如何使用Python爬虫技术从Boss直聘平台上获取深圳地区的招聘数据,并进行数据分析,以帮助求职者更好地了解市场动态和职位需求。
|
19天前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
40 10
|
1月前
|
数据可视化 算法 数据挖掘
Python量化投资实践:基于蒙特卡洛模拟的投资组合风险建模与分析
蒙特卡洛模拟是一种利用重复随机抽样解决确定性问题的计算方法,广泛应用于金融领域的不确定性建模和风险评估。本文介绍如何使用Python和EODHD API获取历史交易数据,通过模拟生成未来价格路径,分析投资风险与收益,包括VaR和CVaR计算,以辅助投资者制定合理决策。
79 15
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1月前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
114 80
|
21天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
38 14