查看原文
其他

招聘全面启动,你找到适合自己的工作了吗?

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:周一鸣 中南财经政法大学金融学院

本文编辑:董高飞

技术总编:金点







Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~


引言
进入八月,各大企业的校园招聘全面启动,招聘工作如火如荼地进行着。相信大多毕业生们都会在网上寻找自己心仪的工作进行投递,除了在各大公司官网上投递外,大多人也会选择在招聘网站上搜索相关工作信息。现在的招聘网站很多以便求职者寻找适合自己的工作,但是由于招聘网站中包含的工作很多,即使筛选之后仍会有很多的工作信息,如果想要了解所有的公司情况以及工作职责,福利等等信息需要一一点进去,比较费时费力。为了能够先人一步挑选心仪工作并投递,可以通过python爬取招聘信息。本文以智联招聘网为例对所有发布的工作进行爬虫,为了方便大家查阅本文将爬取的信息汇总到Excel中。

为成功爬取招聘信息,我们首先搜索智联招聘网,填写自己的基础信息进行注册从而登入智联招聘网,再点击“找工作”,最后会看到如下界面。

接着我们找到该界面的网页源代码对应的真实网址,如下。

由于职位很多,一页中只有30个职位,总共有34页,仔细观察其链接的特征,发现第一页对应的是pageindex=1,而第n页对应的是pageindex=n。因此可以构造出url。

url = "https://xiaoyuan.zhaopin.com/api/sou?S_SOU_FULL_INDEX=&S_SOU_POSITION_SOURCE_TYPE=&pageIndex="+str(i+1)+"&S_SOU_POSITION_TYPE=2&S_SOU_WORK_CITY=&S_SOU_JD_INDUSTRY_LEVEL=&S_SOU_COMPANY_TYPE=&S_SOU_REFRESH_DATE=&order=12&pageSize=30&_v=0.70646566&at=885417961e8d4d29b946afac6d72e264&rt=fe44b797f04f40bd8bf2c2d62191f883&x-zp-page-request-id=1216fd2d18034d77934aab22fa40a3e9-1691149616608-478458&x-zp-client-id=6d61443c-9c0e-4795-8f4a-fbf3e3db37da"

获取真实网址之后,由于每一页包含的内容格式一致,因此以第一页为例,之后用for函数进行循环即可。

本文通过BeautifulSoup对第一页的url进行解析,代码如下:

import pandas as pdimport requestsimport refrom bs4 import BeautifulSoupurl = 'https://xiaoyuan.zhaopin.com/api/sou?S_SOU_FULL_INDEX=&S_SOU_POSITION_SOURCE_TYPE=&pageIndex=1&S_SOU_POSITION_TYPE=2&S_SOU_WORK_CITY=&S_SOU_JD_INDUSTRY_LEVEL=&S_SOU_COMPANY_TYPE=&S_SOU_REFRESH_DATE=&order=12&pageSize=30&_v=0.70646566&at=885417961e8d4d29b946afac6d72e264&rt=fe44b797f04f40bd8bf2c2d62191f883&x-zp-page-request-id=1216fd2d18034d77934aab22fa40a3e9-1691149616608-478458&x-zp-client-id=6d61443c-9c0e-4795-8f4a-fbf3e3db37da'html = requests.get(url)te = html.textbf = BeautifulSoup(te)

输出的结果为:

仔细观察list中的内容,可以发现每个工作都由{}进行了分组,其中均是由"abroadFlag"开头,以"workingExp"结尾。因此,为将各个工作分开,以一个工作包含的所有信息为一个单位进行爬虫,我们继续利用正则表达式进行如下处理:

alllists = re.findall(r"{\"abroadFlag\":2,(.*?)\"workingExp\":\".*?\"}",str(list))

从输出结果来看,成功将所有工作分开。

接着我们需要将每份工作中需要的信息包括发布时间, 工作名称, 行业名称, 公司名称, 公司网页,工作城市, 工作性质, 薪水, 工作内容, 所需教育背景, 招聘人数, 申请方式, 申请网址等提取出来。操作如下:

jobname = re.findall(r"\"name\":\"([\u4e00-\u9fa5]+.*?)\"",alllists[30])orgName = re.findall(r"\"orgName\":\"(.+?)\"",alllists[30])companyUrl = re.findall(r"\"companyUrl\":\"(.+?)\"",alllists[30])workCity = re.findall(r"\"workCity\":\"(.+?)\"",alllists[30]) workType = re.findall(r"\"workType\":\"(.+?)\"",alllists[30])publishTime = re.findall(r"\"publishTime\":\"(.+?)\"",alllists[30])recruitNumber = re.findall(r"\"recruitNumber\":(.+?)",alllists[30])industryName = re.findall(r"\"industryName\":\"([\u4e00-\u9fa5,/]+)\"",alllists[30])education = re.findall(r"\"education\":\"(.+?)\"",alllists[30])positionUrl = re.findall(r"\"positionUrl\":\"(.+?)\"",alllists[30])typeName = re.findall(r"\"typeName\":\"(.+?)\"",alllists[30])jobSummary = re.findall(r"\"jobSummary\":\"(.+?)\"",alllists[30])salary60 = re.findall(r"\"salary60\":\"(.+?)\"",alllists[30])
之所以在提取工作名称和行业名称时和其他信息提取时所使用的正则表达式不同,是因为name和industryname都对应两个及以上的字符串,但除了我们真正需要的那个之外,其他的都是非汉字的字符串。
将这些结果放入一个列表中,结果如下:

但是我们在输出的时候发现如果招聘人数为若干的话,recruitNumber会显示为0,因此,为了纠正这个错误,我们进行如下处理:
if recruitNumber == ['0']:  recruitNumber = ['若干']
其显示的效果为:

最后,我们用for进行循环并构建Excel,将所有数据写入Excel中,具体代码如下:

import numpy as npimport pandas as pdimport xlwtimport reimport xlrdimport xlwtfrom xlutils.copy import copyimport requestsfrom bs4 import BeautifulSoup
def write_excel_xls(path, sheet_name, value): index = len(value) # 获取需要写入数据的行数 workbook = xlwt.Workbook() # 新建一个工作簿 sheet = workbook.add_sheet(sheet_name) # 在工作簿中新建一个表格 for i in range(0, index): for j in range(0, len(value[i])): sheet.write(i, j, value[i][j]) # 像表格中写入数据(对应的行和列) workbook.save(path) # 保存工作簿

def write_excel_xls_append(path, value): index = len(value) # 获取需要写入数据的行数 workbook = xlrd.open_workbook(path) # 打开工作簿 sheets = workbook.sheet_names() # 获取工作簿中的所有表格 worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格 rows_old = worksheet.nrows # 获取表格中已存在的数据的行数 new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象 new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格 for i in range(0, index): for j in range(0, len(value[i])): new_worksheet.write(i + rows_old, j, value[i][j]) # 追加写入数据,注意是从i+rows_old行开始写入 new_workbook.save(path) # 保存工作簿

def read_excel_xls(path): workbook = xlrd.open_workbook(path) # 打开工作簿 sheets = workbook.sheet_names() # 获取工作簿中的所有表格 worksheet = workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格 for i in range(0, worksheet.nrows): for j in range(0, worksheet.ncols): print(worksheet.cell_value(i, j), "\t", end="") # 逐行逐列读取数据 print()titlelist = [[["publishTime"], ["jobname"], ["industryName"], ["orgName"], ["companyUrl"], ["workCity"], ["workType"], ["salary60"], ["jobSummary"], ["education"], ["positionOfNlp"], ["typeName"], ["positionUrl"]]]valuelist = []for i in range(34): url = "https://xiaoyuan.zhaopin.com/api/sou?S_SOU_FULL_INDEX=&S_SOU_POSITION_SOURCE_TYPE=&pageIndex=" + str( i + 1) + "&S_SOU_POSITION_TYPE=2&S_SOU_WORK_CITY=&S_SOU_JD_INDUSTRY_LEVEL=&S_SOU_COMPANY_TYPE=&S_SOU_REFRESH_DATE=&order=12&pageSize=30&_v=0.70646566&at=885417961e8d4d29b946afac6d72e264&rt=fe44b797f04f40bd8bf2c2d62191f883&x-zp-page-request-id=1216fd2d18034d77934aab22fa40a3e9-1691149616608-478458&x-zp-client-id=6d61443c-9c0e-4795-8f4a-fbf3e3db37da" html = requests.get(url) te = html.text bf = BeautifulSoup(te) list = re.findall(r"\"list\":\[(.+)\]", str(bf)) alllists = re.findall(r"{\"abroadFlag\":2,(.*?)\"workingExp\":\".*?\"}", str(list)) for i in range(len(alllists)): jobname = re.findall(r"\"name\":\"([\u4e00-\u9fa5]+.*?)\"", alllists[i]) orgName = re.findall(r"\"orgName\":\"(.+?)\"", alllists[i]) companyUrl = re.findall(r"\"companyUrl\":\"(.+?)\"", alllists[i]) workCity = re.findall(r"\"workCity\":\"(.+?)\"", alllists[i]) workType = re.findall(r"\"workType\":\"(.+?)\"", alllists[i]) publishTime = re.findall(r"\"publishTime\":\"(.+?)\"", alllists[i]) recruitNumber = re.findall(r"\"recruitNumber\":(.+?)", alllists[i]) industryName = re.findall(r"\"industryName\":\"([\u4e00-\u9fa5,/]+)\"", alllists[i]) education = re.findall(r"\"education\":\"(.+?)\"", alllists[i]) positionUrl = re.findall(r"\"positionUrl\":\"(.+?)\"", alllists[i]) typeName = re.findall(r"\"typeName\":\"(.+?)\"", alllists[i]) jobSummary = re.findall(r"\"jobSummary\":\"(.+?)\"", alllists[i]) salary60 = re.findall(r"\"salary60\":\"(.+?)\"", alllists[i]) if recruitNumber == ['0']: recruitNumber = ['若干'] jobAttributes = [publishTime, jobname, orgName, industryName, companyUrl, workCity, workType, salary60, jobSummary, education, recruitNumber, typeName, positionUrl] value = [] for item in jobAttributes: keyValue = str(item) value.append(keyValue) valuelist.append(value)
book_name_xls = './xls格式招聘信息工作簿.xls'sheet_name_xls = 'xls格式招聘信息表'write_excel_xls(book_name_xls, sheet_name_xls, titlelist)write_excel_xls_append(book_name_xls, valuelist)

其输出的Excel表格如下,完整的内容在Excel工作簿中呈现:

招聘信息就爬取完成啦,在此小编祝愿所有毕业生们都能找到心仪的工作!













END













重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!











往期推文推荐“狗大户”疯狂投币!中东基金加速布局A股【python可视化】立秋!酷热天气就此结束?全国各地高温地图一探究竟Python爬取暑期票房排行
给文件搬家——copy&XCOPY
NLTK,全面的Python基础NLP库
爬取A股上市公司指定年份年报
机器学习——监督学习入门‍‍禁忌魔法解封,击穿专业壁垒:ChatGPT code interpreter暑期来啦~⼀起看⼀看近期的天⽓情况【命令重磅更新】在Stata中深入使用ChatGPT
爬虫俱乐部2023第一期编程训练营开始报名啦!
【爬虫基础】Scrapy爬虫框架迈向交互式编程,ChatGPT更新!一个简单又好玩的Python库——MyQR
replace命令的“加强版”!——如何使用ereplace,结合egen
XML 轻松读取:用 Python 发现数据宝藏

爬虫俱乐部重磅推出cnstata.com.cn

Markdown:让数学公式输入更方便!

处理日期的好手:pendulum
定制属于自己的“贾维斯”——Python调用Chat
     关于我们 

   微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存