大数据 爬取网站并分析数据

2023-10-29

大数据+爬取前程无忧校园招聘+flume+hive+mysql+数据可视化

自己搭建的hadoop博客

我搭建了hadopp伪分布式和分布式,记录在我的博客中
伪分布式链接:https://blog.csdn.net/ysy_1_2/article/details/106615430
完全分布式链接:https://blog.csdn.net/ysy_1_2/article/details/106260140
在这里插入图片描述

1.爬取前程无忧网页和校园招聘

在这里插入图片描述

1.1用scrapy爬取前途无忧网站,我爬了10w多条数据,在存入MongoDB中.

# -*- coding: utf-8 -*-
import scrapy

from qianchengwuyou.items import QianchengwuyouItem


class QiangchengSpider(scrapy.Spider):
    name = 'qiangcheng'
    allowed_domains = ['51job.com']
    start_urls = ["https://search.51job.com/list/000000,000000,0000,00,9,99,%2520,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="]

    def parse(self, response):
        job_list = response.xpath("//div[@class='dw_table']//div[@class='el']/p[1]//span/a/@href").getall()
        for i_items in job_list:
            yield scrapy.Request(url=i_items,callback=self.jiexi_content,dont_filter=True)
        #获取下一页的href
        next_pages = response.xpath("//div[@class='p_in']//li[last()]/a/@href").get()
        if next_pages:
            yield scrapy.Request(url=next_pages,callback=self.parse,dont_filter=True)

    def jiexi_content(self,response):
        item = QianchengwuyouItem()
        item['job_name'] = response.xpath("//div[@class='cn']/h1/text()").extract_first()
        try:
            item['job_money']  = response.xpath("//div[@class='cn']/strong/text()").extract_first()
        except:
            item['job_money'] = "面议"
        item['job_company'] = response.xpath("//div[@class='cn']//a[1]/text()").extract_first()
        #抓取所有工作地点和教育程度
        job_all = response.xpath("//div[@class='cn']//p[2]/text()").getall()
        #对抓取的列表进行分割取出,列表中包含了工作地点和工作经历和教育程度.
        try:
            item['job_place'] = job_all[0].strip()
        except:
            item['job_place'] = ""
        try:
            item['job_experience'] = job_all[1].strip()
        except:
            item['job_experience'] = '无要求'
        try:
            item['job_education'] = job_all[2].strip()
        except:
            item['job_education'] = '不要求'

        #对所有岗位职责和任务进行提取,都爬取了的,爬取的岗位职责和任职要求
        job_content = response.xpath("//div[@class='bmsg job_msg inbox']/p/text()").getall()
        job_nz = []
        #遍历循环取得岗位职责和任职要求的数据添加到job_nz[]中,在取出数据.
        for job_nzs in job_content:
            job_nz.append(job_nzs)
        try:
            item['job_nz'] = job_nz
        except:
            item['job_nz'] = "上岗安排"
        yield item

校园招聘
在这里插入图片描述

1.2.存入Mogodb中,设置管道和setting.

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html

import pymongo
from scrapy.utils.project import get_project_settings
settings = get_project_settings()

class QianchengwuyouPipeline:
    def __init__(self):
        pass
        # 链接数据库
        client = pymongo.MongoClient(host=settings['MONGO_HOST'], port=settings['27017'])
        self.db = client[settings['MONGO_DB']]  # 获得数据库的句柄
        self.coll = self.db[settings['MONGO_COLL']]  # 获得collection的句柄
        #数据库登录需要账号密码的话
        #self.db.authenticate(settings['MONGO_USER'], settings['MONGO_PSW'])

    def process_item(self, item, spider):
        pass
        postItem = dict(item)  # 把item转化成字典形式
        self.coll.insert(postItem)  # 向数据库插入一条记录
        return item  # 会在控制台输出原item数据,可以选择不写

    def close(self):
        close.client.close()

setting中设置
在这里插入图片描述

1.3.从cmd里面mogodb/bin目录下导出数据

1.3.1 导出命令

 mongoexport -d dbname(你的数据库名) -c user(要导出的表) -f locations(要导出的字段) --type=csv -o D:\我导入的是当前目录(你要导入的目录).

其中,"d"是使用Mongo数据库,"c"指的是数据库集合(也就是数据库表),"f"指的是域(也就是要导出的数据字段),"0"指的是csv文件的输出路径.

1.3.2 对导出数据做清洗

导出csv文件,对文件作出清洗
在这里插入图片描述

2.我对文件清洗过后变为txt文件.传入linux中

在我的主机创建data文件夹,存入txt文件.
在这里插入图片描述

2.1转换格式问题,我的数据从138MB变为了100MB.

在这里插入图片描述

2.2通过flume向hdfs传输数据,创建qiangcheng.conf文件,写入flume传输代码.

flume命令:

./flume-ng agent -n a1 -c ../conf -f ../conf/qiangcheng.conf -Dflume.root.logger=INFO,console

在这里插入图片描述

2.3遇到报错信息,由于日志信息过大.

在这里插入图片描述

2.4解决方案:

在lfume下的conf/flume-env.sh下文件添加:

export JAVA_OPTS="-Xms512m -Xmx1024m -Dcom.sun.management.jmxremote"

在这里插入图片描述

2.5可以看到我上传的文件.

在这里插入图片描述

2.5.1 对上传的数据进行合并

hadoop fs -cat /qiangcheng/2020-07-13_21/* | hadoop fs -put - /qiangcheng/2020-07-13_21

在这里插入图片描述

2.5.2对合并的文件修改文件名为qiangc.

在这里插入图片描述

2.5.3 下载hdfs上的文件我们可以看到数据以制表符为分隔,我改成了以" ` "这个符号分隔.

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述

2.6 重新上传一遍以" ` "分隔符来对数据进行分隔. 在对hdfs文件进行改写.上传分隔好的数据.在传入flume中.

在这里插入图片描述

2.7对数据进行清洗后.在hive中创建数据表.

在这里插入图片描述

create table qiangcheng(
id varchar(30),
jobname varchar(30),
jobmoney int,
jobcompany varchar(30),
jobdate DATE,
jobplace varchar(30),
jobexperience varchar(30),
jobneirong varchar(2000))
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties('input.regex'='(.*)`(.*)`(.*)`(.*)`(.*)`(.*)`(.*)`(.*)',
'output.format.string'='%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s %10$s %11$s')
stored as textfile;

3.对hdfs中清洗的数据,创建表导入hdfs上的数据.

在这里插入图片描述

3.2从hdfs导入数据到hive,导入数据成功.

在这里插入图片描述

4.创建caiji表装自己想要的数据,来装取数据采集表

在这里插入图片描述

4.1 可以看到我们获得的数据.

在这里插入图片描述

5.把大数据工程师的数据插入到数据caiji当中.

在这里插入图片描述

5.1导入大数据工程师数据成功

在这里插入图片描述

5.1.2查看大数据工程师的数据.

在这里插入图片描述
在这里插入图片描述

6.把数据分析的数据插入到数据表caiji当中.

在这里插入图片描述

6.1插入数据分析成功

在这里插入图片描述

6.1.2查看我们的采集表(有数据、大数据工程师、数据分析).

在这里插入图片描述

7.现在对caiji表进行分析.

7.1我们要对jobmoney的工资进行数据分析.

7.1.1分析"数据分析",“大数据开发工程师”,"数据采集"等岗位的平均工资、最高工资、最低工资,做条形图展示.

7.1.2创建一个表用来计算所有数据的最大值、最小值、平均值.

在这里插入图片描述

7.1.3通过查看所有数据,发现jobmoney数据有为null的数据,所以对jobmoney为null的数据不要.

在这里插入图片描述

7.1.4 修改jobmoney为null的数据成功.

在这里插入图片描述

7.1.5计算数据分析的工资.

在这里插入图片描述

7.1.6由于数据少对数据进行模糊查询.

在这里插入图片描述

7.1.7可以的三个数据的最高工资、最低工资、和平均工资.

在这里插入图片描述

7.1.8我们创建三个表,来看个给地区的岗位数.

在这里插入图片描述

7.1.9我们来看各个地区的岗位数.

在这里插入图片描述

7.1.10 数据分析岗位数

在这里插入图片描述

7.1.11 大数据分析师岗位数

在这里插入图片描述

7.1.12 数据采集岗位数

8.我们来看工作个几年工作经验计算工资.

在这里插入图片描述

8.1 创建几年工资经验表(sannianggongzi).

在这里插入图片描述

8.2 把数据重dashujujingyan插入到sannianggongzi表

在这里插入图片描述

8.2.1 查看大数据岗位三年工资数据.

在这里插入图片描述

9.分析大数据岗位需求,查看大数据走向,做折线图展示.

9.1 创建数据表

在这里插入图片描述

把数据分割
在这里插入图片描述

9.2 查看数据表的内容

在这里插入图片描述

10.hive导入数据到HDFS

以下是我的数据

caiji 是大数据工程和数据分析和数据采集
allshuju 是三个数据采集和数据开发的平均最低最高工资
dashuju 是大数据各地区岗位个数
fenxi 是数据分析各个岗位的个数
shujucaiji 是数据采集岗位个数
dashujujingyang 是大数据三年经验
dashujudata 日期是几年的折线图
sannianggongzi 是大数据三年的工资
select * from hive_db; --> 需要导出的内容
# 数据分析表饼图
insert overwrite directory '/qiangcheng/1'
row format delimited fields terminated by '\t'
select * from fenxi;
#大数据开发工程师饼图
insert overwrite directory '/qiangcheng/2'
row format delimited fields terminated by '\t'
select * from dashuju;
# 数据采集饼图
insert overwrite directory '/qiangcheng/3'
row format delimited fields terminated by '\t'
select * from shujucaiji ;
#1-3年
insert overwrite directory '/qiangcheng/4'
row format delimited fields terminated by '\t'
select * from sanniangongzi;
# 三个职业薪资水平
insert overwrite directory '/qiangcheng/5'
row format delimited fields terminated by '\t'
select * from allshuju 
# 带日期的表
insert overwrite directory '/qiangcheng/6'
row format delimited fields terminated by '\t'
select * from dashujudata 

10.1hive上传到hdfs在这里插入图片描述

11.利用sqoop传入到mysql

11.1连接我的本地mysql

在这里插入图片描述

11.2创将数据表

在这里插入图片描述

11.3利用sqoop上传到mysql上.

命令

sqoop export --connect jdbc:mysql://127.0.0.1:3306/qianc --username root --password 12345678 --table dashujugongchengshi --export-dir  '/qiangcheng/2' --fields-terminated-by '\t' -m 1

在这里插入图片描述

11.3.1 sqoop导入mysql数据表

在这里插入图片描述

12.数据可视化

import pymysql
from pyecharts.charts import Bar
from pyecharts import options as opts

db = pymysql.connect(host="192.168.127.9",port=3306,database="qianc",user='root',password='12345678')
cursor = db.cursor()
sql = "select * from shujusannianmoney"
cursor.execute(sql)
data = cursor.fetchall()
print(data)
jobname = [data[0][0], data[1][0], data[2][0]]
print(jobname)
min_list = [data[0][2], data[1][2], data[2][2]]
max_list = [data[0][3], data[1][3], data[2][3]]
average_list = [data[0][1], data[1][1], data[2][1]]
bar = Bar()
bar.add_xaxis(xaxis_data=jobname)
# 第一个参数是图例名称,第二个参数是y轴数据
bar.add_yaxis(series_name="最低工资", y_axis=min_list)
bar.add_yaxis(series_name="最高工资", y_axis=max_list)
bar.add_yaxis(series_name="平均工资", y_axis=average_list)
# 设置表的名称
bar.set_global_opts(title_opts=opts.TitleOpts(title='职位工资分析', subtitle='工资单位:万/月'), toolbox_opts=opts.ToolboxOpts(),
                    )
bar.render("岗位薪资图.html")

12.1 三年工资薪资图

在这里插入图片描述

12.2 数据分析饼图岗位地区个数

代码

import pymysql
from pyecharts.charts import Pie
from pyecharts import options as opts
db = pymysql.connect(host="192.168.127.9",port=3306,database="qianc",user='root',password='12345678')
cursor = db.cursor()
sql = "select * from fenxi"
cursor.execute(sql)
data = cursor.fetchall()
print(data)
addr = ["北京","成都","广州","上海","深圳"]
geshu = [data[0][1],data[1][1],data[2][1],data[3][1],data[4][1]]
data_pair = [list(z) for z in zip(addr, geshu)]
data_pair.sort(key=lambda x: x[1])
# 画饼图
c = (
        Pie()
        .add("", [list(z) for z in zip(addr,geshu)])
        .set_global_opts(title_opts=opts.TitleOpts(title="数据分析工程师地区岗位数",subtitle='单位:个数'),toolbox_opts=opts.ToolboxOpts())
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
    ).render("数据分析工程师地区岗位数.html")

在这里插入图片描述

12.3 大数据岗位分析图

在这里插入图片描述

12.4 数据采集

在这里插入图片描述

12.5 大数据1-3年经验工资

在这里插入图片描述

12.3 折线图

import pymysql
from pyecharts.charts import Line
from pyecharts import options as opts

db = pymysql.connect(host="192.168.127.9",port=3306,database="qianc",user='root',password='12345678')
cursor = db.cursor()
sql = "select * from dashujuriqi"
cursor.execute(sql)
data = cursor.fetchall()
riqi = []
geshu = []
for i in data:
    riqi.append(str(i[0]))
    geshu.append(str(i[1]))
print(geshu)
print(riqi)
data_pair = [list(z) for z in zip(riqi, geshu)]
data_pair.sort(key=lambda x: x[1])

(
    Line(init_opts=opts.InitOpts(width="1000px", height="600px"))
    .set_global_opts(
        tooltip_opts=opts.TooltipOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(type_="category"),
        yaxis_opts=opts.AxisOpts(
            type_="value",
            axistick_opts=opts.AxisTickOpts(is_show=True),
            splitline_opts=opts.SplitLineOpts(is_show=True),
        ),
    )
    .add_xaxis(xaxis_data=riqi)
    .add_yaxis(
        series_name="大数据岗位需求变化趋势",
        y_axis=geshu,
        symbol="emptyCircle",
        is_symbol_show=True,
        label_opts=opts.LabelOpts(is_show=False),
    )
    .render("大数据岗位需求变化趋势.html")
)

在这里插入图片描述

13.总结

爬取招聘网站,使用hadoop、flume、mysql、hive、sqoop、python、scrapy、pyerchart、pymysql、运用这些知识,在做当中,我对hdfs和大数据flume传输更加熟悉,遇到很多问题,也能慢慢去解决这些问题.收获到了很多知识.对学习到的知识,能够运用.也明白自己很多不足,要继续努力去学习.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大数据 爬取网站并分析数据 的相关文章

  • unity学习-委托(delegate),事件(event),Action,Func

    unity学习 委托 含义 定义 使用 事件 含义 使用 在进行项目的过程中 一直存在着对代码管理不当的问题 所以需要学习一些科学的代码思维 减少后期功能的修改与迭代引发的代码冗杂和内存爆炸 可以看b站这个大神的视频 讲的可以说无敌详细了

随机推荐

  • echarts问题记录

    X轴最后一个刻度标签加粗 问题描述 如图最后一个刻度标签加粗 解决 是因为加了interval 0导致 这个属性又不能去掉 查看文档发现可以使用function 改为interval gt true axisLabel interval g
  • ros下src中的CMakeLists.txt解析

    toplevel CMakeLists txt for a catkin workspace catkin cmake toplevel cmake src下的CMakeLists txt是由toplevel生成的 cmake minimu
  • makefile报错makefile:7: *** missing separator. Stop.

    解决方案 打开vim vimrc 添加 autocmd FileType make set noexpandtab
  • RabbitMQ启动后无法访问http://localhost:15672等问题

    今天重启电脑后遇到了这个问题 rabbitmq服务启动后无法访问localhost 15672 同时项目也无法连接rabbitmq服务 研究了半天终于解决了 下面整理一下解决过程留作备份以及给同样遇到这个问题的人做一个参考 1 找到rabb
  • 代码例子区全区搜索索引(27th Feb 2011 Updated)

    如果以下的链接有错误 或者存在其他问题 请给我发站内短信 或者发送邮件至nono cocoa gmail com希望该帖对大家有帮助 IOS 类代码 我自己做的翻书效果 小猫咪再次登场 2011 03 02 如何实现QQLive HD界面
  • IDEA快速提取maven项目依赖版本号

    操作步骤 提取版本号 1 在pom xml文件中选中需要提取的版本号 2 键入快捷键 ctrl alt v 3 在弹出窗口中设定Name和Project Name为版本号的变量名 Project表示变量提取后存放位置 即放到哪个项目的pom
  • php mysql ajax搜索提示键盘_php+ajax做仿百度搜索下拉自动提示框(有实例)

    php mysql ajax实现百度搜索下拉提示框 主要有3个文件三个文件在同一个目录里 如下图 下面是三个文件的代码 把sql文件导入到mysql数据库里 修改下数据库密码为自己的 记得哦是UTF 8编码 php mysql ajax实现
  • 使用tailwind+next.js写一个github页面进行学习

    目的是学习tailwind语法 如果你也想照着敲可以参考这个视频 点击即刻跳转 仓库地址 点击即刻跳转 不想重复的创建仓库 我的所有内容都在该仓库 只是会通过创建分支来写项目 写的过程发现之前的一些疏忽吧 jsx后缀的尽量就不要写成js后缀
  • CoreDNS篇8-健康检查

    本文主要讲解介绍CoreDNS内置的两个健康检查插件health和ready的使用方式和适用场景 1 health插件 health插件默认情况下会在8080端口的 health路径下提供健康状态查询服务 当CoreDNS服务正常的时候 会
  • win10环境变量设置

    在装一些软件的时候 经常需要设置环境变量 但win10与win7有一些不同 1 打开文件资源管理器 2 最左边一列有 此电脑 点击 3 界面最上面一列会有 属性 点击 4 左边 高级系统设置 点击 5 环境变量 点击 有一个注意的地方是一般
  • VBA解析JSON

    前言 vba作为一种古老的语言 是不能直接处理json数据的 但是好在可以加载其他语言的执行引擎 间接的达到解析JSON的目的 示例代码 Public Function JsonParse jsonStr As String As Obje
  • 三输入或门(发现这个玩意很不好耍,编程出现错误,不知道哪里出现的,一不小心2输成3也无法查证)...

    1 timescale 1ns 1ps 2 module or3 3 x1 4 x2 5 x3 6 z1 7 8 input x1 x2 x3 9 output z1 10 11 wire x1 x2 x3 12 reg z1 13 alw
  • __autoload()不执行的解决办法spl_autoload_register();

    在php5之后已经有了类的自动加载机制 可以定义 autoload函数 在使用到某个未定义的类 执行php会出错 但是在此时php引擎在返回失败之前会去check下是否有定义 autoload去加载需要的类 但是 今天晚上 autoload
  • 原生Photoshop2022 for Mac v23.4最新中文版功能介绍 PS2022苹果安装教程支持M1,解决安装ps提示不存在、Error may be damaged已损坏等问题

    PS2022中文激活版是一款高效 专业 实用的图像处理软件 其以其强悍的编辑和调整 绘图等功能 从而受到了广泛的应用 不管是在各种图片的调整和图画绘制以及图像的修复 调色等工具都是数不胜数的 用户可以从自己照片修饰到海报 包装 横幅的制作以
  • 【Java项目】拉取公司GitLab项目的教程

    文章目录 创建Git账号 登录Git 创建Git账号 进入公司后 会拿到公司给你注册的邮箱以及密码 你得到用户名和密码之后 需要先创建一个拉取这个仓库对应的git账号 我们先登录GitLab 当你登录GitLab之后 会显示你还没有ssh
  • STM32 嵌入式开发常用网站推荐

    作者 蚂蚁会游泳 日期 2022 06 11 前言 本文推荐了一些做嵌入式软硬件开发常用到的网站 一 资料下载 正点原子资料下载中心 描述 该网站可以下载正点原子各种开发板的软件资料 网址 http www openedv com docs
  • 机器学习——特征工程和评价指标

    0 前言 首先学习特征工程这部分知识之前 要对机器学习的算法用过使用 1 特征工程 就机器学习的数据而言 特征就是数据的列名 有多少列 就有多少个维度的特征 就定义而言 特征是指数据中抽取出来对结果预测有用的信息 特征工程就是使用一些技巧来
  • 64位java8,jdk8下载,解压版

    JAVA8使用量非常广泛 但是找下往往都是安装版的 想我这种人直接自己配置环境变量用 十分不想搞个安装版 下面是解压版的 下面是打印出的version信息 wndows版本的 下面是java version的信息 直接拿走 java ver
  • 关于在linux(Ubuntu 18.04.1 LTS)环境中安装并使用AppImageLauncher

    安装步骤 1 去github上下载AppImageLauncher deb 文件 2 在下载文件所在文件夹下打开终端输入 sudo dpkg f filename deb 3 报错提示缺少依赖项 则继续输入一下内容 sudo apt get
  • 大数据 爬取网站并分析数据

    大数据 爬取前程无忧校园招聘 flume hive mysql 数据可视化 自己搭建的hadoop博客 1 爬取前程无忧网页和校园招聘 1 1用scrapy爬取前途无忧网站 我爬了10w多条数据 在存入MongoDB中 1 2 存入Mogo