WebMagic

news2024/11/24 6:32:48

1.介绍

WebMagic是一款简单灵活的爬虫框架。基于它你可以很容易的编写一个爬虫。

WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成,核心代码非常简单,主要是将这些组件结合并完成多线程的任务。这意味着,在WebMagic中,你基本上可以对爬虫的功能做任何定制。

Introduction · WebMagic Documents

2.依赖

注意:0.74以前的版本存在ssl并不完全的问题, 新版没得这个问题

github上面有方法https://github.com/code4craft/webmagic/issues/1022

  <!--WebMagic-->
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.7.4</version>
        </dependency>
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.7.4</version>
        </dependency>

 3.基础案列

在学习WebMagic,你要jsoup或者其他爬虫框架有一定的了解,不明白我css写的什么意思,可以去看一下我jsoup的选择器

 

//页面处理类
public class JobProcessor implements PageProcessor {
    //解析页面
    @Override
    public void process(Page page) {
        //解析放回的数据放到page 并且把解析的结果放到 resultems中
        page.putField("div",page.getHtml().css("div.search-m a").all());


    }

    private Site site =Site.me();
    @Override
    public Site getSite() {
        return site;
    }
    //主函数执行爬虫
    public static void main(String[] args) {
        Spider.create(new JobProcessor()).addUrl("https://**.jd.com/").run();
    }
}

4.抽取技术 

webMagic一共有三种 css选择器 、Xpath 和正则表达式,css这里不叙说 

Xpath 

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。

因此,对 XPath 的理解是很多高级 XML 应用的基础。

 XPath 教程


import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

//页面处理类
public class JobProcessor implements PageProcessor {
    //解析页面
    @Override
    public void process(Page page) {
        //解析放回的数据放到page 并且把解析的结果放到 resultems中  css解析  
        page.putField("div",page.getHtml().css("div.search-m a").all());
        //xpath 解析
        page.putField("div2", page.getHtml().xpath("//div[@class=search-m]"));




    }

    private Site site = Site.me();

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

    //主函数执行爬虫
    public static void main(String[] args) {
        Spider.create(new JobProcessor()).addUrl("https://**.jd.com/").run();
    }
}

正则表达式 

Java 正则表达式 | 菜鸟教程


//页面处理类
public class JobProcessor implements PageProcessor {
    //解析页面
    @Override
    public void process(Page page) {
        //解析放回的数据放到page 并且把解析的结果放到 resultems中  css解析
        page.putField("div",page.getHtml().css("div.search-m a").all());
        //xpath 解析
        page.putField("div2", page.getHtml().xpath("//div[@class=search-m]").all());
        //正则表达式
        page.putField("div3",page.getHtml().regex(".*电脑.*").all());




    }

 

获取连接

我们在浏览一个网站,往往需要看的是点击后的信息,这里就需要引入获取连接的方法

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

//页面处理类
public class JobProcessor implements PageProcessor {
    //解析页面
    @Override
    public void process(Page page) {


        page.addTargetRequests(page.getHtml().css("div#logo").links().all());
        page.putField("url",page.getHtml().all());




    }

    private Site site = Site.me();

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

    //主函数执行爬虫
    public static void main(String[] args) {
        Spider.create(new JobProcessor()).addUrl("https://**.jd.com/").run();
    }
}

文件输出

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.FilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;

//页面处理类
public class JobProcessor implements PageProcessor {
    //解析页面
    @Override
    public void process(Page page) {


        page.addTargetRequests(page.getHtml().css("div#logo").links().all());
        page.putField("url",page.getHtml().all());




    }

    private Site site = Site.me();

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

    //主函数执行爬虫
    public static void main(String[] args) {
        Spider.create(new JobProcessor()).addUrl("https://**.jd.com/")
                .addPipeline(new FilePipeline("E:\\java\\jsoup"))
                .run();
    }
}

改目录下已经有文件了

 

 爬虫的其他设置

Spider是爬虫启动的入口。在启动爬虫之前,我们需要使用一个PageProcessor创建一个Spider对象,然后使用run()进行启动。同时Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置。

Site

对站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略等、代理等,都可以通过设置Site对象来进行配置

5.基于注解的开发 

WebMagic支持使用独有的注解风格编写一个爬虫,引入webmagic-extension包即可使用此功能。

在注解模式下,使用一个简单对象加上注解,可以用极少的代码量就完成一个爬虫的编写。对于简单的爬虫,这样写既简单又容易理解,并且管理起来也很方便。这也是WebMagic的一大特色,我戏称它为OEM(Object/Extraction Mapping)。

注解模式的开发方式是这样的:

  1. 首先定义你需要抽取的数据,并编写类。
  2. 在类上写明@TargetUrl注解,定义对哪些URL进行下载和抽取。
  3. 在类的字段上加上@ExtractBy注解,定义这个字段使用什么方式进行抽取。
  4. 定义结果的存储方式。
@TargetUrl("https://github.com/\\w+/\\w+") //初始的url
@HelpUrl("https://github.com/\\w+")  //第二次的网址
public class GithubRepo {

    @ExtractBy(value = "//h1[@class='entry-title public']/strong/a/text()", notNull = true) 
    private String name;

    @ExtractByUrl("https://github\\.com/(\\w+)/.*")
    private String author;

    @ExtractBy("//div[@id='readme']/tidyText()")
    private String readme;

    public static void main(String[] args) {
        OOSpider.create(Site.me().setSleepTime(1000)
                , new ConsolePageModelPipeline(), GithubRepo.class)
                .addUrl("https://github.com/code4craft").thread(5).run();
    }
}

 我这里只是简单的说了一下,想要详细的操作可以看一下官方文档,写的真的很详细

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8S——存储ConfigMap

configMap描述信息 ConfigMap 功能在 Kubernetes1.2 版本中引入&#xff0c;许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。 ConfigMap API 给我们提供了向容器中注入配置信息的机制&#xff0c;ConfigMap 可以被用来保存单个属性&#xff0c;也可以用来保…

hutool工具并发使用 Sftp sftp = new Sftp(sshHost, sshPort, sshUser, sshPass) 的坑

目录问题描述解决方案Sftp(sshHost, sshPort, sshUser, sshPass) 分析Sftp(Session session) 分析吐槽另外还有一坑 delFile(String filePath)问题描述 看到前人的代码中使用 Sftp sftp new Sftp(sshHost, sshPort, sshUser, sshPass) ; 来创建一个Sftp客户端&#xff0c;然后…

Automatic Exposure Correction of Consumer Photographs 分析

文章目录Automatic Exposure Correction of Consumer Photographs1. 图像分割2. 按灰度区域合并3. 根据细节多少和各zone相对对比度约束&#xff0c;求解每个zone对应的 最优zone.4. 每个zone以及对应的最有zone找到之后&#xff0c;可以求解多项式curve的 ϕs\phi_sϕs​ 和 ϕ…

【Flask框架】——24 创建ROM映射

创建ROM映射 ORM&#xff1a;Object Relationship Mapping 创建一个类&#xff0c;一个类对应了一个数据库中的一张表&#xff0c;类的数据属性对应了表中的字段名&#xff0c;这个类称为映射类。 根据映射类创建出一个一个的对象&#xff0c;每个对象对应了表中的一条实际的…

函数(6)

目录 1、函数是什么&#xff1f; 2、C语言中函数的分类&#xff1a; 1、库函数 2、自定义函数 3、函数的参数 4、函数的调用 5、练习 1、打印100~200之间的素数 2、打印100~200之间的闰年 3、写一个函数&#xff0c;实现一个整形有序数组的二分查找 6、函数的嵌套调…

CSDN每日一练求最小元素 C语言

题目名称&#xff1a;求最小元素 时间限制&#xff1a;1000ms内存限制&#xff1a;256M 题目描述 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]). Find the minimum…

MS17-010漏洞攻击与防御(利用永恒之蓝攻击Win7系统)

任务1 利用永恒之蓝攻击Win7系统 在Kali终端中输入命令“msfconsole ”&#xff0c;启动Metasploit&#xff1b;输入命令“use auxiliary/scanner/smb/smb_ms17_010”&#xff0c;加载扫描模块&#xff1b;输入命令“set RHOSTS 192.168.0.6”&#xff0c;设置需要被扫描的目标…

哈希表题目:环形链表 II

文章目录题目标题和出处难度题目描述要求示例数据范围进阶解法一思路和算法代码复杂度分析解法二思路和算法证明代码复杂度分析题目 标题和出处 标题&#xff1a;环形链表 II 出处&#xff1a;142. 环形链表 II 难度 2 级 题目描述 要求 给你一个链表的头结点 head\tex…

CSDN周赛第16期-100分满分题解

前言 这是时隔两年再参加比赛了&#xff0c;上次参加算法竞赛还是2020年在公司1024活动的时候。当时获得了二等奖&#xff08;switch套装&#xff09;和一个快题奖&#xff08;小米行李箱&#xff09;。 这次比赛获得了满分&#xff0c;也还不错。题目除了二维积水的问题&…

8Manage:提高项目执行力的策略有哪些?

在项目管理中实施执行战略&#xff0c;将战略目标转化为商业价值的企业将发现取得成功所涉及的大团队——最高管理层、中层管理人员、项目经理和项目团队。 以下是阻碍项目成功执行的六个主要差距&#xff1a; ● 缺少共同的理解 ● 缺乏参与的执行赞助者 ● 与战略目标不一致…

计算机网络—Nginx概述

文章目录nginx负载均衡&#xff1a;例&#xff1a;安装配置nginx————————————————————————————————nginx负载均衡&#xff1a; 请求会打到nginx上面&#xff0c;nginx可以用作负载均衡&#xff0c; 例&#xff1a;一个网站用一台服务器不够&a…

001 软件安装与配置

1、Anaconda安装及使用 1.1 下载地址 Anaconda3-2022.10-Windows-x86_64 1.2 Anaconda创建虚拟环境 下面均在Anaconda终端中输入 查看python版本 python --version1.2.1、Anaconda创建虚拟环境 conda create -n pytorch python3.9conda create 创建虚拟环境命令 -n pytor…

解决vue代码不规范而出现的问题:Eslint修复

当我们刚创建一个vue项目&#xff0c;写代码时候&#xff0c;因为代码写的不规范会出很多问题&#xff0c;报很多错误&#xff0c;除了一个一个去修改他们&#xff0c;还有没有其他办法去解决他们呢&#xff1f; 这里介绍三种办法去统一解决&#xff1a; 方法一&#xff1a;每…

MCU-51:让LED闪烁起来

目录一、LED闪烁1.1 编写代码1.2 延时函数1.3 由0和1控制实现二、LED流水灯2.1 流水灯基础版2.2 移位法实现LED流水灯一、LED闪烁 昨天我们初识单片机&#xff0c;点亮了一个灯开启了我们51单片机的学习之旅。那么今天我们来一步步深入学习。 1.1 编写代码 会了点亮一个灯&a…

嵌入式分享~IO相关1 ##

这里仅总结一下IO控制相关 单片机IO直接驱动继电器 上图是随便找到的两个不同型号的继电器。继电器就是个开关&#xff0c;这个开关是由它内部的线圈控制的&#xff0c;给线圈通电&#xff0c;继电器就吸合&#xff0c;开关就动作了。绝大部分的继电器反面都会有如下图一样的…

win10 git 标准化commit工具commitizen安装教程

1、 安装nodjs https://nodejs.org/en/ 下载最新版本 安装完成后&#xff0c;修改环境变量 默认 nodejs是有的&#xff0c;需要自己添加npm路径 2、安装commitizen 在桌面上右键打开power shell 查看node 和npm的版本&#xff0c;npm最好升级一下 升级命令问题 npm inst…

【HDR】曝光融合(Exposure Fusion)

文章目录0 前言1 算法细节1.1 Naive1.1.1 主要思想1.1.2 权重计算1.1.3 融合1.2 Multi-resolution2 实验3 参考0 前言 在曝光融合&#xff08;Exposure Fusion&#xff09;算法问世之前&#xff0c;多曝光序列合成用于显示的HDR需要两个步骤&#xff0c;第一步是将多张不同曝光…

MySql加密存储的数据,如何模糊搜索?

背景 蔚来被勒索 225 万美元&#xff0c;大量数据遭泄露&#xff01; 根据网络上流传的截图显示&#xff0c;黑客似乎掌握着蔚来内部员工数据 22800 条、车主用户身份证数据 399000 条、用户地址数据 6500000 条、注册用户数据 4850000 条、企业及企业代表联系人数据 10000 条…

dpdk编译

ubuntu网卡信息配置 虚拟机中除去最开始的一块网卡&#xff0c;再另外添加两块网卡&#xff0c;如下图所示 修改Ubuntu20_x64.vmx里面的配置信息 将ethernet0.virtualDev "e1000"里面的e1000更改成vmxnet3,因为e1000只支持网卡单队列&#xff0c;vmxnet3支持网卡对…

5G无线技术基础自学系列 | 5G移动性KPI

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G移动类KPI用来评估NR网络的移动性能&…