Java 使用WebMagic爬取网页(简单示例)

框架简介

WebMagic是一个基于Java的开源网络爬虫框架,它提供了很多简单易用的API接口,可以帮助使用者快速构建出高效、可扩展的网络爬虫程序,WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成,核心代码非常简单,主要是将这些组件结合并完成多线程的任务

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

而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。

爬取时的主要流程:

  • 首先初始化Spider,设置初始url地址,并注册PageProcessor和其他配置,随后Spider从Scheduler中取出一个待抓取的URL,
  • Downloader根据该URL发起HTTP请求,获取网页内容并生成一个`ResultItems`对象和对应的`Request`对象。
  • 再PageProcessor处理该`Request`对象,抽取数据并填充到`ResultItems`中,同时可能会发现新的链接并添加到Scheduler中。
  • 抽取后的结果通过Pipeline传递出去,进行持久化或其他处理。
  • 循环继续,直到Scheduler中的URL被全部抓取完毕,或者达到预设的抓取条件。

过多的就不介绍了,对框架感兴趣强烈推荐去看框架的官方文档

Introduction · WebMagic Documents

爬取网站信息

爬取内容

我本人是河北大学的学生,因此这里就爬取本校官网上的一个新闻板块——河大要闻。

页面如下:

该页面下有多个新闻,点进去之后可以看到新闻的详细信息。例如:

因此我想要爬取该模块内的所有新闻的详细信息,包括新闻的标题,时间,以及内容。

具体实现

基础配置我们直接略过,来看代码如何实现?

首先创建一个HBUNew类,让其实习PageProcessor接口,并实现其全部方法。

这里的setRetryTimes(4).setSleepTime(500)是指下载的尝试次数,一次下载失败会重新尝试,并设置每次爬取的时间间隔,这里设置的每0.5秒爬取一次。

public class HBUNew implements PageProcessor {

    private Site site = Site.me().setRetryTimes(4).setSleepTime(500);

    @Override
    public void process(Page page) {

    }
    public Site getSite() {
        return site;
    }
    public static void main(String[] args) {

    }
}

接下来编写process方法,用来抽取所有我们想要的信息。

具体代码如下:

    public void process(Page page) {
        if (!page.getUrl().regex("https://www.hbu.edu.cn/info.*").match()) {
            //获取新闻URL
            List<String> all = page.getHtml().xpath("/html/body/div[@class='g-row']/div[1]/div[@class='col_r']/ul[@class='ul-study']/li/a").links().all();
            String nextPage = page.getHtml().xpath("/html/body/div[@class='g-row']/div[1]/div[@class='col_r']/div[@class='pb_sys_common pb_sys_normal pb_sys_style1']/span[2]/span[@class='p_next p_fun']/a").links().get();
            all.add(nextPage);
            //添加
            page.addTargetRequests(all);
        } else {//新闻详情页
            String url = page.getUrl().toString();
            String title = page.getHtml().xpath("/html/body/div[@class='g-row']/div[1]/div[@class='col-l']/form/div[1]/h1/text()").get();
            String date = page.getHtml().xpath("/html/body/div[@class='g-row']/div[1]/div[@class='col-l']/form/div[1]/div[@class='date']/text()").get();
            String content = page.getHtml().xpath("/html/body/div[@class='g-row']/div[1]/div[@class='col-l']/form/div[1]/div[@class='txt']/allText()").get();
            //存储结果
            page.putField("地址", url);
            page.putField("标题", title);
            page.putField("日期", date);
            page.putField("内容", content);
        }
    }

首先使用page.getUrl().regex("https://www.hbu.edu.cn/info.*").match()判断当前页面的URL是否与指定的正则表达式匹配。如果不匹配,则表示该页面不是目标新闻页面,而是列表页面。

如果是列表页那就使用xpath()方法获取该页中的所有详细页地址和下一页地址用来找到下一页。

详细页地址:

下一页地址:

如果是详细页依旧是使用Xpath来获取页面内的信息

最后在主方法中创建Spider,添加初始地址,并添加自定义的Pipeline,让其结果以json文件的形式储存在HBUnews文件夹下。

    public static void main(String[] args) {
        Spider.create(new HBUNew())
                //初始访问url地址
                .addUrl("https://www.hbu.edu.cn/index/hdyw1.htm")
                .setDownloader(new HttpClientDownloader())
                .addPipeline(new JsonFilePipeline("HBUnews/"))
                .thread(5)
                .run();
    }

结果展示

最后结果全部在HBUnews文件下

文件内容如下:可以看到成功爬取到了所有的新闻信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GitHub打不开的解决方案

1、打开https://sites.ipaddress.com/github.com/找到DNS Resource Records&#xff0c;复制github的ip地址&#xff0c;先保存起来&#xff1a; 140.82.112.32、打开https://sites.ipaddress.com/fastly.net/找到DNS Resource Records&#xff0c;复制其中一个ip地址&#xf…

OC IOS 文件解压缩预览

热很。。热很。。。。夏天的城市只有热浪没有情怀。。。 来吧&#xff0c;come on。。。 引用第三方库&#xff1a; pod SSZipArchive 开发实现&#xff1a; 一、控制器实现 头文件控制器定义&#xff1a; // // ZipRarViewController.h // // Created by carbonzhao on 2…

ARTS Week 31

Algorithm 本周的算法题为 1556. 千位分隔数 给你一个整数 n&#xff0c;请你每隔三位添加点&#xff08;即 "." 符号&#xff09;作为千位分隔符&#xff0c;并将结果以字符串格式返回。 示例 1&#xff1a;输入&#xff1a;n 123456789输出&#xff1a;"123.…

(四)MySQL 事务

欢迎访问 事务有哪些特性&#xff1f; 事务是由 MySQL 的引擎来实现的&#xff0c;我们常见的 InnoDB 引擎它是支持事务的。 不过并不是所有的引擎都能支持事务&#xff0c;比如 MySQL 原生的 MyISAM 引擎就不支持事务&#xff0c;也正是这样&#xff0c;所以大多数 MySQL 的…

凤香的“蜜”密

执笔 | 文 清 编辑 | 古利特 “遇水则漏&#xff0c;遇酒生香”。酒海&#xff0c;一种大型盛酒容器&#xff0c;因盛酒量以“吨”计算&#xff0c;故称“海”&#xff0c;传于唐宋&#xff0c;兴盛于明清&#xff0c;距今有1400多年的历史。文人墨客笔下&#xff0c;也多有…

部署Prometheus + Grafana实现监控数据指标

1.1 Prometheus安装部署 Prometheus监控服务 主机名IP地址系统配置作用Prometheus192.168.110.27/24CentOS 7.94颗CPU 8G内存 100G硬盘Prometheus服务器grafana192.168.110.28/24CentOS 7.94颗CPU 8G内存 100G硬盘grafana服务器 监控机器 主机名IP地址系统配置k8s-master-0…

融合基因组序列识别scATAC-seq的细胞类型

利用scATAC-seq技术进行单细胞分析&#xff0c;可以在单细胞分辨率下深入了解基因调控和表观遗传异质性&#xff0c;但由于数据的高维性和极端稀疏性&#xff0c;scATAC-seq的细胞注释仍然具有挑战性。现有的细胞注释方法大多集中在细胞峰矩阵上&#xff0c;没有充分利用潜在的…

利用基于CNN的人员检测与关键词识别的TinyML实现无接触电梯

目录 说明 论文概述 摘要 引言 现有非接触式电梯解决方案 新解决方案的需求 tinyML实施 系统构建和算法管道 CNN和TinyML实现 结果与讨论 结论 视频演示和代码可用性 一点感想 说明 我一直使用Google Schloar订阅最新的论文消息&#xff0c;今天看到一篇论文的标…

窄通道、非液压、超续航、更安全,地牛AGV小车诠释高效物流!

agv 在智能时代&#xff0c;替代简单、机械、重复以及重体力工作的智能机器设备成为未来发展的趋势。这种趋势不仅可以提高工作效率和质量&#xff0c;还可以解放人力资源&#xff0c;使其更好地应用于创造性和高级智能任务上。 这不&#xff0c;现在有越来越多的工厂开始使用…

json/excel文件上传下载工具方法汇总

文章目录 浏览器下载json文件浏览器下载excel文件【Workbook】浏览器导入json文件【ObjectMapper】浏览器导入excel文件【Workbook】ResourceLoader读取类路径下单个jsonResourceLoader读取类路径下所有json文件 浏览器下载json文件 Operation(summary "设备模型导出(带分…

详解Java ThreadLocal

个人博客 详解Java ThreadLocal | iwts’s blog Java ThreadLocal ThreadLocal提供了线程内存储变量的能力&#xff0c;这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。 TreadLocal存储模型 ThreadLocal的静态…

使用WebStorm如何调试Vue代码

大家好&#xff0c;我是咕噜铁蛋。今天&#xff0c;我想和大家分享一下如何使用WebStorm这款强大的IDE&#xff08;集成开发环境&#xff09;来调试Vue代码。Vue.js作为现代前端开发的利器&#xff0c;其强大的组件化开发能力和简洁的API深受开发者喜爱。然而&#xff0c;随着项…

D2Admin:企业中后台产品前端集成方案的探索与实践

D2Admin&#xff1a;企业中后台产品前端集成方案的探索与实践 摘要&#xff1a;随着企业信息化建设的不断深入&#xff0c;中后台管理系统的前端技术选型与集成方案成为了关键。D2Admin作为一款完全开源免费的前端集成方案&#xff0c;通过采用最新的前端技术栈&#xff0c;提…

pdf编辑器推荐,这三款软件十分好用!

在数字化时代&#xff0c;PDF文档因其跨平台、易阅读的特性&#xff0c;成为了我们工作、学习、生活中不可或缺的一部分。然而&#xff0c;如何高效、便捷地编辑PDF文档&#xff0c;却成为许多人面临的难题。今天&#xff0c;就为大家推荐三款十分好用的PDF编辑器&#xff0c;让…

C++学习---string模拟实现(2)

1.随机插入一个字符串 &#xff08;1&#xff09;insert函数插入一个字符的方法我们在之前的模拟实现里面已经搞过了&#xff0c;那个里面要注意的是这个全体向后挪动的循环过程&#xff0c;这个里面我们要实现的是插入字符串的模拟实现&#xff1b; &#xff08;2&#xff0…

【算法】前缀和——前缀和

本题主要用一个模板题目来说明前缀和的基本思想&#xff0c;有需要借鉴即可。 目录 1.题目2.前缀和2.1题目分析2.2前缀和算法第一步&#xff0c;先预处理一个前缀数组第二步&#xff0c;由题计算得结果 3.代码示例4.总结 1.题目 题目链接&#xff1a;LINK 这个题目可以用暴力…

c 的库函数有哪些

C语言的库函数非常丰富&#xff0c;涵盖了多种功能&#xff0c;为程序员提供了大量的工具来完成各种任务。以下是一些主要的C语言库函数及其分类&#xff1a; 标准输入输出函数&#xff1a; printf()&#xff1a;用于输出格式化的数据到标准输出设备。scanf()&#xff1a;用于…

数字化农业新时代:图扑农林牧综合监控平台

利用图扑自研 HT for Web GIS 产品&#xff0c;结合遥感技术&#xff0c;构建可交互式的农林牧数据分析平台。该平台围绕地块总览、播种分析、牛只管理、设备查询四个维度&#xff0c;对地区的全貌、农场、村集体分布以及相应的环境进行多样化的可视化展示和进行数据支持&#…

网站报价明细

随着互联网的快速发展和普及&#xff0c;网站建设已经成为越来越多企事业单位必备的基础设施之一。作为企业展示形象和运营业务的重要平台&#xff0c;网站对于企业发展起着举足轻重的作用。因此&#xff0c;网站报价明细在企业进行网站建设时尤为重要。 网站报价明细是指在网站…

Java多线程(02)

一、如何终止线程 终止线程就是要让 run 方法尽快执行结束 1. 手动创建标志位 可以通过在代码中手动创建标志位的方式&#xff0c;来作为 run 方法的执行结束条件&#xff1b; public static void main(String[] args) throws InterruptedException {boolean flag true;Thr…