51job数据采集与分析

1、背景

   对于数据挖掘与机器学习领域而言,模型与数据是最重要的,但原始数据非常稀缺。爬虫的诞生,实现了自动化、快速、批量地收集数据的目的。网络爬虫又称为网络蜘蛛,是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。爬虫要实现三个基本功能:获取网页(收集数据)、解析网页(提取数据)、存储数据。

    现在就业形势愈加严峻,掌握一手就业信息越来越重要,51job是一个非常庞大就业网站,就业信息齐全,就业岗位多,深受广大就业者喜爱。

2、技术工具介绍

   2.1、requests模块

        Requests模块是Python的第三方模块,它的诞生主要是为了解决urllib和urllib2等内置模块在使用上不够简洁的问题。它支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的URL和POST数据自动编码等。

    2.2、selenium框架

        Selenium是一个用于Web应用程序自动化测试的工具,它可以模拟用户在浏览器中的操作,如跳转、输入、点击、下拉等。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。Selenium可以完全模拟浏览器的操作,从而获取网页渲染之后的结果,这使得爬取动态页面变得更加容易。

    3.3、undetected_chromedriver框架

        undetected_chromedriver是一个用于绕过Web自动化中ChromeDriver检测的Python库。它提供了更好的隐匿性和稳定性,适用于多种场景。可以适用于:Web自动化测试、网页数据爬取和反爬虫绕过等。

3.爬虫程序设计

   3.1爬取内容要求

        爬取三组信息,分别是以“数据开发、机器学习、数据仓库、数据架构师”,“审计、法务、会计、风控”和“人力资源、销售、商务、团队经理”为关键词,每组需要爬取五万至十万条信息。采集的岗位信息包括招聘专业、岗位工作、薪资、工作地点等不少于10个特征信息。

    3.2网站反爬介绍

      3.2.1headers反爬

        headers反爬是非常经典的反爬技术,51job会通过检查请求headers来区分浏览器行为和机器行为。一些网站会对Referer(上级链接)进行检测,从而实现爬虫的识别。

        3.2.2滑动验证反爬

        滑动验证反爬通常通过识别并阻止自动化的机器行为来保护网站数据。当一个请求看起来像是机器行为时,滑动验证就会触发,要求用户完成一个滑动操作以证明他们是人类。

图3-1滑动验证图

      3.3网站爬虫分析

        3.3.1爬取数量分析

观察51job网站,每一个关键字搜索只能看到50页1000条信息,显然无法满足五万条数据要求,我们可以通过切换城市、工作要求去搜索到更多信息,已满足对数据量的要求。

        3.3.2URL分析

        通过观察存储二级页面JSON数据的URL(Uniform Resource Locator),我们可以发现URL存在规律。我们通过两个URL进行分析。

        不加任何条件限制的URL:
https://we.51job.com/api/job/search-pc?api_key=51job&timestamp=1703410615&keyword=%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=&degree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=1&requestId=&pageSize=20&source=1&accountId=&pageCode=sou%7Csou%7Csoulb

        加条件限制的URL: https://we.51job.com/api/job/search-pc?api_key=51job&timestamp=1703410759&keyword=%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=06&workYear=02&degree=04&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=5&requestId=553854ded0575e0fedc753f1937fee8d&pageSize=20&source=1&accountId=&pageCode=sou%7Csou%7Csoulb

        我们可以发现第二个URL与第一个URL的timestamp、salary、workYear、degree和pageNum有不同。我们可以根据些获取更多的URL,已获取更多的岗位信息。

       

        3.2.3滑块验证分析

        通过图3-1可以知道,我们首先将鼠标放置验证块头部,最后使用鼠标将滑块拖到尾部,但简单两步容易被检测出来,我们可以在中间的过程中将鼠标放置中间的位置,加上睡眠时间,更不容易被检测不来,通过人机验证。

        3.2.4获取数据及存储

        通过获取二级页面的数据是JSON数据,我们通过层层获取可以得到我们需要的信息,将数据存储到字典,最终将数据存放到CSV文件。

图3-2二级页面数据图

        3.2.5破解滑块

# 测试滑块
import sys
import time
from selenium.webdriver.support.wait import WebDriverWait
from pynput.mouse import Button, Controller as c1

import undetected_chromedriver as uc
driver = uc.Chrome()
driver.get('https://we.51job.com/api/job/search-pc?api_key=51job&timestamp=1703000707&keyword=%E6%95%B0%E6%8D%AE%E5%BC%80%E5%8F%91&searchType=2&function=&industry=&jobArea=000000&jobArea2=&landmark=&metro=&salary=&workYear=&degree=&companyType=&companySize=&jobType=&issueDate=&sortType=0&pageNum=1&requestId=&pageSize=20&source=1&accountId=231574473&pageCode=sou%7Csou%7Csoulb')

mouse = c1()
driver.maximize_window()
wait = WebDriverWait(driver, 10)
time.sleep(random.uniform(2, 3) * 1.5)
driver.refresh()
time.sleep(random.uniform(2.2, 3.1) * 1.6)
mouse.position = (random.randint(552, 558), random.randint(392, 398))
mouse.press(Button.left)
time.sleep(random.uniform(1.0, 1.5) * 1.6)
mouse.move(random.randint(657, 663), random.randint(392, 399))
time.sleep(random.uniform(1.0, 1.1) * 1.5)
mouse.move(random.randint(734, 740), random.randint(392, 397))
time.sleep(random.uniform(1.3, 1.5) * 1.6)
mouse.move(random.randint(820, 824), random.randint(392, 398))
mouse.release(Button.left)
time.sleep(random.uniform(2.2, 3.0)*2)
sys.exit()

# http://proxy.siyetian.com/apis_get.html?token=gHbi1iTql1MNRVS14keRVjTR1STqFUeNpXR51kaBBzTE1kMNpXW59ERZFTTEtGN.gNxgjM4AzMwcTM&limit=200&type=0&time=&split=0&split_text=

4.数据分析

   4.1数据分析意义

        数据分析的意义在于帮助企业和组织发掘数据中隐藏的商业价值和市场趋势,从而做出更明智、更精准的商业决策。其意义是优化决策、提高效率和提高客户体验。能够帮助企业获得商业价值、提高市场竞争力和经济效益。

    4.2对爬取数据进行分析

      4.2.1工作岗位分布热力图

        热力图:热力图是一种特殊的图表,它使用颜色变化来展示数据分布和强度。根据数据的大小或等级,图表的不同部分会以不同的颜色或深浅来表示。这样可以帮助用户直观地了解数据的分布模式和趋势。

        现称第一组岗位为计算机类,第二组岗位为法务经济类,第三组为服务类。

图4-1计算机类工作分布热力图

图4-2法务经济类工作分布热力图

图4-3服务类工作分布热力图

        4.2.2学历占比饼图

        饼图:饼图通常为圆形,手画时常用圆规作图。在饼图中,每个数据点都以扇形的方式展示,这些扇形总和构成一个完整的圆。每个扇形的大小与该数据点在数据系列中的值成比例,因此,饼图可以直观地显示数据系列中各个项目所占的比例。

图4-4计算机类学历占比饼图

图4-5法务经济类学历占比饼图

图4-6服务类学历占比饼图

        4.2.3公司服务方向词云图

        词云图:词云图是一种文本数据的视觉展示,也称为文字云或词云。它通过将文本数据中的高频词汇以类似云的彩色图形展示出来,帮助用户快速理解文本的主题和重要信息。

图4-7计算机类公司方向词云图

图4-8法务经济类公司方向词云图

图4-9服务类公司方向词云图

        4.2.4公司类型饼图

图4-10计算机类公司类型饼图

图4-11法务经济类公司类型饼图

图4-12服务类公司类型饼图

        4.2.5招聘岗位薪酬分布图

图4-13计算机类公司招聘岗位薪酬分布图

图4-14法务经济类公司招聘岗位薪酬分布图

图4-15服务类公司岗位招聘薪酬分布图

5.分析结论

   5.1工作岗位地点分析结论

        根据上述分析,计算机工作岗位主要分布于北上广以及江浙沪一带;服务经济类工作岗位主要分布于安徽、山东、浙江、上海、河北以及广东等人口较多一代;服务类岗位主要分布于安徽、河北、山东一带。

        寻找计算机类工作去经济发达地区机会更多;法务经济类去人口较多地区更可能有更多机会;寻找服务类岗位最好去中部地区。

    5.2工作岗位需求学历占比分析结论

        计算机类、法务经济类和服务类需求本科和大专总占比均在75%以上,但计算机类对硕士及硕士以上学历需求更多,法务经济类和服务类对高学历需求明显少。

        在寻找计算机类提高自己的学历尤为重要;法务经济类和服务类学历在大专及本科机会更多。

    5.3公司服务方向分析结论

        计算机类公司主要服务方向是计算机软件、互联网、半导体、电子商务以及电子技术;法务经济类主要服务方向是金融、投资、会计以及证券;服务类公司主要服务于专业服务、咨询以及人力资源。

        就业者可根据公司主要服务方向选择自己的学习方向,就业选择会更多。

    5.4公司类型分析结论

        计算机类公司、法务经济类和服务类公司类型占比基本一致,特别是民营企业和国企占比特别大。

        就业者可以在民营和国企可以寻求更多机会。

最后附上代码图和数据图