【Python】猎聘网招聘数据爬虫(Python网络爬虫课设简要)

news/2024/2/28 9:12:04

【Python】猎聘网招聘数据爬虫(Python网络爬虫课设简要)

注:

  • 本文仅供学习交流使用!

  • 合肥学院-20信管-20302211009

  • 项目文件可自行前往博客主页下载或联系作者qq(3416252112)。

  • 爬取数据耗时约50分钟!

1、背景介绍(废话)

随着全球经济的发展和全球化竞争的加剧,招聘人才对于企业的成功变得至关重要。同时,求职者也面临着日益激烈的就业竞争。在这样的背景下,招聘市场不断发展,招聘过程变得更加复杂和竞争激烈。

互联网的普及和技术的发展给招聘带来了新的机遇和挑战。互联网招聘平台的兴起为企业和求职者提供了更广泛的交流和信息渠道。企业可以在招聘平台上发布招聘信息,同时通过筛选和匹配算法更准确地找到符合要求的人才;求职者可以通过招聘平台查找和申请适合自己的工作岗位。这种高效便捷的招聘方式极大地提高了招聘效率和成功率。

作为国内领先的互联网招聘平台之一,猎聘网汇聚了众多企业和求职者。其庞大的企业用户群体和海量的招聘信息资源使得猎聘网成为了人力资源管理领域的重要参考和决策依据。因此,对于猎聘网招聘数据的爬取和可视化分析具有重要的研究和实践价值。

在接下来的报告中,我们将详细介绍猎聘网招聘数据的爬取与可视化方法,并探讨其在人力资源决策和市场分析中的应用。

2、研究内容与目标(废话)

招聘数据对于人力资源决策具有重要性。通过分析招聘数据,可以了解当前市场的人才需求情况、行业的就业趋势以及薪资水平的变化等信息。这些信息对企业在招聘岗位时可以更好地定位和吸引合适的人才,从而提高招聘的效率和成功率。同时,求职者可以利用招聘数据了解就业市场的动态,选择适合自己的岗位和行业,提升就业竞争力。

猎聘网作为一家知名的招聘平台,拥有庞大的招聘数据资源。理解和利用猎聘网的招聘数据,可以帮助我们深入了解不同行业的人才需求和就业趋势,为企业的人才战略提供有力支持。通过数据爬取和可视化的方法,我们可以将海量的数据转化为直观、易于理解的图表和图形,帮助决策者快速把握关键信息,做出准确的决策。

本报告的目的是介绍猎聘网招聘数据的爬取与可视化方法,通过对招聘数据的分析和可视化,为人力资源决策提供科学依据,提高招聘效率和成功率。同时,我们还希望能够推动数据爬取与可视化技术在招聘领域的应用和研究,促进人力资源管理的创新和发展。

3、爬取对象

爬取数据对象为[‘Java开发’, ‘数据挖掘’, ‘互联网产品经理’, ‘软件测试’, ‘图像算法工程师’],这五个关键字的检索结果,每个关键字共有四百条检索结果,总计2000条记录,最终成功爬取记录数为1581条,表结构如下图所示。

image-20230603155536056

4、功能描述

本次课设数据爬虫功能主要包括以下几个方面:

  • 数据收集:数据爬虫能够自动化地从目标网站上抓取数据。通过指定合适的URL和参数,爬虫可以访问网页并提取所需的信息,例如招聘信息、公司信息、职位要求、工作地点等。爬虫可以遍历多个页面或进行深度抓取,以获取更全面的数据。
  • 数据解析:爬虫可以解析从网页中提取的原始数据,并提取出有用的信息。这包括对HTML、XML等页面结构的解析,以及对文本、图像、链接等内容的提取和分析。通过数据解析,爬虫能够将抓取的数据转化为结构化的格式,以便后续的处理和分析。
  • 数据清洗:抓取的数据往往包含冗余、不完整或错误的信息。数据爬虫可以进行数据清洗,去除重复项、清理无效数据,并进行格式化和规范化,以确保数据的准确性和一致性。数据清洗可以提高后续数据处理和分析的效果。
  • 数据存储:抓取到的数据需要进行存储,以便后续的使用和分析。数据爬虫可以将清洗后的数据保存到合适的存储介质中,如数据库、文件或云存储服务。爬虫还可以管理数据存储的结构和索引,以方便数据的检索和查询。

5、数据爬取及存储流程

数据爬取及存储业务流程共包含以下步骤:

  1. 初始化:创建数据库、创建表、创建全局的数据列表(用于暂时存储爬取结果);
  2. 使用selenium爬取关键字检索结果中的岗位信息链接,并存入txt文件中;
  3. 岗位链接爬取完成之后读取岗位链接,然后通过requests依次爬取岗位页面;
  4. 使用XPath对爬取到的页面进行解析并将解析结果添加到数据列表(同时将岗位的详细信息保存到txt文件中,以备生成词云图);
  5. 页面解析完成后,遍历数据列表,将取出的数据依次插入到数据库表中,最后结束爬取.

流程图如下:

image-20230603155906824

6、爬虫目录结构介绍

爬虫代码总体包含六个方法别为 __init__()get_post_link()get_post_detail()save_data()over()run(),具体功能如下:

  1. __init__:该方法主要作用为创建全局信息(岗位列表、岗位链接列表、岗位数据列表)、创建数据库连接和表、读取用户标识库(User-Agent);

  2. get_post_link:该方法主要功能为使用selenium动态爬取关键字(岗位列表)检索结果的岗位链接,并将链接信息保存到同级目录下的“PostUrls”目录;

  3. get_post_detail:根据“PostUrls”目录下的url信息,使用requests依次爬取岗位详情页,并使用XPath对页面进行解析,将解析后的数据添加到岗位数据列表,以及将岗位详情字段保存到同级目录下得“PostIntroduceDatas”目录下以备生成岗位词云图;

  4. save_data:遍历岗位数据列表使用SQL语句依次将列表中的数据插入到job_database数据库的Jobs表中;

  5. over:该方法用于关闭数据库连接;

  6. run:运行方法,调用get_post_link()、get_post_detail()和over()方法,进行爬虫工作;

代码结构如下图:

image-20230603160026112

7、爬取过程截图

  • 爬取岗位链接截图

image-20230603160109684

  • 提取岗位数据截图

image-20230603160129133

8、爬虫源代码

import random
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from selenium.webdriver.common.by import By
import requests
import sqlite3
from lxml import etreeclass LiePin:def __init__(self):# 岗位列表self.driver = Noneself.post_list = ['Java开发', '数据挖掘', '互联网产品经理', '软件测试', '图像算法工程师']# 岗位链接列表self.all_link = []# 等待3三秒time.sleep(3)# 随机用户(User_Agent)with open('User_Agent_pool.txt', 'r', encoding='utf8') as fp:self.user_Agent = fp.readlines()self.user_Agent = [i.strip() for i in self.user_Agent]# 创建数据库连接对象self.conn = sqlite3.connect('job_database.db')# 创建游标对象self.cursor = self.conn.cursor()# 创建jobs表self.create_table_sql = "CREATE TABLE Jobs (信息ID INTEGER PRIMARY KEY AUTOINCREMENT, 岗位链接 VARCHAR, 搜索岗位名 VARCHAR, 岗位名称 VARCHAR, " \"企业名称 VARCHAR, 薪资区间 VARCHAR, 工作地点 VARCHAR, 工作经验 VARCHAR, 学历要求 VARCHAR, 岗位介绍 VARCHAR, 其他待遇 VARCHAR , 企业经营范围 VARCHAR)"self.cursor.execute(self.create_table_sql)def get_post_link(self, post):# 创建浏览器对象self.driver = webdriver.Chrome()# 打开网页self.driver.get('https://www.liepin.com/zhaopin/')time.sleep(3)print("===========开始爬取", post, "岗位链接===========")# 定位搜索框并输入关键词search_box = self.driver.find_element(By.XPATH, "//div[@id='lp-search-bar-section']//input")search_box.send_keys(post)search_box.send_keys(Keys.RETURN)# 共爬取10页链接# 结果数据result = []for page in range(10):print("开始爬取第", page + 1, "页链接…………")# 等待页面加载完成time.sleep(3)# 读取当前页岗位数量divs = self.driver.find_elements(By.XPATH, "//div[@class='content-wrap']//div[@class='job-list-box']/div")for i in range(1, len(divs) + 1):# print(i)link = self.driver.find_element(By.XPATH, f"//div[@class='job-list-box']/div[{i}]//a").get_attribute("href")# 存储岗位链接信息result.append(str(link))# print("测试", result[0])time.sleep(3)# 爬取下一页if page == 9:breakself.driver.find_element(By.XPATH, "//div[@class='list-pagination-box']//li[""@class='ant-pagination-next']/button").click()# 将链接列表保存至文件self.all_link.append(result)with open(f'PostUrls/{post}_url.txt', 'a', encoding='utf-8') as fp:for item in result:fp.write(item + '\n')# 爬取岗位详情信息def get_post_detail(self):print("==========================开始提取各岗位详情页信息==========================")for post in self.post_list:print("++++++++++++开始获取", post, "相关岗位详情信息++++++++++++")with open(f'PostUrls/{post}_url.txt', 'r', encoding='utf-8') as fp:urls = fp.readlines()with open(f'PostIntroduceDatas/{post}_detail.txt', 'a', encoding='utf-8') as fp:index = 0result = []for url in urls:index += 1print(f"提取{post}岗位,第", index, "条数据……")time.sleep(1)try:# 发送GET请求response = requests.get(url=url, headers={"User-Agent": random.choice(self.user_Agent)})html_str = etree.HTML(response.text)# 岗位链接post_link = str(url)# 搜索岗位名search_name = post# 岗位名称post_name = html_str.xpath("//body/section[3]//div[@class='name-box']/span[1]")[0].text# 企业名称enterprise_name = html_str.xpath("//aside//div[@class='company-info-container']//div[""contains(@class,'name')]")[0].text# 企业经营范围enterprise_scope = html_str.xpath("//aside//div[@class='register-info']/div[contains(@class,""'ellipsis-4')]/span[2]")[0].text# 薪资区间post_salary = html_str.xpath("//body/section[3]//div[@class='name-box']/span[@class='salary']")[0].text# 工作地点post_location = html_str.xpath("//body/section[3]//div[@class='job-properties']/span[1]")[0].text# 工作经验work_experience = html_str.xpath("//body/section[3]//div[@class='job-properties']/span[3]")[0].text# 学历要求educational_requirements = html_str.xpath("//body/section[3]//div[""@class='job-properties']/span[5]")[0].text# 其他待遇about_treatment = ''for sub in html_str.xpath("//body/section[4]//div[@class='labels']/span"):about_treatment += ' ' + sub.text# 岗位介绍post_introduce = html_str.xpath("//main//dl[1]/dd")[0].text# 保存数据# self.save_data(post_link, )detail = {"岗位链接": post_link,"搜索岗位名": search_name,"岗位名称": post_name,"企业名称": enterprise_name,"薪资区间": post_salary,"工作地点": post_location,"工作经验": work_experience,"学历要求": educational_requirements,"岗位介绍": post_introduce,"其他待遇": about_treatment,"企业经营范围": enterprise_scope}# 添加至总结果列表result.append(detail)# print(detail)# 将岗位介绍信息写入txt文件,以备提取词云fp.write(detail['岗位介绍'] + '\n\n')except Exception as e:with open('error_url/error_message.txt', 'a', encoding='utf-8') as f:f.write("爬取失败url:" + url)# 将数据存入数据库print(f"+++++开始将{post}岗位数据存入数据库+++++")self.save_data(result)# 保存结果数据# self.save_data(result)# 保存数据def save_data(self, result):print("==========开始将数据存入数据库=========")print("共", len(result), "条数据,开始存入数据库…………")for item in result:try:insert_sql = f"INSERT INTO Jobs(岗位链接, 搜索岗位名, 岗位名称, 企业名称, 薪资区间, 工作地点, 工作经验, 学历要求, 岗位介绍, 其他待遇, 企业经营范围) " \f"VALUES('{item['岗位链接']}', '{item['搜索岗位名']}', '{item['岗位名称']}', '{item['企业名称']}', '{item['薪资区间']}', '{item['工作地点']}', '{item['工作经验']}', '{item['学历要求']}', '{item['岗位介绍']}', '{item['其他待遇']}', '{item['企业经营范围']}')"self.cursor.execute(insert_sql)except Exception as e:print("当前记录异常,忽略……")# 提交事务self.conn.commit()print("数据存储完毕!")def over(self):# 关闭数据库连接self.conn.close()def run(self):# 爬取各岗位链接for post in self.post_list:self.get_post_link(post)self.get_post_detail()self.over()if __name__ == '__main__':liepin = LiePin()liepin.run()print("数据采集完毕!")

https://www.jiucaihua.cn/news/show-4626232.html

相关文章

KEYSIGHT是德DSOX4034A 示波器 350 MHz

KEYSIGHT是德DSOX4034A 示波器 350 MHz,是德4000 X 系列拥有一系列引以为傲的配置,包括采用了电容触摸屏技术的 12.1 英寸显示屏、InfiniiScan 区域触摸触发、100 万波形/秒捕获率、MegaZoom IV 智能存储器技术和标配分段存储器。 是德DSO-X4034A 主要特…

MySQL数据库从入门到精通学习第8天(数据表的查询)

数据表的查询 基本查询语句单表查询聚合函数查询多表连接查询子查询合并查询结果定义表和字段的别名使用正则表达式查询 基本查询语句 SELECT 语句非常的强大,是最常用的查询语句。他具有一个固定的格式,如下: SELECT 查询的内容 FROM 数据…

礼物的最大价值 JZ47

目录 链接 描述 示例 代码 演示结果 链接 礼物的最大价值_牛客题霸_牛客网 描述 示例 代码 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param grid int整型vector<vect…

分享通过复旦微魔方来找到FM33LG048串口3无法发送和接收原因的例子

今天来分享一个关于开发国产芯片(复旦微FM33LG048)串口3时候遇到一个无法发送和接收原因&#xff0c;通过使用官网的图形配置工具来成功解决问题的案例。 具体情况是这样的&#xff0c;该芯片官网有提供相应的keil参考例子&#xff0c;因为我要用到这个芯片上面的五个串口&…

【复变函数笔记】解析函数的定义和性质

文章目录 解析函数的等价定义解析函数的性质 解析函数的等价定义 解析函数的定义&#xff1a; f ( z ) f(z) f(z)在区域内可导则在区域内解析&#xff0c;在一点解析就是在某一邻域内可导。解析函数不可能只在一点解析。柯西-黎曼方程&#xff1a;函数 f ( z ) u ( x , y ) …

python基于DeeplabV3Plus开发构建裂缝分割识别系统,并实现裂缝宽度计算测量

在我之前的文章中已经有不少基于裂缝场景的数据开发构建的模型了&#xff0c;感兴趣的话可以自行移步阅读&#xff0c;如下&#xff1a; 《基于yolov5sbifpn实践隧道裂缝裂痕检测》 《基于YOLOV7的桥梁基建裂缝检测》 《水泥路面、桥梁基建、隧道裂痕裂缝检测数据集》 《基…

(学习日记)2023.04.26

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【数据集处理】中国地面气候资料日值数据集(V3.0)

1 数据集介绍-中国地面气候资料日值数据集(V3.0) 中国地面气候资料日值数据集(V3.0)包含以下气象数据资料(包括降水、气温、风速等)。 2 数据处理 以湿度数据(RHU) 处理为例,数据文件如下: 2.1 步骤1:从文件中提取数据 首先提取所有需要的有效信息,查看【数据表格…

C/C++线程绑核详解

在一些大型的工程或者特殊场景中&#xff0c;我们会听到绑核&#xff0c;绑核分为进程绑核和线程绑核。绑核的最终目的都是为了提高程序和性能或者可靠性。 一&#xff1a;为什么需要绑核 操作系统发展至今&#xff0c;已经能很好的平衡运行在操作系统上层的应用&#xff0c;兼…

FreeRTOS进阶学习

一、FreeRTOS内核控制控制函数&#xff1a; 1、请求任务切换函数&#xff1a; 函数原型&#xff1a;#define taskYIELD() 函数解析&#xff1a;实际上是一个宏定义的函数&#xff0c;调用一次会触发pendSV中断来实现任务切换&#xff1b; /// 2、在任务中进入临界区函数&…