栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java爬虫(三)-- 爬虫框架WebMagic的使用(以csdn页面为例)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java爬虫(三)-- 爬虫框架WebMagic的使用(以csdn页面为例)

一、WebMagic介绍

WebMagic是当前比较主流的一款Java爬虫框架。WebMagic项目代码分为核心和扩展两部分。核心部分(webmagic-core)是一个精简的、模块化的爬虫实现(这部分提供非常简单、灵活的API,在基本不改变开发模式的情况下,编写一个爬虫。),而扩展部分则包括一些便利的、实用性的功能(例如注解模式编写爬虫等)。

二、WebMagic组成

WebMagic的设计目标是尽量的模块化,并体现爬虫的功能特点。
WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy,但是实现方式更Java化一些。

1.Downloader
Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了Apache HttpClient作为下载工具。

2.PageProcessor
PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。(在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。)

3.Scheduler
Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。

4.Pipeline
Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。(Pipeline定义了结果保存的方式,如果你要保存到指定数据库,则需要编写对应的Pipeline。对于一类需求一般只需编写一个Pipeline。)

三、使用webmagic爬取csdn示例:

我们通过csdn首页的推荐文章列表,爬取推荐文章信息。

  1. pom文件


    4.0.0

    cn.itcast.crawler
    itcast-crawler-webmagic
    1.0-SNAPSHOT

    
        
        
            us.codecraft
            webmagic-core
            0.7.4
        
        
            us.codecraft
            webmagic-extension
            0.7.4
        
    
    

2、代码示例:

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.JsonFilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;
import java.util.List;

public class DemoPageProcessor implements PageProcessor {

    // 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

    @Override
    // process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑
    public void process(Page page) {
        // 部分二:定义如何抽取页面信息,并保存下来
        String level = page.getRequest().getExtra("level");
       if("parent".equals(level)) {
           List css = page.getHtml().css("li.clearfix").nodes();
           for (Selectable selectable : css) {
               String url =  selectable.xpath("//h2/a/@href").toString();
               // 部分三:从页面发现后续的url地址来抓取
               Request request = new Request();
               request.setUrl(url);
               request.putExtra("level", "child");
               page.addTargetRequest(request);
           }
       }
        else if("child".equals(level)){
           page.putField("title",page.getHtml().xpath("//*[@id="articleContentId"]/text()"));
           page.putField("url",page.getUrl());
                    List labalList = page.getHtml().xpath("//*[@id="mainBox"]/main/div[1]/div/div/div[2]/div[2]/div/a/text()").all();
                    page.putField("label",labalList);

        }
    }

    @Override
    public Site getSite() {
        return site;
    }

   public static void main(String[] args) {

        Request request = new Request();
        request.setUrl("https://blog.csdn.net/?spm=1001.2014.3001.4477");
        request.putExtra("level", "parent");

        Spider.create(new DemoPageProcessor())
                //从csdn首页开始抓
                .addRequest(request)
//                .addPipeline(new JsonFilePipeline("E:\webmagic"))
                .addPipeline(new ConsolePipeline())
                //开启5个线程抓取
                .thread(5)
                //启动爬虫
                .run();
    }
}

3、运行结果
由于我们指定了ConsolePipeline,运行主函数可以在控制台看到爬取结果。

也可以指定其他pipeline,如JsonFilePipeline及路径,运行后可以打开文件夹看到爬取到的结果。
爬取結果:

当然还可以直接导入数据库中,这里就不做演示了。

更多介绍可以参考开发者的技术网站进行学习:http://webmagic.io/docs/zh/

喜欢的朋友欢迎一键三连。我们一起学习,进步~~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/684123.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号