使用python爬取BOSS直聘岗位数据并做可视化

结果展示

首页

我使用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').text
        data.append(name)
        # 工作地点
        area = li.find_element_by_css_selector('.job-area').text
        data.append(area)
        # 公司名称
        company_name = li.find_element_by_css_selector('.company-text .name a').text
        data.append(company_name)
        # 公司类型
        company_type = li.find_element_by_css_selector('.company-text p a').text
        data.append(company_type)
        # 薪资待遇
        money = li.find_element_by_css_selector('.red').text
        money = ''.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').text
        data.append(exp)
        # 标签
        tags = li.find_element_by_css_selector('.tags span').text
        data.append(tags)
        # 福利待遇
        boon = li.find_element_by_css_selector('.info-desc').text
        data.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)
            break
        except:
            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,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',
        db='boss'
    )
    #创建游标
    cursor = conn.cursor()
    i = 0
    for 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,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',
        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',
        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',-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',
        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=exclide
        width=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

首次创作,还请大家多多包涵
如有建议,欢迎大家提出!

原文地址:https://blog.csdn.net/weixin_45816894

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Jinja2:是Python的Web项目中被广泛应用的模板引擎,是由Python实现的模板语言,Jinja2 的作者也是 Flask 的作者。他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。
Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。
监听QQ消息并不需要我们写代码,因为市面上已经有很多开源QQ机器人框架,在这里我们使用go-cqhttp官方文档:go-cqhttp如果您感兴趣的话,可以阅读一下官方文档,如果不想看,直接看我的文章即可。
【Flask框架】—— 视图和URL总结
python+web+flask轻量级框架的实战小项目。登录功能,后续功能可自行丰富。
有了这个就可以配置可信IP,关键是不需要企业认证,个人信息就可以做。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。
本专栏是对Flask官方文档中个人博客搭建进行的归纳总结,与官方文档结合事半功倍。基础薄弱的同学请戳Flask官方文档教程 本人经验,学习一门语言或框架时,请首先阅读官方文档。学习完毕后,再看其他相关文章(如本系列文章),才是正确的学习道路。 如果python都完全不熟悉,一定不要着急学习框架,请首先学习python官方文档,一步一个脚印。要不然从入门到放弃是大概率事件。 Python 官方文档教程
快到年末了 相信大家都在忙着处理年末数据 刚好有一个是对超市的商品库存进行分析的学员案例 真的非常简单~
一个简易的问答系统就这样完成了,当然,这个项目还可以进一步完善,比如 将数据存入Elasticsearch,通过它先进行初步的检索,然后再通过这个系统,当然我们也可以用其他的架构实现。如果你对这系统还有其他的疑问,也可以再下面进行留言!!!
#模版继承和页面之间的调用@app.route("/bl")def bl(): return render_template("file_2.html")主ht
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和
#form表达提交@app.route("/data",methods=['GET','POST']) #methods 让当前路由支持GET 和
#session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LI
#文件上传@app.route("/file",methods=['GET','POST'])def file(): if request.meth
#跳转操作:redirect@app.route("/red")def red(): return redirect("/login")
#session 使用app.secret_key = "dsada12212132dsad1232113"app.config['PERMANENT_SESSION_LI
@app.route("/req",methods=['GET','POST'])def req(): print(request.headers)
#模版继承和页面之间的调用@app.route("/bl")def bl(): return render_template("file_2.html")主ht
#文件操作:send_file,支持图片 视频 mp3 文本等@app.route("/img")def img(): return send_file("1.jpg&q