python爬取Boss直聘,分析北京招聘市场
一、引言
在当前的经济环境下,整体市场发展出现了低迷的趋势,许多求职者面临着找工作困难的局面。尤其是在深圳这样的大城市,竞争异常激烈,求职者需要更加精准地寻找与自己能力相匹配的工作岗位。让自己的能力和需求得到最大化的满足,需要我们了解市场需求和招聘动态,从这场激烈的求职竞争中脱颖而出。
Boss直聘作为一个热门的求职招聘平台,汇聚了大量的招聘信息。
今天我们就一起来看看,如何使用Python爬虫技术获取Boss直聘上的招聘数据,并分析北京地区的招聘市场情况,以帮助求职者更有效地找到适合自己的工作。
二、爬虫目标
我们将从Boss直聘上爬取以下数据,帮助我们了解深圳的招聘市场现状、热门职位以及行业需求。
-
职位名称
-
公司名称
-
工作地点
-
薪资范围
-
职位要求
三、环境准备
3.1 编程语言
话不多说,Python简单易用,有丰富的库支持,早就成为数据抓取的程序er必用语言了。
3.2 必要库安装
我们需要安装以下Python库:
-
requests
:用于发送HTTP请求,获取网页内容。 -
BeautifulSoup
:用于解析HTML文档,提取数据。 -
pandas
:用于数据处理和分析。
可以通过以下命令安装所需库:
pip install requests beautifulsoup4 pandas
四、配置代理IP
爬虫需要用代理IP的重要性已经不言而喻了。代理IP通常具有更快的网络连接速度和更低的延迟,有助于提高数据抓取的效率。此外,代理服务器还能缓存请求数据,进一步加速抓取过程。
其次,代理IP在突破访问限制和提高爬虫稳定性方面也发挥着重要作用,其高可用性和稳定性有助于爬虫在网络波动或目标网站不稳定时保持连续运行。因此,使用像青果网络这样的代理IP服务提供商,对于爬虫开发者来说是一个值得考虑的选择。
4.1 注册
首先,我们需要去注册一下青果网络:
然后选择对应需要的产品购买,购买后,在控制台看到有关信息:
4.2 获取代理IP
选择已购买可用的AuthKey值,根据实际需求提取对应的IP,点击【生成链接】获取在线API链接,【打开链接】新窗口打开获取申请成功的IP信息,如下图所示;
4.3 调试工具
勾选要进行提取的业务key,选择接口方法,然后,其他选项IP数量、地区、运营商按需选择,最后点击【测试】按钮即可进行IP提取,申请成功返回结果为如下图所示;
4.4 浏览器测试
您可以把生成的API链接直接在浏览器里打开,查看返回结果。例如,您直接点击如下api链接:
https://proxy.qg.net/query?Key=0B***607
五、数据抓取
5.1 页面分析
访问Boss直聘网站,使用开发者工具(F12)观察网络请求,找到包含招聘信息的页面结构。通常招聘信息以列表的形式呈现,每个职位的信息在一个特定的HTML元素中。
通过BeautifulSoup解析 HTML 数据:
from bs4 import BeautifulSoup
import requests
url = 'https://www.zhipin.com/job_detail/?query=python&city=101010100'
res = requests.get(url, headers=header).text
print(res)
content = BeautifulSoup(res, "html.parser")
ul = content.find_all('ul')
print(ul[12])
5.2 编写爬虫代码
以下是python利用代理IP抓取多个页面,获取北京市招聘岗位信息的部分代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 设置青果网络的代理IP
proxy = {
"http": "http://username:password@proxy_ip:port",
"https": "https://username:password@proxy_ip:port"
}
# 目标URL,搜索北京地区的招聘信息
url = 'https://www.zhipin.com/c101010100/'
# 发送请求
response = requests.get(url, proxies=proxy)
response.encoding = 'utf-8'
# 解析HTML
soup = BeautifulSoup(response.text, 'html.parser')
# 存储职位数据
job_data = []
# 找到招聘信息的容器
jobs = soup.find_all('div', class_='job-list')
def jobs(page):
for i in range(1, page + 1):
job_list = []
try:
print("正在抓取第 %s 页数据" % i)
uri = '/c101010100/' % i
res = requests.get(config.url + uri, headers=header).text
content = BeautifulSoup(res, "html.parser")
ul = content.find_all('ul')
jobs = ul[12].find_all("li")
for job in jobs:
job_dict = {}
job_details_uri = job.find('h3', attrs={'class': 'name'}).find('a')['href']
job_company = job.find('div', attrs={'class': 'company-text'}).find('h3', attrs={'class': 'name'}).find(
'a').text
job_salary = job.find('h3', attrs={'class': 'name'}).find('span', attrs={'class': 'red'}).text
job_details = str(job.find('p'))
job_rege = re.match(rege, job_details)
job_dict['name'] = job_company
job_dict['uri'] = job_details_uri
job_dict['salary'] = job_salary
try:
job_dict['site'] = job_rege.group(1)
job_dict['year'] = job_rege.group(2)
job_dict['edu'] = job_rege.group(3)
except:
continue
job_list.append(job_dict)
print(job_list)
# save to mongoDB
try:
mongo_collection.insert_many(job_list)
except:
continue
time.sleep(1)
except:
continue
5.3岗位详情
通过url分析,我们可以知道,所有职位描述都在div标签中:
直接用BeautifulSoup 解析:
def run_main():
jobs = job_collection.find()
for job in jobs:
print('获得工作的uri ', job['uri'])
get_details(job)
time.sleep(1)
def get_details(items):
base_url = config.url
url = base_url + items['uri']
company_name = items['name']
try:
res = requests.get(url, headers=header).text
content = BeautifulSoup(res, "html.parser")
text = content.find('div', attrs={'class': 'text'}).text.strip()
result = {'name': company_name, 'details': text}
details_collection.insert_one(result)
except:
raise
if __name__ == '__main__':
run_main()
5.4 数据清洗
我们获取的数据可能存在重复或缺失的情况,可以使用pandas
进行数据清洗:
# 读取数据
df = pd.read_csv('shenzhen_jobs.csv')
# 去除重复项
df.drop_duplicates(inplace=True)
# 处理缺失值
df.fillna('无', inplace=True)
# 数据统计
print(df.describe())
六、数据分析
6.1 分析职位分布
使用pandas
和matplotlib
库对职位进行分布分析,找出热门职位和薪资水平。
import matplotlib.pyplot as plt
# 职位名称统计
job_counts = df['职位名称'].value_counts().head(10)
# 绘制职位分布图
plt.figure(figsize=(10, 6))
job_counts.plot(kind='bar')
plt.title('北京热门职位分布')
plt.xlabel('职位名称')
plt.ylabel('数量')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
6.2 薪资分析
我们还可以分析不同职位的薪资情况,找出高薪职位。
# 提取薪资范围
df['最低薪资'] = df['薪资范围'].str.extract('(\d+)').astype(float)
df['最高薪资'] = df['薪资范围'].str.extract('(\d+)(?=\s)').astype(float)
# 计算平均薪资
df['平均薪资'] = (df['最低薪资'] + df['最高薪资']) / 2
# 找出薪资最高的职位
high_salary_jobs = df.nlargest(5, '平均薪资')
print("薪资最高的职位:")
print(high_salary_jobs[['职位名称', '平均薪资']])
七、总结
在当前市场环境低迷的背景下,爬取Boss直聘的数据,我们成功分析了深圳地区的招聘市场。了解市场动态和职位需求,可以帮助求职者更有效地找到与自身能力相匹配的工作岗位,同时,也能更好地适应市场变化。