使用python爬取BOSS直聘岗位数据并做可视化
- 结果展示
- 首页
- 岗位信息
- 岗位详情
- 薪资表
- 学历需求
- 公司排名
- 岗位关键词
- 福利关键词
- 代码展示
- 爬虫代码
- 一、导入库
- 二、爬取数据
- 1、爬取数据代码展示
- 2、通过selenium打开浏览器
- (1)打开网页
- (2)找到需要的数据
- 三、爬取多页数据
- 四、存储数据
- 1、创建mysql数据库
- 2、插入数据到mysql数据库
- 数据可视化
- 一、网站模板
- 二、flask框架
- 1、创建flask项目
- 2、导入网站模板
- 3、查询数据展示到网页上
- 三、echarts图表
- 四、词云
结果展示
首页
我使用Flask框架和网站模板制作了一个简单的首页,
其中数据和岗位数量会根据数据库里的数据显示数据!
岗位信息
岗位详情
薪资表
学历需求
公司排名
岗位关键词
福利关键词
代码展示
爬虫代码
一、导入库
from selenium import webdriver
import pymysql
from urllib import parse
二、爬取数据
1、爬取数据代码展示
drive = webdriver.Chrome()
KeyWord = input("请输入你要搜索的岗位关键字")
KeyWords = parse.quote(parse.quote(KeyWord))
# print(KeyWords)
drive.get("https://www.zhipin.com/c101270100/?query="+KeyWords+"&page=1&ka=page-")
drive.implicitly_wait(10)
datalist = []
def get_job_info():lis = drive.find_elements_by_css_selector('.job-list li')for li in lis:data = []# 工作名称name = li.find_element_by_css_selector('.job-name a').textdata.append(name)# 工作地点area = li.find_element_by_css_selector('.job-area').textdata.append(area)# 公司名称company_name = li.find_element_by_css_selector('.company-text .name a').textdata.append(company_name)# 公司类型company_type = li.find_element_by_css_selector('.company-text p a').textdata.append(company_type)# 薪资待遇money = li.find_element_by_css_selector('.red').textmoney = ''.join(money).replace("13薪", '').replace('14薪', '').replace('16薪', '').replace('·', '')if (len(money) > 6): #个别薪资格式不统一,强行用下面代替money = "6-8K"money = ''.join(money).replace('-','000-').replace('K','000')data.append(money)# 经验学历exp = li.find_element_by_css_selector('.job-limit p').textdata.append(exp)# 标签tags = li.find_element_by_css_selector('.tags span').textdata.append(tags)# 福利待遇boon = li.find_element_by_css_selector('.info-desc').textdata.append(boon)#tags = [tag.find_element_by_css_selector('.tag-item') for tag in tags]# print(name,area,company_name,company_type,money,exp,tags,boon)datalist.append(data)# nonextpage = drive.find_element_by_css_selector(".page .disabled")print(data)return datalist
2、通过selenium打开浏览器
我使用的selenium库来爬取的数据,要使用selenium库的话首先要去网上下载浏览器驱动。
这里我展示了几个浏览器驱动的下载和使用方法:
Chrome
点击下载chrome的webdriver: http://chromedriver.storage.googleapis.com/index.html
不同的Chrome的版本对应的chromedriver.exe 版本也不一样,下载时不要搞错了。如果是最新的Chrome, 下载最新的chromedriver.exe 就可以了。
把chromedriver的路径也加到环境变量里。
Firefox
Firefox驱动下载地址为: https://github.com/mozilla/geckodriver/releases/
根据自己的操作系统下载对应的驱动即可,使用的话,需要把驱动的路径和火狐浏览器的路径加入到环境变量里面才可以
IE
IE浏览器驱动下载地址为: http://selenium-release.storage.googleapis.com/index.html
根据自己selenium版本下载对应版本的驱动即可,python的话,下载里面的IEDriverServerxxx.zip即可,这个是区分32和64位系统的,根据自己的系统下载即可,需要注意的是,如果要打开IE浏览器的话,需要在浏览器的Internet选项中的安全页里有4个安全选项,Internet、本地Internet、受信任的站点、受限制的站点,这4个里面都有一个启用保护模式,都需要勾选上才可以,还得把驱动的路径加入到环境变量中。
转载于:https://www.cnblogs.com/nancyzhu/p/8589764.html
(1)打开网页
drive = webdriver.Chrome()
KeyWord = input("请输入你要搜索的岗位关键字")
KeyWords = parse.quote(parse.quote(KeyWord))
# print(KeyWords)
drive.get("https://www.zhipin.com/c101270100/?query="+KeyWords+"&page=1&ka=page-")
drive.implicitly_wait(10)
(2)找到需要的数据
通过css选择器选取所需要的文本信息
在这举一个例子,
其他参数和这个类似!
# 工作名称
name = li.find_element_by_css_selector('.job-name a').text
三、爬取多页数据
我使用css选择器查找到下一页的按钮class=“next"然后用drive.find_element_by_css_selector(”.next")**.click()**模拟用户点击下一页然后跳转到下一页
通过Boss直聘查找岗位发现,Boss直聘最多只会显示10页的岗位数据,所以我就通过for循环爬取10页数据。但是有些岗位的数量又没有10页,可能有7页,8页,因此我就要判断是否到达了最后一页。
通过观察发现最后一页按钮的class=“next disabled”,
所以我就尝试用drive.find_element_by_css_selector(“.next disabled”)来判断最后一页,但是通过测试发现有点问题。
然后我又优化了一下代码drive.find_element_by_css_selector(“.page .disabled”)这样就可以精准的查找的最后一页的特征。
判断是否是最后一页,如果不是,就点击下一页,如果是就保存数据并且退出循环,最后关闭浏览器。
if __name__ == '__main__':for page in range(1,11):print(f'正在爬取第{page}页的数据内容')get_job_info()try:drive.find_element_by_css_selector(".page .disabled")saveDB(datalist)breakexcept:drive.find_element_by_css_selector(".next").click()drive.quit()
四、存储数据
1、创建mysql数据库
创建表的sql语句,%s
和%(KeyWord)可以通过爬取数据时输入的关键词创建不同名的数据库表
sql = 'CREATE TABLE `%s`(`id` int(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(255) DEFAULT NULL,`area` VARCHAR(255) DEFAULT NULL,`company_name` VARCHAR(255) DEFAULT NULL,`company_type` VARCHAR(255) DEFAULT NULL,`money` VARCHAR(255) DEFAULT NULL,`exp` VARCHAR(255) DEFAULT NULL,`tags` VARCHAR(255) DEFAULT NULL,`boon` VARCHAR(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;'%(KeyWord) #创建数据库表
#创建数据库表
def init_db():conn = pymysql.connect(host='127.0.0.1',user='root',password='123',port=3306,charset='utf8',db='boss') #链接数据库sql = 'CREATE TABLE `%s`(`id` int(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(255) DEFAULT NULL,`area` VARCHAR(255) DEFAULT NULL,`company_name` VARCHAR(255) DEFAULT NULL,`company_type` VARCHAR(255) DEFAULT NULL,`money` VARCHAR(255) DEFAULT NULL,`exp` VARCHAR(255) DEFAULT NULL,`tags` VARCHAR(255) DEFAULT NULL,`boon` VARCHAR(255) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;'%(KeyWord) #创建数据库表cursor = conn.cursor()cursor.execute(sql)# print(sql)conn.close()
2、插入数据到mysql数据库
在输入数据时先调用init_db() 函数创建表
#插入数据
def saveDB(datalist):init_db() #创建表conn = pymysql.connect(host='127.0.0.1',user='root',password='123',port=3306,charset='utf8',db='boss')#创建游标cursor = conn.cursor()i = 0for ex in datalist:i = i+1#工作名称name = ex[0]#工作地点area = ex[1]#公司名称company_name = ex[2]#公司类型company_type = ex[3]#薪资待遇money = ex[4]#经验学历exp = ex[5]#标签tags = ex[6]#福利待遇boon = ex[7]try:sql = 'insert into `%s`(name,area,company_name,company_type,money,exp,tags,boon)values("{}","{}","{}","{}","{}","{}","{}","{}")'.format(name,area,company_name,company_type,money,exp,tags,boon)%(KeyWord)cursor.execute(sql)conn.commit()print(f"正在保存第{i}条数据")# print(sql)except:print("数据有问题"+name)cursor.close()conn.close()
mysql数据库中的数据
数据可视化
一、网站模板
我使用模板王下载的网站模板。
模板王:http://www.mobanwang.com/
二、flask框架
1、创建flask项目
2、导入网站模板
将assets文件夹里面的所有文件导入flask中的static文件夹里面。
将html文件放到templates文件夹里面。
3、查询数据展示到网页上
通过sql语句查询需要的数据显示到网页
def search():if request.form.get('question')==None:kw = 'python'else:kw = request.form.get('question')# if len(kw)==0:# kw = "python"conn = pymysql.connect(host='127.0.0.1',user='root',password='123',port=3306,charset='utf8',db='boss') # 链接数据库cur = conn.cursor()S = request.values.get('question')sql = 'select * from `%s`'%(kw)cur.execute(sql)item = cur.fetchall()cur.close()conn.close()
三、echarts图表
在echarts官网找到想要的图表,然后把图表代码放在html代码中。
要使用echarts的模板还需要下载echarts的js文件
echarts官网:https://echarts.apache.org/zh/index.html
通过mysql查询语句查询工资
# 最低工资conn = pymysql.connect(host='127.0.0.1',user='root',password='123',port=3306,charset='utf8',db='boss') # 链接数据库cur = conn.cursor()sql = "SELECT AVG(money1) FROM (SELECT SUBSTRING_INDEX(money,'-',1) as money1 FROM `%s`) as t1" % (kw)cur.execute(sql)lows = cur.fetchall()low = []for datas in lows:low.append(datas[0])low = list(map(int, low))cur.close()conn.close()# 最高工资conn = pymysql.connect(host='127.0.0.1',user='root',password='123',port=3306,charset='utf8',db='boss') # 链接数据库cur = conn.cursor()sql = "SELECT AVG(money1) FROM (SELECT SUBSTRING_INDEX(money,'-',-1) as money1 FROM `%s`) as t1" % (kw)cur.execute(sql)highs = cur.fetchall()high = []for datas in highs:high.append(datas[0])high = list(map(int, high))cur.close()conn.close()avg = (low[0] + high[0]) / 2
将查找到的数据返回到网页
return render_template('table.html', low = low,high = high,avg=avg)
四、词云
#岗位关键词conn = pymysql.connect(host='127.0.0.1',user='root',password='123',port=3306,charset='utf8',db='boss') # 链接数据库cur = conn.cursor()sql = 'select tags from `%s`' % (kw)cur.execute(sql)data = cur.fetchall()text = []for cd in data:text.append(cd[0])# print(item[0])datas = ' '.join(text)print(len(text))cur.close()conn.close()wc = WordCloud(background_color='white',# mask=img_array,font_path="msyh.ttc",# stopwords=exclidewidth=600, height=600,min_font_size=10,max_words=500,max_font_size=400)wc.generate_from_text(datas)# 绘图fig = plt.figure(1)plt.imshow(wc)plt.axis('off') # 是否显示坐标轴# plt.show() # 显示生成的词云图片plt.savefig(f'./static/assets/img/{kw}.jpg', dpi=100) # 输出词云图片
将保存的图片通过img标签显示到网页上
最后附上源代码:
python和网页源代码:https://pan.baidu.com/s/1ha1Sq9KlRkg8kqNEBK55jg
提取码:nula
echarts js文件:https://pan.baidu.com/s/1cBxP5yu4kSugGMJTolA9mg
提取码:l5wg
首次创作,还请大家多多包涵
如有建议,欢迎大家提出!