使用python爬取BOSS直聘岗位数据并做可视化(Boss直聘对网页做了一些修改,现在的代码已经不能用了)

编程入门 行业动态 更新时间:2024-10-26 00:31:11

使用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/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('pany-text .name a').text
        data.append(company_name)
        # 公司类型
        company_type = li.find_element_by_css_selector('pany-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/index.html
不同的Chrome的版本对应的chromedriver.exe 版本也不一样,下载时不要搞错了。如果是最新的Chrome, 下载最新的chromedriver.exe 就可以了。
把chromedriver的路径也加到环境变量里。

Firefox
Firefox驱动下载地址为: https://github/mozilla/geckodriver/releases/
根据自己的操作系统下载对应的驱动即可,使用的话,需要把驱动的路径和火狐浏览器的路径加入到环境变量里面才可以

IE
IE浏览器驱动下载地址为: http://selenium-release.storage.googleapis/index.html
根据自己selenium版本下载对应版本的驱动即可,python的话,下载里面的IEDriverServerxxx.zip即可,这个是区分32和64位系统的,根据自己的系统下载即可,需要注意的是,如果要打开IE浏览器的话,需要在浏览器的Internet选项中的安全页里有4个安全选项,Internet、本地Internet、受信任的站点、受限制的站点,这4个里面都有一个启用保护模式,都需要勾选上才可以,还得把驱动的路径加入到环境变量中。
转载于:https://wwwblogs/nancyzhu/p/8589764.html

(1)打开网页

drive = webdriver.Chrome()
KeyWord = input("请输入你要搜索的岗位关键字")
KeyWords = parse.quote(parse.quote(KeyWord))
# print(KeyWords)
drive.get("https://www.zhipin/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/

二、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/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/s/1ha1Sq9KlRkg8kqNEBK55jg
提取码:nula
echarts js文件:https://pan.baidu/s/1cBxP5yu4kSugGMJTolA9mg
提取码:l5wg

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

更多推荐

使用python爬取BOSS直聘岗位数据并做可视化(Boss直聘对网页做了一些修改,现在的代码已经不能用了)

本文发布于:2023-06-14 08:45:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1457582.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:用了   并做   岗位   代码   网页

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!