webmagic爬虫--爬取简单网页
程序员文章站
2022-05-02 20:49:52
...
WebMagic框架包含四个组件,PageProcessor、Scheduler、Downloader和Pipeline。
这四大组件对应爬虫生命周期中的处理、管理、下载和持久化等功能。
这四个组件都是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()); } } } }
上一篇: velocity的类型比较