1. 前言
在如今竞争激烈的就业市场,了解最新的职位信息是成功找到理想工作的关键。而Boss直聘作为国内领先的招聘平台,拥有海量的职位信息。本教程将带您一步步学习如何使用爬虫技术,快速、高效地爬取Boss直聘上的职位信息。
2. 准备工作
在开始之前,我们需要具备以下准备工作:
- Python编程基础
- 安装Python的相关库
- 了解基本的HTML和CSS知识
3.爬取目标
4.爬取Boss直聘职位信息的步骤
本教程将分为以下几个步骤来实现对Boss直聘职位信息的爬取:
3.1. 分析目标网页结构
在开始编写爬虫代码之前,我们需要先了解Boss直聘的网页结构。本节将介绍如何使用开发者工具分析目标网页的HTML结构和CSS样式。
3.1.1查看目标数据网页结构
这里以python职位为例与大家分享一下爬取过程众的思路,在搜索框输入python回车查找后通过f12查看页面元素时间可以发现,所有的岗位都会用li这个标签包裹着,且ul对应的class的值为job-list-box
到这里我们点击页面右键选择查询查看页面源代码,在源代码 job-list-box 下面的结果表示页面上找不到搜索内容,这种情况就得去找数据接口了
由于我们需要的数据在页面源代码中找不到,这时就需要在异步请求中查找数据接口
刷新页面可以看到很多请求,这时候一个个查看,知道我们需要的数据出现
找到数据接口再查看接口需要传输的参数,这里面带有值的参数只有5个。scenc这个值应该是识别屏幕大小的,不需要理会;city这个值应该是某个城市的代号,position这个值应该某一类岗位的代号,page和pageside这两个个值分别是第几页和页面显示的数量。
接下来就要去找city和position的值在那个接口下保存的,同样的方法我们可以找到city和position的接口,通过请求这两个接口可以得到我们要的两个变量的值
3.2. 使用Python库进行数据抓取
了解目标网页结构后,我们将使用Python的相关库(如Requests和BeautifulSoup)来实现数据的抓取。本节将详细介绍如何发送HTTP请求、解析HTML文档并提取所需信息。
3.2.1.获取city的值
#!/usr/bin/env python3
# coding:utf-8
import bag
def main():
url = r'https://www.zhipin.com/wapi/zpCommon/data/city.json'
session = bag.session.create_session()
resp = session.get(url)
js_data = resp.json().get('zpData')
result = {}
for info in js_data.get('cityList'):
for city in info.get('subLevelModelList'):
mid = {}
try:
for value in city.get('subLevelModelList'):
mid[value.get('name')] = value.get('code')
except TypeError:
result[city.get('name')] = {city.get('code'): ''}
result[city.get('name')] = {city.get('code'): mid}
print(result)
# bag.Bag.save_json(result, './city_id.json')
if __name__ == '__main__':
main()
3.2.2. 获取position的值
#!/usr/bin/env python3
# coding:utf-8
import bag
def main():
url = r'https://www.zhipin.com/wapi/zpCommon/data/getCityShowPosition?cityCode=100010000'
session = bag.session.create_session()
resp = session.get(url)
js_data = resp.json()
result = {}
for info in js_data.get('zpData').get('position'):
k = {}
for key in info.get('subLevelModelList'):
mid = {}
for value in key.get('subLevelModelList'):
mid[value.get('name')] = value.get('code')
k[key.get('name')] = {key.get('code'): mid}
result[info.get('name')] = {info.get('code'): k}
bag.Bag.save_json(result, r'./job_name.json')
if __name__ == '__main__':
main()
3.2.3.获取数据
# city.json 下面是部分数据,展示这些数据主要是想让代码理解起来简单一点
{
"广州": {
"101280100": {
"荔湾区": 440103,
"越秀区": 440104,
"海珠区": 440105,
"天河区": 440106,
"白云区": 440111,
"黄埔区": 440112,
"番禺区": 440113,
"花都区": 440114,
"南沙区": 440115,
"从化区": 440117,
"增城区": 440118
}
}
}
# job_name.json
{
"互联网/AI": {
"1010000": {
"后端开发": {
"1000020": {
"Java": 100101,
"C/C++": 100102,
"PHP": 100103,
"Python": 100109,
"C#": 100106,
".NET": 100107,
"Golang": 100116,
"Node.js": 100114,
"Hadoop": 100108,
"语音/视频/图形开发": 100121,
"数据采集": 100122,
"GIS工程师": 100124,
"全栈工程师": 100123,
"其他后端开发": 100199
}
}
}
}
}
#!/usr/bin/env python3
# coding:utf-8
import bag
import json
import re
session = bag.session.create_session()
web = bag.Bag.web_debug()
def main():
base_url = r'https://www.zhipin.com/wapi/zpgeek/search/joblist.json?scene=1&query=&city={}' \
r'&experience=&payType=&partTime=°ree=&industry=&scale=&stage=&position={}' \
r'&jobType=&salary=&multiBusinessDistrict=&multiSubway=&page=1&pageSize=30'
city = bag.Bag.read_json('./city_id.json')
position = bag.Bag.read_json('./job_name.json')
city_input = input('输入查询岗位地区:') # 广州
position_input = input('输入查询岗位:') # Python
city_id = next(iter(city.get(city_input)))
session.get(r'https://www.zhipin.com/guangzhou/?ka=city-sites-{}'.format(city_id))
position_id = find_value(position, position_input)
session.get(r'https://www.zhipin.com/web/geek/job?query=&city={}&position={}'.format(city_id, position_id))
get_data(base_url.format(city_id, position_id))
def find_value(data, target_key):
if isinstance(data, dict): # 如果当前元素是字典
for key, value in data.items():
if key == target_key: # 如果找到了目标键,返回对应的值
return value
result = find_value(value, target_key) # 递归调用函数
if result is not None: # 如果找到了值,则返回结果
return result
return None # 如果没有找到目标值,则返回None
def get_data(url):
pattern = re.compile(r'<pre.*?>(.*?)</pre>', re.S)
web.get(url)
resp = web.page_source
resp = re.findall(pattern, str(resp))
print(resp)
to_json = json.loads(resp[0])
result = []
for info in to_json.get('zpData').get('jobList'):
result.append([
info.get('jobName'),
info.get('jobExperience'),
info.get('jobDegree'),
info.get('skills'),
info.get('cityName'),
info.get('areaDistrict'),
info.get('businessDistrict'),
info.get('brandName'),
info.get('brandStageName'),
info.get('brandIndustry'),
info.get('brandScaleName'),
info.get('welfareList')
])
bag.Bag.save_excel(result, './boss直聘爬虫.xlsx')
if __name__ == '__main__':
session.get('https://www.zhipin.com/')
main()
3.3. 爬取结果
4. 总结
boss直聘在反爬这一块做得还是比较好的,练习的时候注意控制避免ip被拉黑
建议使用selenium的调试模式来爬取,这样可以避免被反爬
selenium爬取boss直聘广州站示例