WebMagic框架

1.webmagic框架

        webmagic框架是一个Java实现的爬虫框架,底层依然是HttpClient和jsoup

        组件:

  1. downloader:下载器组件
  2. PageProcessor:页面解析组件(必须自定义)
  3. scheculer:访问队列组件
  4. pipeline:数据持久化组件(默认是输出到控制台)

2.入门程序

        2.1创建工程

  1. 创建一个Maven工程
  2. 添加坐标  
    <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope>
    </dependency>
    <dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.9.0</version>
    </dependency>
    <dependency><groupId>us.codecraft</groupId><artifactId>webmagic-extension</artifactId><version>0.9.0</version>
    </dependency>
    

        2.2入门程序 

        1.创建PageProcess接口实现类

package org.example;import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;/*** 实现分析的业务逻辑*/
public class MypageProcessor implements PageProcessor {/*** 页面分析** @param page 下载结果封装成Page对象*             可以从page对象中获得下载的结果*/@Overridepublic void process(Page page) {Html html = page.getHtml();String htmlStr = html.toString();//把结果输出到控制台
//        ResultItems resultItems = page.getResultItems();
//        resultItems.put("html", htmlStr);page.putField("html", htmlStr);}/*** 返回一个Site对象* Site就是站点的配置* 返回默认配置使用Site.me创建一个Site对象** @return*/@Overridepublic Site getSite() {return Site.me();}public static void main(String[] args) {Spider.create(new MypageProcessor())//设置起始的url.addUrl("http://www.itcast.cn")//启动爬虫//run 是同步方法在当前线程中执行//start 在新线程中执行爬虫.run();}
}

        2.在实现类中实现页面分析的业务逻辑

        3.初始化爬虫

        4.启动爬虫         

        5.结果

      

3.组件介绍

3.1Downloader

        下载器组件,使用HttpClient实现

        如果没有特殊需求不需要自定义,默认的组件就可以满足全部需求

        自定义时需要实现Downloader接口

        向PageProcess传递数据时,把结果封装成Page对象

3.2PageProcess(必须自定义)

        页面分析的业务组件,页面分析的逻辑在其中实现

        需要实现PageProcessor接口

         3.2.1.Site

                Site代表一个站点信息

                可以设置抓取的频率

                 重试的次数

                 超时时间

                 

            如果没有特殊需求 直接使用默认配置即可

        3.2.2Page

        getHtml(): 返回抓取的结果

        getResultItems(): 返回ResultItems对象, 向pipeline传递数据时使用

        getTargetReqyests()、getTargetReqyest(): 向scheduler对象中添加url

        3.2.3html(Selectable)

        html也是一个Selectable对象

        一个Selectable就可以表示一个dom节点

        使用html解析页面三种方式:

                1.使用原生jsoup方法进行解析

                        Document document = html.getDocument();

                2.使用框架提供的css选择器

                        html.css("选择器")

                        html.$("选择器")

                3.使用Xpath解析

        3.2.4ResultItems

        作用就是把解析的结果传递给pipeline

        可以使用page对象的getResultItems()方法获取该对象

        也可以直接使用putField方法将数据添加到ResultItems对象中

        3.2.5Request

        并不是Http请求的Request对象,就是把url封装成Request对象

        可以添加一个  也可以添加多个

3.3pipeline(自定义频率高)

        数据持久化组件

框架提供了三个实现,ConsolePipeline:向控制台输出 默认的

                                    FilePipeline:向磁盘文件中输出

                                    JsonFilePipeline: 保存Json格式的文件

也可以自定义pipeline:

        需要实现pipeline接口。

package org.example;import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable;import java.util.List;/*** 获取黑马网站全部网页*/
public class FilePipelinePageProcessor implements PageProcessor {@Overridepublic void process(Page page) {//访问黑马首页Html html = page.getHtml();//解析首页中所有的链接地址
//        Selectable css = html.css("a", "href");Selectable links = html.links();List<String> all = links.all();//把链接地址添加到访问队列中page.addTargetRequests(all);//把页面传递给pipeline 保存到磁盘page.putField("html",html.get());}@Overridepublic Site getSite() {return PageProcessor.super.getSite();}public static void main(String[] args) {FilePipeline filePipeline = new FilePipeline();filePipeline.setPath("Z:\\html");//使用spider初始化爬虫Spider.create(new FilePipelinePageProcessor())//设置起始的url.addUrl("http://www.itheima.com")//设置使用的pipeline.addPipeline(new ConsolePipeline()).addPipeline(filePipeline)//启动.run();}
}

3.4Scheduler

        访问url队列

        1.默认使用的内存队列

                url数据量大时会占用大量的内存

        2.文件形式的队列

                需要制定保存队列文档的文件路径和文件名

        3.redis分布式队列

                实现分布式爬虫时 大规模爬虫时使用

3.4.1url去重

webmagic框架中可以对url进行去重处理

        1.默认使用HashSet进行去重 

                需要占用大量的内存

        2.规模大时 应该是用redis去重

                使用redis成本高,需要搭建集群

         3.布隆过滤器去重

                内存小,速度快,成本低

                缺点是有可能误判,不能删除

3.4.2布隆过滤器的使用

        1.添加guava的jar包

        

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>16.0.1</version></dependency>

        

public static void main(String[] args) {FilePipeline filePipeline = new FilePipeline();filePipeline.setPath("Z:\\html");//创建一个SchedulerQueueScheduler scheduler = new QueueScheduler();//指定队列使用布隆过滤器去重//初始化一个布隆过滤器 参数就是容量scheduler.setDuplicateRemover(new BloomFilterDuplicateRemover(10000000));//使用spider初始化爬虫Spider.create(new FilePipelinePageProcessor())//设置起始的url.addUrl("http://www.itheima.com")//设置使用的pipeline.addPipeline(new ConsolePipeline()).addPipeline(filePipeline)//设置使用的Scheduler对象.setScheduler(scheduler)//启动.run();}

3.5Spider

        工具类,可以初始化爬虫

        在spider中配置各个组件

        启动爬虫

4.页面解析

4.1jsoup

package org.example;import org.jsoup.nodes.Document;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;public class MypageProcessor1 implements PageProcessor {@Overridepublic void process(Page page) {//使用原生Jsoup的api解析页面Html html = page.getHtml();//得到一个jsoup的Document对象Document document = html.getDocument();String title = document.getElementsByTag("title").text();//传递给pipelinepage.putField("title", title);}@Overridepublic Site getSite() {return PageProcessor.super.getSite();}public static void main(String[] args) {Spider.create(new MypageProcessor1()).addUrl("https://www.jd.com").start();}
}

        4.2css选择器解析

//使用css解析器解析页面Selectable domTitle = html.$("title","text");
//        String title1 = domTitle.toString();String title2 = domTitle.get();page.putField("title2",title2);

                Selectable元素 两个方法 get()、toString() 都可以把结果转换为字符串

                 如果返回的是一个dom列表,那么只返回第一个元素

                all()就可以得到列表

        4.3Xpath解析

                 这个是webmagic框架中实现的

XPath 教程 (w3school.com.cn)

package org.example;import org.jsoup.nodes.Document;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable;import java.util.List;public class MypageProcessor1 implements PageProcessor {@Overridepublic void process(Page page) {//使用原生Jsoup的api解析页面Html html = page.getHtml();//得到一个jsoup的Document对象Document document = html.getDocument();String title = document.getElementsByTag("title").text();//传递给pipelinepage.putField("title", title);//使用css解析器解析页面Selectable domTitle = html.$("title", "text");
//        String title1 = domTitle.toString();String title2 = domTitle.get();page.putField("title2", title2);//选择一个节点列表// 只返回第一个String s = html.css("link", "href").get();// 返回列表List<String> all = html.css("link", "href").all();System.out.println(s);System.out.println(all);//使用Xpath进行解析Selectable xpath = html.xpath("//*[@id=\"navitems-group1\"]/li[1]/a/text()");String addr = xpath.get();page.putField("addr", addr);}@Overridepublic Site getSite() {return PageProcessor.super.getSite();}public static void main(String[] args) {Spider.create(new MypageProcessor1()).addUrl("https://www.jd.com").start();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/273104.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka查看消息两种方式(命令行和软件)+另附发送消息方式

1、命令行方式 ①找到kafka安装文件夹 ②执行命令 #指定offset为指定时间作为消息起始位置 kafka-consumer-groups.sh \ --bootstrap-server 20.2.246.116:9092 \ --group group_1 \ --topic lanxin_qiao \ --reset-offsets \ --to-datetime 2023-07-19T01:00:00.000 \ -exe…

Linux--基础命令

一.pwd&#xff08;Print Working Directory&#xff09; (1)pwd:显示当前位置的绝对路径; 二.cd (Change Directory) (2)cd:切换目录,cd的参数表示要切换的位置,可以使用绝对路径或者相对路径; 三.ls (3)ls:显示目录中的文件 (l a i) ls补充: 理解使用: -A 显现除 “.”和“…

20-Java备忘录模式 ( Memento Pattern )

Java备忘录模式 摘要实现范例 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象 备忘录模式属于行为型模式 摘要 1. 意图 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对…

mockjs学习

1.前言 最近面试发现之前团队协同合作的项目没有mock数据难以向面试官直接展示&#xff0c;所以迟到得来速学一下mockjs。 参考视频&#xff1a;mockJs 妈妈再也不用担心我没有后端接口啦_哔哩哔哩_bilibili 一开始查阅了一些资料&#xff0c;先是看了下EasyMock&#xff0c…

利用websocket +定时器简易的实现一个网络聊天室

其实原理非常简单,就是客户端用户通过websoket来连接websocket服务端。然后服务端,收集每个用户发出的消息, 进而将每条用户的消息通过广播的形式推送到每个连接到服务端的客户端。从而实现用户的实时聊天。 // TODO : 我主要是讲一下实现思路。并未完善其功能。 1.后端 依赖 …

Spring MVC 全局异常处理器

如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 1.异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由异常处理器进行异…

Tensorflow2.0+部署(tensorflow/serving)过程备忘记录Windows+Linux

Tensorflow2.0部署&#xff08;tensorflow/serving&#xff09;过程备忘记录 部署思路&#xff1a;采用Tensorflow自带的serving进模型部署&#xff0c;采用容器docker 1.首先安装docker 下载地址&#xff08;下载windows版本&#xff09;&#xff1a;https://desktop.docke…

Jmeter之Ramp-up Period(in seconds)

1、Ramp-up Period概念 &#xff08;in seconds&#xff09;–并发用户启动周期&#xff0c;告知JMeter 要在多长时间内启动全部Vuser用户。 2、为什么需要有“ramp-up period”&#xff0c;立即启动所有的并发用户数不是更好&#xff1f; 对于绝大多数的网址或应用&#xf…

【Prometheus】DataModel

数据模型 DataModel 指标 Metric metric 包含 metric name 和 metric label 格式&#xff1a; <metric name>{<label name><label value>, ...}例如&#xff1a;服务器 HTTP 接口 /messages 的总请求数 api_http_requests_total{method"POST",…

Jmeter(三) - 从入门到精通 - 测试计划(Test Plan)的元件(详解教程)

1.简介 上一篇中已经教你如何通过JMeter来创建一个测试计划&#xff08;Test Plan&#xff09;&#xff0c;那么这一篇我们就将JMeter启动起来&#xff0c;创建一个测试计划&#xff08;Test plan&#xff09;&#xff0c;然后给大家介绍一下测试计划&#xff08;Test Plan&am…

二,几何相交---4,BO算法---(1)接近性和可分离性

提了三个观点 1&#xff0c;如果一条直线&#xff08;比如竖直&#xff09;可以分开两个线段&#xff0c;则这两个线段不相交 2&#xff0c;只需要观察与隔离线相交的几个线段 3&#xff0c;从左向右扫描线只需要观察每个线段的两个端点和一些可能的相交点。

力扣18:三数之和

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 题意&#xff1a;给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且不重复的三元组。 注意&a…

目标检测5:采用yolov8, RK3568上推理实时视频流

上一个效果图&#xff0c;海康球机对着电脑屏幕拍&#xff0c;清晰度不好。 RK3568接取RTSP视频流&#xff0c;通过解码&#xff0c;推理&#xff0c;编码&#xff0c;最终并把结果推出RTSP视频流。 RK3568 推理 数据集采用coco的80个种类集&#xff0c;通过从yovo8.pt&#x…

2024年AI辅助研发趋势:探索未来研发工作的AI应用

引言&#xff1a; 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经深入到了各个行业&#xff0c;其中包括研发领域。在2024年&#xff0c;AI辅助研发将继续成为关注的焦点&#xff0c;因为它为研发工作带来了许多新的机遇和挑战。本文将探讨2024年…

【HTML】HTML基础7.3(自定义列表)

目录 标签 效果 代码 注意 标签 <dl> <dt>自定义标题</dt><dd>内容1</dd><dd>内容2</dd><dd>内容3</dd> 。。。。。。 </dl> 效果 代码 <dl><dt>蜘蛛侠系列</dt><dd>蜘蛛侠1</dd…

搭建nacos集群,并通过nginx实现负载均衡

nacos、eureka、consul、zookeeper等都是常用的微服务注册中心&#xff0c;这篇文章详细介绍一下在Ubuntu操作系统上搭建一个nacos的集群&#xff0c;以及通过nginx的反向代理功能实现nacos的负载均衡。 目录 一、安装nacos 1、安装nacos 2、修改nacos配置文件 3、创建naco…

css3中nth-child属性作用及用法剖析

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 标题&#xff1a;CSS3中nth-child属性作用及用法剖析 摘要&#xff1a;CSS3中的nth-child选择器允许我们根据元素位置来定位特定的元素…

android开发环境搭建

android开发环境搭建 Android 开发环境搭建1.JDK安装与配置1.1 Jdk官方下载1.2 JDK安装1.3 环境变量配置1.4 新建JAVA_HOME1.5 修改Path变量1.6 新建classpath1.7 验证环境是否配置完成 2.开发工具二选一1.如何创建一个工程2.工程的目录结构的了解3.与开发的相关的常规视图4.我…

【QA-SYSTEMS】CANTATA-解决Jenkins中build Cantata报错

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决Jenkins中build Cantata测试项目报找不到license server的错误。 2、 问题场景 在Jenkins中build Cantata测试项目&#xff0c;报错“Failed to figure out the license server correctly”。 3、软硬件环…

MT笔试题

前言 某团硬件工程师的笔试题&#xff0c;个人感觉题目的价值还是很高的&#xff0c;分为选择题和编程题&#xff0c;选择题考的是嵌入式基础知识&#xff0c;编程题是两道算法题&#xff0c;一道为简单难度&#xff0c;一道为中等难度 目录 前言选择题编程题 选择题 C语言中变…