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

大数据+爬取前程无忧校园招聘+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传输更加熟悉,遇到很多问题,也能慢慢去解决这些问题.收获到了很多知识.对学习到的知识,能够运用.也明白自己很多不足,要继续努力去学习.
  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值