首页 > 编程语言 >Java爬虫通用模板它来了

Java爬虫通用模板它来了

时间:2023-06-08 09:48:20浏览次数:57  
标签:Java 爬虫 Jsoup 线程 import 链接 模板

Java 爬虫在实际应用中有很多场景,例如:数据挖掘和分析、搜索引擎、电商平台、数据更新、监控与预测等行业都需要爬虫借入,那么在实际爬虫中需要注意什么?又该怎么样快速实现爬虫?下面的文章值得看一看。

单线程java爬虫

以下是一个基本的Java爬虫模板,使用Jsoup库进行HTML解析和网络请求:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.IOException;

public class MyCrawler {

    public static void main(String[] args) throws IOException {
        String url = "";
        Document doc = Jsoup.connect(url).get();
        Elements links = doc.select("a[href]");
        for (int i = 0; i < links.size(); i++) {
            // 处理链接逻辑
            System.out.println(links.get(i).attr("href"));
        }
        // 处理其他页面逻辑
    }
}

以上代码中,首先使用Jsoup连接到指定URL,然后从HTML文档中选择所有链接元素(<a href>标签),并对其进行处理。由于Jsoup库能够很方便地进行HTML解析和选择器操作,因此常用于Java爬虫的开发中。

多线程Java爬虫

Java 多线程爬虫相对于单线程爬虫,可以提高爬取效率和速度。下面是一个基本的 Java 多线程爬虫的实现步骤:

创建一个链接队列,用于存放待爬链接。可以使用 Java 中的 ConcurrentLinkedQueue 或 LinkedList 实现。

创建多个爬虫线程,每个线程从队列中获取一个链接,并进行爬取操作。可以使用 Java 中的 ExecutorService 或 ThreadPoolExecutor 来创建线程池。

在每个线程内部,使用 Jsoup 库来连接并解析链接页面,获取需要爬取的数据,以及新的链接列表(同步或异步)。

将新链接添加到队列,其他线程继续爬取。

当队列为空时,所有线程结束执行。

下面是一个简单的示例代码:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.util.concurrent.*;

public class MultithreadedCrawler {

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(10); // 创建线程池
        BlockingQueue<String> queue = new LinkedBlockingQueue<>(); // 创建链接队列
        String seedUrl = "Example Domain"; // 设置起始链接
        queue.add(seedUrl);

        for (int i = 0; i < 10; i++) { // 创建爬车线程
            executor.execute(() -> {
                while (!queue.isEmpty()) {
                    String url = queue.poll();
                    try {
                        Document doc = Jsoup.connect(url).get();
                        Elements links = doc.select("a[href]"); // 获取新的链接列表
                        for (Element link : links) {
                            String newUrl = link.absUrl("href");
                            queue.offer(newUrl);
                        }
                        // 处理获取的数据
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        executor.shutdown(); // 关闭线程池
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // 等待线程执行完毕
    }
}

以上示例代码,创建了一个包含 10 个线程的线程池,使用一个阻塞队列来保存需要爬取的链接。每个线程会从队列中抓取一个链接进行解析,并将新链接加入到队列中继续爬取,直到队列为空为止。使用 shutdown() 方法关闭线程池,然后等待所有线程执行完毕再退出程序。

需要注意的是,在实际开发中,还需要考虑更多的功能和问题,例如:如何避免重复抓取同一个网页、设置抓取时间间隔避免频繁请求、处理异步请求的方式、处理不同异常情况等等。这些都需要结合具体应用场景来进行优化和调整。

标签:Java,爬虫,Jsoup,线程,import,链接,模板
From: https://www.cnblogs.com/q-q56731526/p/17465259.html

相关文章

  • windows查看java进程, 终止进程命令
    查看:tasklist| findstr "java"终止:taskkill/pid20388/f/f表示强制终止......
  • Java SPI META-INF/services 详解
    目录什么是SPISPI和API的使用场景SPI的简单实现SPI原理解析DubboSPI总结什么是SPISPI(ServiceProviderInterface)是JDK提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。SPI的作用就是为这些被扩展的API寻找服务实现。SPI和API的使用场景......
  • Java注释
    Java注释单行注释://多行注释:/**/注意:多行注释不能嵌套使用文档注释(Java特有):/***//**@author@version*/......
  • JAVA 基础面试题(框架)
    一、mybatis    首先,mybatis是一个对象关系映射(orm)框架,是为了解决面向对象与关系数据库的存在互不匹配的现象。也就是说mybatis的关注点在于对象与数据库之间的映射,mybatis会把从数据库中拿到的松散数据进行封装,使开发者直接拿到一个对象。mybatis其实就是对jdbc操作数据库......
  • Java基本概念介绍
    Java基本概念介绍Java是一种面向对象的编程语言,由JamesGosling等人在1995年开发而成。Java是跨平台的,这意味着可以在不同的操作系统上运行相同的程序。Java具有许多优点,包括安全性、可移植性、高效性和可扩展性。Java的基本结构Java程序在类中编写。每个Java程序至少需要一个类,并......
  • JAVA的springboot+vue企业客户信息反馈平台,附源码+数据库+文档+PPT
    1、项目介绍企业客户信息反馈平台能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知企业客户信息反馈平台的便捷高效,不仅为客户提供了服务,而且也推广了自己,让更多的客户了解自己。对于企业客户信息反馈而言,若拥有自己的平台,通过平台得到更好的管理,同时提升了形象......
  • JVM内存结构&Java内存模型&Java对象模型
    1.JVM内存结构Java代码是运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把管理的内存划分为若干个不同的数据区域。其中有些区域是随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。而这些区域会被划分为五个区域,具体的如下:方法区:方法区与是......
  • Java设计模式-适配器模式
    适配器模式(AdapterPattern)是一种常见的设计模式,它主要用于在不改变现有系统结构的情况下,将一个类的接口转换成客户端所期望的另一个接口。在本文中,我们将介绍适配器模式的基本概念、实现方法以及优缺点,并探讨适配器模式在Java编程语言中的具体应用。简介适配器模式是一种结构型......
  • JDK没有JAVAX.ANNOTATION.JAR包解决方案,无法使用@RESOURCE解决方案
    高版本JDK无法使用@Resource注解解决方案1.普通项目下载javax.annotation-api-1.3.2.jar,并在lib目录中引入即可2.Maven项目Maven项目:在pom.xml中进行配置<dependency><groupId>javax.annotation</groupId><artifactId>jsr250-api</artifactId><ver......
  • python爬虫——爬取泉州2022年天气数据并做可视化分析
     一、选题的背景为什么要选择此选题?要达到的数据分析的预期目标是什么?从社会、经济、技术、数据来源等方面进行描述(200字以内)(10分)天气作为日常生活中不可忽视的因素,对人们的出行、衣食住行等方面均有影响。此次选题旨在通过对泉州市2022年天气数据的收集和分析,了解该地区......