招聘網站技術類詞頻分析_第一版

狂暴棕熊發表於2017-12-28

目標:
大資料專案練習
需求:
從招聘網站上(暫定智聯招聘)爬取招聘資訊,通過詞頻統計,分析企業對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的資料展示,暫時擱置。

相關文章