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

使用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').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,`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 = 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,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=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

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

    来源:网工小王

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用python爬取BOSS直聘岗位数据并做可视化

    发表评论