java之网络爬虫介绍(非原创)

文章大纲

一、网络爬虫基本介绍
二、java常见爬虫框架介绍
三、WebCollector实战
四、项目源码下载
五、参考文章

一、网络爬虫基本介绍

1. 什么是网络爬虫

  网络爬虫(又被称为网页蜘蛛,网络机器人,在社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

2. 常见问题介绍

爬虫可以爬取ajax信息么?
  网页上有一些异步加载的数据,爬取这些数据有两种方法:使用模拟浏览器(问题1中描述过了),或者分析ajax的http请求,自己生成ajax请求的url,获取返回的数据。如果是自己生成ajax请求,使用开源爬虫的意义在哪里?其实是要用开源爬虫的线程池和URL管理功能(比如断点爬取)。
  如果我已经可以生成我所需要的ajax请求(列表),如何用这些爬虫来对这些请求进行爬取?
  爬虫往往都是设计成广度遍历或者深度遍历的模式,去遍历静态或者动态页面。爬取ajax信息属于deep web(深网)的范畴,虽然大多数爬虫都不直接支持。但是也可以通过一些方法来完成。比如WebCollector使用广度遍历来遍历网站。爬虫的第一轮爬取就是爬取种子集合(seeds)中的所有url。简单来说,就是将生成的ajax请求作为种子,放入爬虫。用爬虫对这些种子,进行深度为1的广度遍历(默认就是广度遍历)。

爬虫支持多线程么、爬虫能用代理么、爬虫会爬取重复数据么、爬虫能爬取JS生成的信息么?
  能不能爬js生成的信息和爬虫本身没有太大关系。爬虫主要是负责遍历网站和下载页面。爬js生成的信息和网页信息抽取模块有关,往往需要通过模拟浏览器(htmlunit,selenium)来完成。这些模拟浏览器,往往需要耗费很多的时间来处理一个页面。所以一种策略就是,使用这些爬虫来遍历网站,遇到需要解析的页面,就将网页的相关信息提交给模拟浏览器,来完成JS生成信息的抽取。

爬虫怎么保存网页的信息?
  有一些爬虫,自带一个模块负责持久化。比如webmagic,有一个模块叫pipeline。通过简单地配置,可以将爬虫抽取到的信息,持久化到文件、数据库等。还有一些爬虫,并没有直接给用户提供数据持久化的模块。比如crawler4j和webcollector。让用户自己在网页处理模块中添加提交数据库的操作。至于使用pipeline这种模块好不好,就和操作数据库使用ORM好不好这个问题类似,取决于你的业务。

爬虫怎么爬取要登陆的网站?
  这些开源爬虫都支持在爬取时指定cookies,模拟登陆主要是靠cookies。至于cookies怎么获取,不是爬虫管的事情。你可以手动获取、用http请求模拟登陆或者用模拟浏览器自动登陆获取cookie。

爬虫怎么抽取网页的信息?
  开源爬虫一般都会集成网页抽取工具。主要支持两种规范:CSS SELECTOR和XPATH。至于哪个好,这里不评价。

明明代码写对了,爬不到数据,是不是爬虫有问题,换个爬虫能解决么?
  如果代码写对了,又爬不到数据,换其他爬虫也是一样爬不到。遇到这种情况,要么是网站把你封了,要么是你爬的数据是javascript生成的。爬不到数据通过换爬虫是不能解决的。

爬虫速度怎么样?
  单机开源爬虫的速度,基本都可以讲本机的网速用到极限。爬虫的速度慢,往往是因为用户把线程数开少了、网速慢,或者在数据持久化时,和数据库的交互速度慢。而这些东西,往往都是用户的机器和二次开发的代码决定的。

爬虫被网站封了怎么办?
  爬虫被网站封了,一般用多代理(随机代理)就可以解决。但是这些开源爬虫一般没有直接支持随机代理ip的切换。

二、java常见爬虫框架介绍

1. Apache Nutch

(1)官方网站:http://nutch.apache.org/
(2)是否支持分布式:是
(3)可扩展性:中。Apache Nutch并不是一个可扩展性很强的爬虫,它是一个专门为搜索引擎定制的网络爬虫,虽然Apache Nutch具有一套强大的插件机制,但通过定制插件并不能修改爬虫的遍历算法、去重算法和爬取流程。
(4)适用性:Apache Nutch是为搜索引擎定制的爬虫,具有一套适合搜索引擎的URL维护机制(包括URL去重、网页更新等),但这套机制并不适合目前大多数的精抽取业务(即结构化数据采集)。
(5)上手难易度:难。需要使用者熟悉网络爬虫原理、hadoop开发基础及linux shell,且需要熟悉Apache Ant

2. WebCollector

(1)官方网站:https://github.com/CrawlScript/WebCollector
(2)可扩展性:强
(3)适用性:WebCollector适用于精抽取业务。
(4)上手难易度:简单

3. WebMagic

(1)官方网站:http://git.oschina.net/flashsword20/webmagic
(2)是否支持分布式:否
(3)可扩展性:强
(4)适用性:WebMagic适用于精抽取业务。
(5)上手难易度:简单。

4. Crawler4j

(1)官方网站:https://github.com/yasserg/crawler4j
(2) 是否支持分布式:否
(3)可扩展性:低。Crawler4j实际上是一个单机版的垂直爬虫,其遍历算法是一种类似泛爬的算法,虽然可以添加一些限制,但仍不能满足目前大部分的精抽取业务。另外,Crawler4j并没有提供定制http请求的接口,因此Crawler4j并不适用于需要定制http请求的爬取业务(例如模拟登陆、多代理切换)。
(4)上手难易度:简单

三、WebCollector实战

1. WebCollector与传统网络爬虫的区别

  传统的网络爬虫倾向于整站下载,目的是将网站内容原样下载到本地,数据的最小单元是单个网页或文件。而WebCollector可以通过设置爬取策略进行定向采集,并可以抽取网页中的结构化信息。

2. WebCollector与HttpClient、Jsoup的区别

  WebCollector是爬虫框架,HttpClient是Http请求组件,Jsoup是网页解析器(内置了Http请求功能)。
一些程序员在单线程中通过迭代或递归的方法调用HttpClient和Jsoup进行数据采集,这样虽然也可以完成任务,但存在两个较大的问题:
(1)单线程速度慢,多线程爬虫的速度远超单线程爬虫。
(2)需要自己编写任务维护机制。这套机制里面包括了URL去重、断点爬取(即异常中断处理)等功能。
WebCollector框架自带了多线程和URL维护,用户在编写爬虫时无需考虑线程池、URL去重和断点爬取的问题。

3. WebCollector能够处理的量级

  WebCollector目前有单机版和Hadoop版(WebCollector-Hadoop),单机版能够处理千万级别的URL,对于大部分的精数据采集任务,这已经足够了。WebCollector-Hadoop能够处理的量级高于单机版,具体数量取决于集群的规模。

4. WebCollector的遍历

  WebCollector采用一种粗略的广度遍历,但这里的遍历与网站的拓扑树结构没有任何关系,用户不需要在意遍历的方式。
  网络爬虫会在访问页面时,从页面中探索新的URL,继续爬取。WebCollector为探索新URL提供了两种机制,自动解析和手动解析。

5. 代码实战

maven引入依赖

   <dependencies>
        <dependency>
            <groupId>cn.edu.hfut.dmic.webcollector</groupId>
            <artifactId>WebCollector</artifactId>
            <version>2.73-alpha</version>
        </dependency>
    </dependencies>

自动解析

import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;


public class AutoNewsCrawler extends BreadthCrawler {

    public AutoNewsCrawler(String crawlPath, boolean autoParse) {
        super(crawlPath, autoParse);

        this.addSeed("http://news.hfut.edu.cn/list-1-1.html");//种子页面,起始页面

        //正则规则设置 寻找符合http://news.hfut.edu.cn/show-xxxxxxhtml的url
        this.addRegex("http://news.hfut.edu.cn/show-.*html");

        this.addRegex("-.*\\.(jpg|png|gif).*");

        //不要爬取包含 #的URL
        this.addRegex("-.*#.*");

        setThreads(50);//线程数

        getConf().setTopN(100);//设置每次迭代中爬取数量的上限

            //设置是否为断点爬取,如果设置为false,任务启动前会清空历史数据。
            //如果设置为true,会在已有crawlPath(构造函数的第一个参数)的基础上继
            //续爬取。对于耗时较长的任务,很可能需要中途中断爬虫,也有可能遇到
            //死机、断电等异常情况,使用断点爬取模式,可以保证爬虫不受这些因素
            //的影响,爬虫可以在人为中断、死机、断电等情况出现后,继续以前的任务
            //进行爬取。断点爬取默认为false*/
//        setResumable(true);
    }

    /*
        visit函数定制访问每个页面时所需进行的操作
    */
    @Override
    public void visit(Page page, CrawlDatums next) {
        String url = page.url();

        //如果页面地址如何我们要求
        if (page.matchUrl("http://news.hfut.edu.cn/show-.*html")) {

            String title = page.select("div[id=Article]>h2").first().text();//获取url标题

            String content = page.selectText("div#artibody");

            System.out.println("URL:\n" + url);//地址

            System.out.println("title:\n" + title);//标题

            System.out.println("content:\n" + content);//内容

                        /*如果你想添加新的爬取任务,可以向next中添加爬取任务,
               这就是上文中提到的手动解析*/
            /*WebCollector会自动去掉重复的任务(通过任务的key,默认是URL),
              因此在编写爬虫时不需要考虑去重问题,加入重复的URL不会导致重复爬取*/
            /*如果autoParse是true(构造函数的第二个参数),爬虫会自动抽取网页中符合正则规则的URL,
              作为后续任务,当然,爬虫会去掉重复的URL,不会爬取历史中爬取过的URL。
              autoParse为true即开启自动解析机制*/
            //next.add("http://xxxxxx.com");
        }
    }

    public static void main(String[] args) throws Exception {

        AutoNewsCrawler crawler = new AutoNewsCrawler("crawl", true);

        crawler.start(4);//启动爬虫
    }

}

运行接入如下所示:

手动解析

import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;

public class ManualNewsCrawler extends BreadthCrawler {

    public ManualNewsCrawler(String crawlPath, boolean autoParse) {
        super(crawlPath, autoParse);
        /*add 10 start pages and set their type to "list"
          "list" is not a reserved word, you can use other string instead
         */
        for(int i = 1; i <= 10; i++) {

            this.addSeed("http://news.hfut.edu.cn/list-1-" + i + ".html", "list");//种子页面,起始页面
        }

        setThreads(50);//线程数

        getConf().setTopN(100);//设置每次迭代中爬取数量的上限

        //设置是否为断点爬取,如果设置为false,任务启动前会清空历史数据。
        //如果设置为true,会在已有crawlPath(构造函数的第一个参数)的基础上继
        //续爬取。对于耗时较长的任务,很可能需要中途中断爬虫,也有可能遇到
        //死机、断电等异常情况,使用断点爬取模式,可以保证爬虫不受这些因素
        //的影响,爬虫可以在人为中断、死机、断电等情况出现后,继续以前的任务
        //进行爬取。断点爬取默认为false*/
//        setResumable(true);
    }

    /*
       visit函数定制访问每个页面时所需进行的操作
    * */
    @Override
    public void visit(Page page, CrawlDatums next) {
        String url = page.url();

        if (page.matchType("list")) {

            next.add(page.links("div[class=' col-lg-8 '] li>a")).type("content");

        }else if(page.matchType("content")) {

            /*if type is "content"*/
            /*extract title and content of news by css selector*/
            String title = page.select("div[id=Article]>h2").first().text();
            String content = page.selectText("div#artibody", 0);

            //read title_prefix and content_length_limit from configuration
            title = getConf().getString("title_prefix") + title;
            content = content.substring(0, getConf().getInteger("content_length_limit"));

            System.out.println("URL:\n" + url);
            System.out.println("title:\n" + title);
            System.out.println("content:\n" + content);
        }

    }

    public static void main(String[] args) throws Exception {
        ManualNewsCrawler crawler = new ManualNewsCrawler("crawl", false);

        crawler.getConf().setExecuteInterval(5000);

        crawler.getConf().set("title_prefix","PREFIX_");
        crawler.getConf().set("content_length_limit", 20);

        crawler.start(4);//启动爬虫
    }

}

运行结果如下图所示:

四、项目源码下载

链接:https://pan.baidu.com/s/10Ze9xloOpVqmlBOj97XNaQ
提取码:ig45

五、参考文章

  1. https://blog.51cto.com/14059916/2317860
  2. https://blog.csdn.net/acmdream/article/details/70159898
  3. https://blog.csdn.net/lhz15527200472/article/details/77868996
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 33款可用来抓数据的开源爬虫软件工具 要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家。 爬虫,即...
    visiontry阅读 7,280评论 1 99
  • 《这就是搜索引擎》这本书的第二章是关于爬虫的,干货很多(文章几乎没有废话,所以复制居多),可以参考搜索引擎是如何构...
    SeanCheney阅读 2,092评论 0 20
  • 从这篇博客开始来具体的说搜索引擎的每一个核心模块,先从爬虫系统说起吧! 先来个大纲: 1、从爬虫的设计角度看,优秀...
    雨林木风博客阅读 6,529评论 2 16
  • NumPy 高级索引和数组概念 调整图像尺寸 创建视图及副本 翻转图像 花式索引 将位置列表用于索引 布尔索引 分...
    布客飞龙阅读 1,065评论 0 5
  • 俯瞰近半城,览处吟鸣。云低雾浓与人听,想罢征途心未定,她又谁宁。 人生且浮萍,笑过浮云。冷宵飘过枕前清,得罢此生孤...
    沅辛阅读 300评论 4 8