招聘网站技术类词频分析_第一版

目标:
大数据项目练习
需求:
从招聘网站上(暂定智联招聘)爬取招聘信息,通过词频统计,分析企业对IT人才需求
使用框架:
平台:阿里云
爬虫:scrapy
https://docs.scrapy.org/en/latest/index.html
中文分词:结巴中文分词
https://github.com/fxsjy/jieba
日志收集:Flume
数据计算平台:Hadoop
流程
1.通过爬虫爬取指定岗位的招聘信息
2.使用结巴分词对招聘信息进行分词,生成待处理文件
3.使用Flume定期收集文件
4.使用MapReduce完成名词过滤与统计等工作
5.使用Hive完成数据入库
6.通过Hue展示数据

进度记录
1.Scrapy安装
没有再Windows下安装Scrapy,原因是看到网上好多文章说在Windows下配置环境十分麻烦,所以直接在CentOS7下安装了

yum -y update
yum install gcc libffi-devel python-devel openssl-devel
yum groupinstall -y development
yum install libxslt-devel
yum install python-setuptools
easy_install pip
easy_install lxml
pip install scrapy

运行scrapy startprojcet xxx如果出错的话,我这里是因为twisted的版本不正确,执行以下命令,安装指定版本的twisted就可以了。

sudo pip install twisted==13.1.0

启动爬虫的方法

scrapy crawl xxx

2.安装结巴分词

easy_install jieba

结巴分词可以添加自定义字典便于修正错误的分词

3.在信息收集阶段
①使用结巴分词对招聘信息进行词语分割,此时对数据进行预处理,将标点符号(这里要考虑到全角和半角标点)和数字都去除掉,然后形成的每条招聘信息的格式为:列以“\t\t”分割,切出的词以”\t”分割
这里的分割不能以,等在招聘信息中可能出现的符号做分割,否则会出现识别错乱的问题,也不能以空格分割,因为有些技术的英文描述可能包括空格。

title   url             切割后的招聘信息
xxxx    http://xxxx     xxx yyy zzz xxx

②可以以多个关键字作为招聘信息收集的根页面,例如我选取了“Spark”,“hadoop”,“大数据”。把这些url设置为start_urls,但是这样就会出现搜索重复的问题,所以需要用bloomfilter对url进行过滤去重。
安装bloomfilter的方法

sudo pip install pybloomfiltermmap

bloomfilter的使用方法参考以下blog:
http://blog.csdn.net/zcc_0015/article/details/50608063
③在项目里我为了不爬到太久远的数据,所以在爬虫中设置了页数限制,当达到页数限制后,计数器归零,爬虫从下一个start_url开始重新爬数据。

4.使用Flume手机爬虫爬下来的数据,导入到hdfs中
①flume的安装比较简单,只需要解压,配置conf目录下的flume-env.sh中的JAVA_HOME即可
②要注意的是flume对Java的版本要求,由于我装的是Java7,所以Flume最高只能用1.6的,1.7以上需要Java8
③测试flume是否能够正确运行在bin目录下执行

flume-ng version

④flume的使用完全依赖于配置文件

agent1.sources = spooldirSource
agent1.channels = fileChannel
agent1.sinks = hdfsSink

agent1.sources.spooldirSource.type=spooldir
agent1.sources.spooldirSource.spoolDir=/home/hadoop/PyWorkspace/myspider/data
agent1.sources.spooldirSource.channels=fileChannel

agent1.sinks.hdfsSink.type=hdfs
agent1.sinks.hdfsSink.hdfs.path=hdfs://hadoop000:8020/flume/cys
agent1.sinks.hdfsSink.hdfs.filePrefix=%y-%m-%d
agent1.sinks.hdfsSink.hdfs.idleTimeout=3
agent1.sinks.sink1.hdfs.round = true
# Number of seconds to wait before rolling current file (0 = never roll based on time interval)
agent1.sinks.hdfsSink.hdfs.rollInterval = 3600
# File size to trigger roll, in bytes (0: never roll based on file size)
agent1.sinks.hdfsSink.hdfs.rollSize = 0
agent1.sinks.hdfsSink.hdfs.rollCount = 0
agent1.sinks.hdfsSink.hdfs.batchSize = 1000

#Rounded down to the highest multiple of this (in the unit configured using hdfs.roundUnit), less than current time.
agent1.sinks.hdfsSink.hdfs.roundValue = 1
agent1.sinks.hdfsSink.hdfs.roundUnit = minute
agent1.sinks.hdfsSink.hdfs.useLocalTimeStamp = true
agent1.sinks.hdfsSink.channel=fileChannel
agent1.sinks.hdfsSink.hdfs.fileType = DataStream

agent1.channels.fileChannel.type = file
agent1.channels.fileChannel.checkpointDir=/home/hadoop/app/flume-1.6.0/bin/checkpoint
agent1.channels.fileChannel.dataDirs=/home/hadoop/app/flume-1.6.0/bin/dataDir

启动方法

./flume-ng agent -f ../conf/hdfs.conf -n agent1 -Dflume.root.logger=INFO,console

Flume采用了spooldirSource的模式来收集文件

spooldirSource源允许您通过将要提取的文件放入磁盘上的“spooling”目录中来提取数据。此源将监视新文件的指定目录,并在新文件显示时解析新文件中的事件。事件解析逻辑是可插入的。在给定文件被完全读入通道之后,它被重命名以指示完成(或可选地被删除)。

因为放入检测目录的文件不能被修改,所有爬虫爬到的数据将先缓存在其他目录当中,但完成数据收集工作之后,再将文件移动到spooldir文件夹中。将文件移动到spooldir的操作是在爬虫的spider_closed()方法中完成的。应该也可以用Kafka的工作流实现。

5.原本想在项目里加入Azkaban实现昨天调度,不过,这个项目实在是有点太简单了,决定放弃使用框架实现作业调度,用shell应该也能实现。
ps:已经使用shell完成了工作调度

6.使用MR基本实现了原有的功能设想,但是当需要进行扩充的时候,想要实现更复杂的数据处理,用MR就有点复杂了,可以采用MR对源数据进行ETL,再使用Hive来进行数据统计。

7.使用Python进行分词也存在一些问题,就是爬数据和分词放在一起之后,生成的数据就是经过分词处理的,有的时候会出现分词错误的情况,这个时候就需要重新爬一遍数据才能完成新的分词工作。这点非常的不好,所以应该把分词工作放在后面,爬虫只负责收集数据,不负责任何形式的数据处理,这样,收集来的数据就不用因为修改逻辑而无法使用了。

Hive实现数据分析和Hue的数据展示,暂时搁置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值