爬虫实战:一个简易 Java 爬虫程序的实现

Java实现爬虫 关于美国历来每次飞机失事的数据,包含时间地点、驾驶员、死亡人数、总人数、事件描述,一共有12列,第一列是标题,下面一共有5268条数据。多线程中如果想设置等待状态,有一个方法可以实现wait(),如果想从等待状态唤醒,则可以使用notify()。通过Pattern和Matcher的配合,我们可以把一段内容中匹配我们要求的文字提取出来,方便我们来处理。对爬取的HTML页面来说,如果想提取连接地址,就必须找到所有超连接的标签和对应的属性。需要先自定义一个线程的操作类,在这个操作类中判断不同的状态,并且根。... 阅读详情

前面,我们分别介绍了爬虫程序的 3 个部分:源码下载、内容解析、页面链接提取。现在,让我们把这些部分串起来,构建一个完整的简易爬虫程序。

一、爬虫流程

构建程序前,我们首先需要了解爬虫的具体流程。

一个简易的爬虫程序,具备以下流程:

image

若以文字表述,就是:

  1. 从任务库(可以是 MySQL 等关系型数据库)选取种子 URL;

  2. 在程序中初始化一个 URL 队列,将种子 URL 加入到队列中;

  3. 若 URL 队列不为空,则位于队头的 URL 出队;若 URL 队列为空,则退出程序;

  4. 程序根据出列的 URL,反射出对应的解析类,同时新建线程,开始解析任务;

  5. 程序将下载 URL 指向的网页,并判断该页面是详情页还是列表页(如博客中的博客详情与博文列表),若为详情页,则解析出页面内容并入库,若为列表页,则提取出页面链接,加入到 URL 队列中;

  6. 解析任务完成后,重复第 3 步。


二、程序结构

我们已经清楚爬虫的具体流程,现在,我们需要一个合理的程序结构来实现它。

首先,介绍一下该简易爬虫程序的主要结构组成:

类名 作用
SpiderApplication.java 程序入口,负责任务调度,初始化 URL 队列,线程调度
DownloadService.java 下载服务类,负责下载 URL 指向的页面
PluginFactory.java 插件工厂,根据 URL 反射对应的插件类(解析类)
Plugin.java 插件注解类,用于插件(解析类)的注解
AbstractPlugin.java 抽象插件类,所有插件(解析类)的父类,包含公用方法
XmuPlugin.java 具体插件类,负责指定 URL 的解析任务

然后,再了解一下程序中的工具类与实体类。

类名 作用
LinkFilter.java 链接过滤接口,规范过滤方法
LinkExtractor.java 基于 htmlparser 的链接提取类
HttpUtil.java 封装 HttpClient 的工具类
CommonUtil.java 程序通用工具类
Task.java 任务对象
HttpParams.java http 请求对象
Proxy.java 代理配置类
StructData.java 结构化数据

最后,我们根据类的作用,将其放置到上述流程图中对应的位置中。具体的示意图如下所示:

image

现在,我们已经完成了实际流程到程序逻辑的转换。接下来,我们将通过源码的介绍,深入到程序中的各个细节。


三、任务调度、初始化队列

在简易爬虫程序中,任务调度、初始化队列都在 SpiderApplication 类中完成。

package main;

import entity.Task;
import factory.PluginFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import plugins.AbstractPlugin;

import java.util.*;
import java.util.zip.CRC32;

/**
 * 应用入口
 *
 * @author panda
 * @date 2017/10/28
 */
public class SpiderApplication {
   
   

    private static final Logger logger = LoggerFactory.getLogger(SpiderApplication.class);

    // URL 队列
    private static Queue<String> urlQueue = new LinkedList<String>();

    // URL 排重
    private static Map<Long, Integer> urlPool = new HashMap<Long, Integer>();


    public static void main(String[] args) {
   
   

        // 实例化任务对象
        Task task = Task.getBuilder()
                .setUrl("http://sm.xmu.edu.cn/")
                .build();

        // 初始化 URL 队列
        urlQueue.add(task.getUrl());
        addUrlPool(task.getUrl(), 1);

        // 循环调度
        String taskUrl;
        while ((taskUrl = urlQueue.poll()) != null) {
   
   
            logger.info("当前任务URL:" + taskUrl + ",当前层深:" + getDepth(taskUrl));

            try {
   
   
                task.setUrl(taskUrl);
                AbstractPlugin plugin = PluginFactory.getInstance().getPlugin(task);
                plugin.run();

                if (plugin.getUrlList() != null) {
   
   
                    int depth = getDepth(taskUrl) + 1;
                    for (String url : plugin.getUrlList()) {
   
   
                        if (!isUrlExist(url)) {
   
   
                            urlQueue.add(url);
                            addUrlPool(url, depth);
                        }
                    }
                }

                Thread.sleep(300);
            } catch (Exception e) {
   
   
                continue;
            }
        }

    }

    /**
     * 添加链接到 url 池
     *
     * @param url
     * @param depth
     */
    private static void addUrlPool(String url, int depth) {
   
   
        CRC32 c = new CRC32();
        c.update(url.getBytes());

        urlPool.put(c
【Java】爬虫,能不能再详细讲讲?万字长文送给你! 前言 本文仅用于学习知识探讨,绝无其它恶意。 前两篇基础文章链接: 《【Java】爬虫,看完还爬不下来打我电话 》 《【Java】爬虫,数据持久化到MongoDB》 本文打算再详细的讲讲一些流程细节,另外,最后有写到如何分析爬取下来的内容。 在开始正文之前,还要说清一件事:我是小白,能不能学会爬虫? 答:学不会,别学了,放弃吧。赶紧拿起手机,打游戏吧。这么热的天,哪凉快哪去,千万别遭这个罪。 正文... 阅读详情

相关推荐

教你快速学会写一个最简单的爬虫

本文主要内容:以最短的时间写一个最简单的爬虫,可以抓取论坛的帖子标题和帖子内容。

程序员小麦的博客 1135

Java实现网络爬虫-Java入门|Java基础课程

目标 网络爬虫的是做什么的? 手动写一个简单的网络爬虫; 1. 网络爬虫 1.1. 名称 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚 本。 另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 1.2. 简述 网络爬虫是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到 在网页中的其它...

万和IT教育 5030

Java+MySQL实现网络爬虫程序

网络爬虫,也叫网络蜘蛛,有的项目也把它称作“walker”。维基百科所给的定义是“一种系统地扫描互联网,以获取索引为目的的网络程序”。网络上有很多关于网络爬虫的开源项目,其中比较有名的是Heritrix和Apache Nutch。         有时需要在网上搜集信息,如果需要搜集的是获取方法单一而人工搜集费时费力的信息,比如统计一个网站每个月发了多少篇文章、用了哪些标签,为自然语言处

Kei's Blog 1799

Java网络爬虫简易实现教程

网络爬虫(Web Crawler),又称网络蜘蛛(Spider)或网络机器人(Bot),是一种自动化访问互联网并从网页中提取信息的程序或脚本。在大数据时代,网络爬虫广泛应用于搜索引擎索引构建、市场数据监控、新闻聚合、学术研究等领域。Java由于其跨平台、多线程和强大的库支持等特性,成为了构建网络爬虫的热门语言之一。HTTP(HyperText Transfer Protocol)协议,即超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。

weixin_34581040的博客 1432

利用Java打造简易网络爬虫

本章节介绍了Jsoup库的安装和基本使用方法,包括如何解析和处理HTML文档。我们学习了Jsoup库的下载和安装过程,通过Maven或Gradle自动管理依赖或手动下载jar文件。通过解析HTML元素,提取数据,以及利用Jsoup提供的API,我们可以有效地从HTML文档中抽取所需信息。在此过程中,理解HTML文档的基本结构和标签是使用Jsoup的前提。在下一章中,我们将探索HTTP协议的基础知识,并学习如何使用Java发送HTTP请求及获取响应。

weixin_35949153的博客 2365

Java网络爬虫技术大全:从基础到实战

本文还有配套的精品资源,点击获取 简介:网络爬虫是自动化网页信息抓取工具,本套资料专注于Java语言实现的网络爬虫技术,详细介绍了网络爬虫的基础概念、Java爬虫框架、网络请求与响应、网页解析、分布式爬虫、反爬与应对策略、数据存储与处理以及实战项目。资料旨在帮助用户掌握Java进行高效、稳定的网页抓取,并提供实战项目,是提升技能的宝贵资源。 1. 网络爬虫基础概念...

weixin_42610010的博客 2221

Java网络爬虫的设计与实现

网络爬虫(Web Crawler),也被称为网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种自动获取网页内容的程序或脚本。它按照一定的规则,自动地在互联网上浏览、检索并抓取信息。网络爬虫是搜索引擎、数据挖掘和知识管理等领域的关键技术之一。Java语言自1995年问世以来,因其“编写一次,到处运行”的理念而广受欢迎。它的特点包括面向对象、平台无关性、安全性、多线程和网络编程能力等。

weixin_33773084的博客 1254

Java Websphinx网络爬虫实战课程

本文还有配套的精品资源,点击获取 简介:网络爬虫是自动遍历并抓取网页信息的工具,Java因跨平台、稳定性和强大的库支持在爬虫开发中十分流行。Websphinx是Java开发的网络爬虫框架,本课程将探讨Java在网络爬虫开发中的关键知识点,包括HTTP通信、HTML解析、数据存储、多线程处理、URL管理、延迟加载与JavaScript处理、异常处理、IP代理、日志记录以及分布...

weixin_36019375的博客 1747

Linux系统搭建OpenClaw(原Clawdbot)全流程指南 最新版

工具定位:开源个人 AI 助手,支持文件读取、命令执行、多渠道交互(Telegram / 本地终端等);系统要求:主流 Linux 发行版(Ubuntu/Debian/CentOS 等),Node.js ≥22(核心依赖);安全提示:OpenClaw 为测试版,具备高权限操作能力,建议使用非主力机,配置权限白名单,避免接触敏感数据。

AI时代老码农的第二春 6560

endnote让参考文献整整齐齐

这篇文章主要是针对利用 endnote 插入参考文献时,参考文献第一行和后面的行对不齐的问题 下面是示意图 可以看到我们的参考文献对的整整齐齐的,比较好看。 下面介绍具体步骤 1、打开endnote。编辑我们使用的参考文献样式。我这儿是叫 ZZ_MODIFIED_GEEBINF 复制 2、找到布局,每个参考开头,将光标放在在参考开头后面,点插入字段,制表符 3、右下角悬挂式输出哪儿选择全部段...

雾隐雾现的至渝博客 5万+

UE5笔记【十二】蓝图函数BluePrint Function

蓝图函数BluePrint Function。蓝图类。蓝图变量。

xiaoyaolangwj的博客 4393

Tiny windows 11 安装与部署

需要注意,安装完后键入 windows 键,输入 update 先更新系统。点击开始,等待完成即可,用户可自定义。

m0_73351035的博客 9048

如何在 VMware Workstation 虚拟机中利用 Nvidia 显卡的硬件加速功能

本文详细介绍了在VMware Workstation虚拟机中配置Nvidia显卡硬件加速的完整流程。重点包括:检查硬件兼容性、安装显卡驱动、编辑VMware配置文件启用PCI直通功能(需修改config.ini文件参数)、为虚拟机分配PCI设备等关键步骤。文章特别强调了配置注意事项,如系统资源需求、BIOS设置要求、驱动兼容性等问题,并建议操作前备份数据。通过此方法可实现虚拟机对Nvidia显卡的直接调用,适用于需要GPU加速的计算场景。

qq_39777550的博客 6702

【论文阅读】LIME:Low-light Image Enhancement via Illumination Map Estimation(笔记最全篇)

文章目录AbstractIntroductionContributionMethodSpeed-up Method(1):ALM子问题 T子问题 G子问题 Z和μ\muμSpeed-up Method(2):权重变量实验conclusion 今天要整理的一篇论文是使用传统的方法解决低照度的问题,Guo等人于2016年发表在IEEE上,论文《LIME:Low-light Image Enhance...

florrie 2万+

SRS流媒体服务器在Windows下的安装

在之前的流媒体开发中(视频会议),我基本上使用nginx加模块的方式进行学习、测试,正式开发的时候改为服务器端用EasyDarwin,客户端用rtsp-simple-server(这些流媒体服务器的用法见我以前的博文),这样可以充分利用客户端的资源,降低服务器端的压力。在流媒体协议方案,我选择相对较快的rtsp。这个协议优点是支持UDP协议,优化好的环境下可以实现3秒以下的延迟,基本满足甲方要求,缺点就是不支持网页播放。

dgnankai的专栏 2023

configure: error: no acceptable C compiler found in $PATH解决方案

本文主要介绍了configure: error: no acceptable C compiler found in $PATH解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 4万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 在 springMVC 中整合表格插件 jqGrid
下一篇: HttpClient 4.5 重定向到中文URL出现乱码的解决方案
magicpenta
博客等级 码龄10年 42粉丝 30原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值