帮你寻找你想要的岗位!
现在很多人都习惯在招聘网站搜索岗位,但五花八门的岗位、薪资、岗位要求使你一个个对比浪费大量不必要的时间。作为程序员当然要解决繁琐的问题,所以我们要方便快捷找到自己想要的岗位就要进行采集数据和进行分析了。
我们需要做好以下准备:
要安装好以下库:requets、lxml、pymysql、matplotlib、jieba、wordcloud
这次我们将参考Boss直聘下的招聘信息进行分析:
我们需要参考的数据有:
岗位名、薪资、公司名、公司信息、详细要求、发布时间
![](https://i-blog.csdnimg.cn/blog_migrate/49bed5d4514caf53b6860987920e4630.png)
但是我们发现职位描述的详细信息是动态生成的,我们需要通过抓包对抓到的动态页面的url地址并且进行解析构造。
以下是我们抓到的包的请求:
发现url地址后面一传字符串在前端界面上其实是具有的,所以可以自己进行拼接访问获取动态页面的信息。
首先,采集需要的信息并存入数据库:
注意:要提取下一页的地址直到结束
import requests
from lxml import etree
from queue import Queue
import pymysql
db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='biquge', charset='utf8')
cursor = db.cursor()
data = "insert into jobrequire_copy(job_name,job_salary_max,job_salary_min,job_company,job_needs,company_detail,time,more_detail) values(%s,%s,%s,%s, %s,%s, %s,%s)"
a =True
url="https://www.zhipin.com/c100010000/?query=java&page=1&ka=page-1"
#进入Boss直聘进行搜索全国你想要的职位获取第一页的url地址
#一直访问直到没有下一页地址
while a:
header = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'
}
rep = requests.get(url, headers=header)
html = etree.HTML(rep.content.decode("utf8"))
print(html)
lists = html.xpath("//div[@class='job-list']/ul/li")
com = []
for list in lists:
job_name = list.xpath(".//div[@class='job-title']/text()")[0]
job_salary = list.xpath(".//span/text()")[0]
mina = int("".join(job_salary.split("-")).split("k")[0]) * 1000
maxa = int("".join(job_salary.split("-")).split("k")[1]) * 1000
job_company = list.xpath("./div/div[@class='info-company']//h3/a/text()")[0]
job_needs = list.xpath("./div/div[@class='info-primary']/p/text()")[0]
company_detail = list.xpath("./div/div[@class='info-company']//p/text()")[0]
time = list.xpath("./div/div[@class='info-publis']//p/text()")[0]
# 获取动态详细的信息
detail = list.xpath("./div/a/@data-url")[0].split("jobId")[1]
url = "https://www.zhipin.com/view/job/card.json?jid" + detail
rep = requests.get(url, headers=header)
a = eval(rep.content.decode())['html']
html2 = etree.HTML(a)
detail_message = "".join(html2.xpath("//div[@class='detail-bottom-text']/text()")).strip()
try:
#插入数据库
cursor.execute(data, (job_name, str(maxa), str(mina), job_company, job_needs, company_detail, time, detail_message))
db.commit()
except:
db.rollback()
#获取下一页的url地址
a="".join(html.xpath("//div[@class='page']/a[@ka='page-next']/@href"))
if a!="javascript:;":
url = "https://www.zhipin.com" +a
print(url)
else:
a=False
db.close()
保存到数据库的信息
相比一个个页面点开看已经很方便了,但是还不是很直观。所以我们要对数据进行可视化的操作
通过不同岗位名的薪资范畴进行对比
import pymysql
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='biquge', charset='utf8')
cursor = db.cursor()
sql ='select job_salary_min, job_salary_max,job_name ,more_detail from jobrequire '
name =[]
min=[]
max=[]
plt.figure(figsize=(50,8),dpi=100)
try:
cursor.execute(sql)
result =cursor.fetchall()
for x in result:
name.append(x[2])
min.append(int(x[0])/10000)
max.append(int(x[1])/10000)
except:
print("no")
plt.scatter(name,min,color='green',label='最低工资')
plt.scatter(name,max,color='red',label='最高工资')
plt.xlabel("岗位名")
plt.ylabel("工资/10k")
plt.locator_params('y',nbins=20)
plt.legend(loc = 'best')
plt.xticks(rotation=45)
plt.show()
结果展示:
我们还可以对所有岗位提出的要求进行进一步的分析,看看到底哪些技术是都必要具备的呢
词云分析
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import pymysql
import jieba
detail=[]
db = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='biquge', charset='utf8')
cursor = db.cursor()
sql ='select more_detail from jobrequire '
plt.figure(figsize=(400,10),dpi=100)
try:
cursor.execute(sql)
result =cursor.fetchall()
for x in result:
detail.append(x[0])
except:
print("no")
a = "".join(detail)
mytext="".join(jieba.cut(a))
wc = WordCloud( background_color = 'white', # 设置背景颜色
font_path = 'C:/Windows/Fonts/msyhbd.ttc', # 设置字体格式,如不设置显示不了中文
width = 2000,
height = 1000).generate(mytext)
plt.imshow(wc, interpolation="bilinear")
plt.axis('off')
plt.show()
结果展示:
是不是很方便很容易!快点自己动手搜索分析你喜欢的岗位吧!
欢迎交流学习!如有错误请大方指出,不要吝啬你的喜欢!