欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

webmagic爬虫--爬取简单网页

程序员文章站 2022-05-02 20:49:52
...

WebMagic框架包含四个组件,PageProcessorSchedulerDownloaderPipeline。

这四大组件对应爬虫生命周期中的处理管理下载持久化等功能。

这四个组件都是Spider中的属性,爬虫框架通过Spider启动和管理。

 

 

PageProcessor 负责解析页面,抽取有用信息,以及发现新的链接。需要自己定义。

Scheduler 负责管理待抓取的URL,以及一些去重的工作。一般无需自己定制Scheduler

Pipeline 负责抽取结果的处理,包括计算、持久化到文件、数据库等

Downloader 负责从互联网上下载页面,以便后续处理。一般无需自己实现。

 

用于数据流转的对象

Request 是对URL地址的一层封装,一个Request对应一个URL地址。

Page 代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容。

ResultItems 相当于一个Map,它保存PageProcessor处理的结果,供Pipeline使用。

 

步骤:

1.首先引入jar包

<dependency>
  <groupId>us.codecraft</groupId>
  <artifactId>webmagic-core</artifactId>
  <version>0.7.3</version>
</dependency>
<dependency>
  <groupId>us.codecraft</groupId>
  <artifactId>webmagic-extension</artifactId>
  <version>0.7.3</version>
</dependency>

2.写实现类

package com.webmagic;

import us.codecraft.webmagic.*;
import us.codecraft.webmagic.pipeline.Pipeline;
import us.codecraft.webmagic.processor.PageProcessor;

import java.util.Iterator;
import java.util.Map;
//完成虎扑新闻的标题和内容的爬取
public class MyCnblogsSpider implements PageProcessor {
   //抓取网站的相关配置 包括编码 抓取间隔 重试次数
    private Site site = Site.me().setRetryTimes(3).setSleepTime(100).setCharset("utf8");

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

    @Override
    public void process(Page page) {
       //如果是文章页面 满足正则表达式
        if(page.getUrl().regex("https://voice\\.hupu\\.com/nba/[0-9]{7}\\.html").match()) {
            //对需要的文章内容进行爬取
            page.putField("Title", page.getHtml().xpath("/html/body/div[4]/div[1]/div[1]/h1/text()").toString());
            page.putField("Content", page.getHtml().xpath("/html/body/div[4]/div[1]/div[2]/div/div[2]/p/text()").all().toString());
        }
        else {
            // 文章url
            page.addTargetRequests(
                    page.getHtml().xpath("/html/body/div[3]/div[1]/div[2]/ul/li/div[1]/h4/a/@href").all());
            // 翻页url
            page.addTargetRequests(
                    page.getHtml().xpath("/html/body/div[3]/div[1]/div[3]/a[@class='page-btn-prev']/@href").all());
        }


    }
    public static void main(String args[]){
        Spider.create(new MyCnblogsSpider()).addUrl("https://voice.hupu.com/nba/1").addPipeline(new MyPiepeline()).thread(3).run();
    }

   //自定义实现Pipeline
    private static class MyPiepeline implements Pipeline {
        public MyPiepeline(){

        }
        @Override
        public void process(ResultItems resultItems, Task task) {
            Map<String,Object> map = resultItems.getAll();
            Iterator<Map.Entry<String,Object>> iterator = map.entrySet().iterator();
            Map.Entry<String,Object> entry;
            System.out.println("开始循环");
            while (iterator.hasNext()){
                entry = iterator.next();
                System.out.println(entry.getKey()+":"+entry.getValue());
            }
        }
    }
}