大数据中数据采集的几种方式
⼤数据中数据采集的⼏种⽅式
⼀、采集⼤数据的⽅法
1.1通过系统⽇志采集⼤数据
⽤于系统⽇志采集的⼯具,⽬前使⽤最⼴泛的有:Hadoop 的Chukwa、ApacheFlumeAFacebook的Scribe和LinkedIn的Kafka等。这⾥主要学习Flume。
Flume是⼀个⾼可靠的分布式采集、聚合和传输系统,Flume⽀持在⽇志系统中定制各类数据发送⽅,⽤于收集数据,同时对数据进⾏简单处理,并写到诸如⽂本、HDFS这些接受⽅中。
Flume的核⼼其实就是把数据从数据源收集过来,再将收集到的数据送到指定的⽬的地……
1.2通过⽹络采集⼤数据
⽹络采集是指通过⽹络爬⾍或⽹站公开API等⽅式,从⽹站上获取⼤数据信息,该⽅法可以将⾮结构化数据从⽹页中抽取出来,将其存储为统⼀的本地数据⽂件,并以结构化的⽅式存储。它⽀持图⽚、⾳频、视频等⽂件或附件的采集。
⼀般来说,⽹络爬⾍⼯具基本可以分类3类:分布式⽹络爬⾍⼯具(Nutch)、Java⽹络爬⾍⼯具(Crawler4j、WebMagic、WebCollector)、⾮Java⽹络爬⾍⼯具( Scrapy)。
1.2.1⽹络爬⾍原理
所谓的⽹络爬⾍,其实是⼀种按照⼀定规则,⾃动地抓取web信息的程序或脚本。
⽹络爬⾍可以⾃动采集所有其能够访问到的页⾯内容,为搜索引擎和⼤数据分析提供数据来源,⼀般有数据采集、数据处理和数据存储三部分功能。
⽹络爬⾍是如何爬数据的? 这是因为⽹页中除了供⽤户浏览的⽂字信息外,还包含⼀些超链接信息,通过获取这些超链接URL,再辅以⼀定的算法,爬⾍就能得到数据了。
1.2.2爬⾍⼯作流程
基本情况下,爬⾍会⾸先获取⼀部分种⼦URL,将这些URL放⼊待抓取URL队列,从队列中取出待抓取URL,解析DNS得到主机IP,并将URL对应⽹页下载储存。最后将这些URL放⼊已抓取队列中,如此循环。
1.2.3爬⾍抓取策略
互联⽹上的⽹页数量以亿级为单位,该以什么样的策略爬这些⽹页的数据成为了⼀个问题,⼤致分为⼏个类型。
通⽤⽹络爬⾍,⼜称为全⽹爬⾍,主要为门户站点搜索引擎和⼤型web服务提供商采集数据,⼜分为深度优先策略和⼴度优先策略。
聚焦⽹络爬⾍,⼜称为主题⽹络爬⾍,是指选择性地爬⾏那些与预先定义好的主题相关的页⾯的⽹络爬⾍。也就是有⼀个明显的主题,⽐如⽂本、⽐如图⽚……聚焦⽹络爬⾍⼜分为⼏种:1.基于内容、2.基于链接结构、3.基于增强学习(?)、4.基于语境(?)增量式⽹络爬⾍,是指获取的⽬标⽹页尽量为新⽹页。
深层⽹络爬⾍,如果将那些传统搜索引擎可以索引的页⾯归属于表层⽹页,那么深层⽹络爬⾍获取的页⾯就是之外的“深层⽹页”。
1.3具体的爬⾍⼯具
1.3.1Scrapy
Scrapy 是⼀个为了爬取⽹站数据、提取结构性数据⽽编写的应⽤框架,可以应⽤在包括数据挖掘、信息处理或存储历史数据等⼀系列的程序中。
虽然Scrpay⾮常强⼤,不过它是适⽤于Python的,⽽本⼈正好⼜没有接触过Python,所以这⼀部分暂且只做了解……
1.3.2Crawler4j、WebMagic、WebCollector
这三者都是JAVA的单机爬⾍开源框架,区别可能是在于算法和调度之类的地⽅?这点搜索了⼀下,都没有能查到,就姑且这样认为吧。
这⾥我就⽤WebMagic做⼀个Demo试⼀试吧!
1.4跑⼀下WebMagic
百度后我到了WebMagic的
照着⾥⾯的例⼦测试⼀下:
⾸先新建⼀个maven项⽬,是不是web项⽬都可以,只要是maven就⾏了。嗯,当然不要maven也可以⼿动导⼊jar包,不过为了⽅便还是使⽤maven吧。
官⽹有⼀个官⽅的简单例⼦
public class GithubRepoPageProcessor implements PageProcessor {
// 部分⼀:抓取⽹站的相关配置,包括编码、抓取间隔、重试次数等
private Site site = ().setRetryTimes(3).setSleepTime(1000);
@Override
// process是定制爬⾍逻辑的核⼼接⼝,在这⾥编写抽取逻辑
女生适合什么专业public void process(Page page) {
// 部分⼆:定义如何抽取页⾯信息,并保存下来
page.putField("author", Url().regex("github\\/(\\w+)/.*").toString());
page.putField("name", Html().xpath("//h1[@class='entry-title public']/strong/a/text()").toString());
if (ResultItems().get("name") == null) {
//skip this page
page.setSkip(true);
}
page.putField("readme", Html().xpath("//div[@id='readme']/tidyText()"));
// 部分三:从页⾯发现后续的url地址来抓取
page.Html().links().regex("(github\\/[\\w\\-]+/[\\w\\-]+)").all());
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
//从"github/code4craft"开始抓
.addUrl("github/code4craft")
//开启5个线程抓取
.thread(5)
//启动爬⾍
.run();
}
}
运⾏⾛⼀波,发现报错了……
log4j:WARN No appenders could be found for logger (us.codecraft.webmagic.scheduler.QueueScheduler).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See /log4j/1.2/faq.html#noconfig for more info.
⼀看就是log4j的问题,尝试添加配置⽂件log4j.properties,再次运⾏,嗯?居然还是报错了……
好吧,看⼀看官⽅⽂档,原来作者说了:
WebMagic使⽤slf4j-log4j12作为slf4j的实现.如果你⾃⼰定制了slf4j的实现,请在项⽬中去掉此依赖。
ok,让我来替换成普通的log4j依赖:
<dependency>
<groupId>org.slf4j</groupId>qq被封号怎么办
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
果不其然,这⼏部操作之后就能正常运⾏了,点击run跑起来!竟然⼜有了新的问题……
[us.codecraft.webmagic.Spider] - Spider github started!
[us.codecraft.webmagic.downloader.HttpClientDownloader] - download page github/code4craft error
难道是⽹络的“不可抗⼒的问题”,所以才失败了?
篮球比赛口号继续寻原因
最后在官⽅⽂档上到了另外⼀个demo,尝试使⽤:
public class SinaBlogProcessor implements PageProcessor {
public static final String URL_LIST = "blog\\.sina\\\\/s/articlelist_1487828712_0_\\d+\\.html";
public static final String URL_POST = "blog\\.sina\\\\/s/blog_\\w+\\.html";
private Site site = Site
.me()
.setDomain("blog.sina")
.setSleepTime(3000)
.setUserAgent(
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
@Override
public void process(Page page) {
//列表页
if (Url().regex(URL_LIST).match()) {
page.Html().xpath("//div[@class=\"articleList\"]").links().regex(URL_POST).all());
page.Html().links().regex(URL_LIST).all());
//⽂章页
} else {
page.putField("title", Html().xpath("//div[@class='articalTitle']/h2"));
page.putField("content", Html().xpath("//div[@id='articlebody']//div[@class='articalContent']"));
page.putField("date",
}
梦见有人杀我}
@Override
中东哪些国家
public Site getSite() {
return site;
}
public static void main(String[] args) {
.run();
}
}美国保健品排名
嗯,这个demo爬的是博客的数据,没有了“不可抗⼒的问题”,果然这回就成功了。
总结
数据的采集⼤概就是通过系统⽇志获取和通过爬⾍获取这两种,虽然试验了爬⾍中的WebMagic⽅式,不过也只是简单的跑起来⽽已,中间想要修改代码达成⾃⼰想要的结果,不过因为时间问题,⽽且其中⽤到的正则表达式我并没有系统学过,所以也只能遗憾收⼿,将这个念想留到以后再继续实现。
参考

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。