本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负!
大家好,我是海鸽。
前言
当我们在寻找工作机会时,经常会利用 Boss 直聘、拉钩等招聘平台投递简历。
我们会根据职位描述来筛选出与自己技能和经验相匹配的岗位投简历。
这些职位描述不仅仅是求职的指南,它们还能指导我们如何优化自己的简历,甚至可以成为我们日常学习和技能提升的方向。
通过仔细分析职位描述中的关键词和要求,我们可以更清晰地了解自己需要在哪些方面进行提升,以便在未来的求职过程中更具竞争力。
今天我们试着抓取下boss
上深圳python
相关的岗位。
此次我们选择
DrissionPage
。
页面分析
首先,我们打开 Boss 直聘首页,F12 打开开发者模式,选择好城市(如深圳
),随便搜索一个职位(如python
):
可以看到请求接口为https://www.zhipin.com/wapi/zpgeek/search/joblist.json
,返回json
格式,并且payload
里附带了请求的其他信息,每页显示30条岗位数据。
查看具体的响应,可以看到大部分的信息在这个wapi/zpgeek/history/joblist.json
接口里都能捞到(包括总的岗位条数、公司、学历要求等):
然后,我们点开随便一个具体的岗位,分析职位描述等关键信息如何获取。
跳转打开了新的详情地址:
shell代码解读复制代码https://www.zhipin.com/job_detail/2a7d0170d89b0ef51HF739u9F1ZR.html?lid=7iigZ5z7y29.search.1&securityId=2u2R42F0pKiko-P1PVWYVv_yL1cYG0PiLxnA4NGP52TQOTl3DB6oOTSGFmiLuRz89_-vRO3AQoju2nf9rS_WLh2CDFEO_NeSPiZX0bgyOQzlepft&sessionId=
这是document
类型的响应,解析其中的html
即可拿到对应岗位的职位描述等信息。
点击跳转的话,到这一步完全可以拿到我们想要的数据了。
那如果详情地址能够自己构造,那也不失为一种优化。
其中大概率是跟2a7d0170d89b0ef51HF739u9F1ZR.html
、lid
的值、securityId
的值有关,我们先去掉lid
、security
发现可以正常查看详情。
我们返回跳转前的调试窗口,搜索2a7d0170d89b0ef51HF739u9F1ZR
:
这样,我们只要拿到wapi/zpgeek/history/joblist.json
接口就可以构造对应职位的详情接口获取职位详情等信息,美滋滋啊。
ok,我们对页面内容的分析到此结束啦。接下来就是编码时间了。
爬虫代码
分析完请求后,编码就比较简单了。我们先安装下必要的工具库:
shell代码解读复制代码pip install DrissionPage pip install sqlalchemy pip install loguru
数据的话就直接存储在本地的sqlite
中,确定下需要爬取和存储的字段:
python
代码解读
复制代码
class Job(Base):
__tablename__ = 'job'
id = Column(Integer, primary_key=True, comment="job id")
jobName = Column(String, comment="职位名称")
cityName = Column(String, comment="城市")
areaDistrict = Column(String, comment="区")
brandName = Column(String, comment="公司名")
salaryDesc = Column(String, comment="薪资范围")
link = Column(String, comment="详情页链接")
desc = Column(String, comment="职位描述")
jobLabels = Column(String, comment="职位标签")
jobDegree = Column(String, comment="学历")
brandScaleName = Column(String, comment="公司规模")
brandStageName = Column(String, comment="公司发展阶段")
brandIndustry = Column(String, comment="公司行业")
爬取具体搜索页(1,2,3 ...):
python
代码解读
复制代码
def get_list(post_name: str, city: str, page: int):
# 监听网站数据包,必须在请求之前先执行
driver.listen.start("/wapi/zpgeek/search/joblist.json")
driver.get(f"https://www.zhipin.com/web/geek/job?query={post_name}&city={city}&page={page}&pageSize=30")
logger.debug(f"catching page {page} ...")
# 等待数据包内容加载
resp = driver.listen.wait()
# 获取数据包内容
return resp.response.body
爬取具体岗位的职位描述信息:
python
代码解读
复制代码
def clean_html(html_text: str):
# 去除 <div> 标签
cleaned_text = re.sub(r'<div[^>]*>', '', html_text)
# 去除 </div> 标签
cleaned_text = re.sub(r'</div>', '', cleaned_text)
# 去除 <br> 标签
cleaned_text = re.sub(r'<br>', '\n', cleaned_text)
logger.debug(cleaned_text)
return cleaned_text
def get_job_details(job_id: str):
job_url = f"https://www.zhipin.com/job_detail/{job_id}.html"
logger.debug(job_url)
driver.get(job_url)
detail = driver.eles(".job-sec-text")
return detail[0].html
将数据存入sqlite
:
python
代码解读
复制代码
def pipeline(job_info: dict):
for job in job_info['zpData']['jobList']:
details = get_job_details(job["encryptJobId"])
logger.debug(details)
job_data = {
"jobName": job['jobName'],
"salaryDesc": job['salaryDesc'],
"jobLabels": str(job['jobLabels']),
"jobDegree": job['jobDegree'],
"cityName": job['cityName'],
"brandName": job['brandName'],
"brandScaleName": job['brandScaleName'],
"brandStageName": job['brandStageName'],
"areaDistrict": job['areaDistrict'],
"brandIndustry": job['brandIndustry'],
"link": f"https://www.zhipin.com/job_detail/{job["encryptJobId"]}.html",
"desc": clean_html(details)
}
db.add(Job(**job_data))
time.sleep(0.5)
ok,爬虫启动。
访问频率不宜过高,不然过程中可能出现IP
异常检测,需要你手动验证。当然你大可上代理。
写在最后
今天的分享就到这里。如果觉得不错,点赞
,关注
安排起来吧。
如有侵权请联系站点删除!
技术合作服务热线,欢迎来电咨询!