首页 > 编程语言 >Java爬虫翻页

Java爬虫翻页

时间:2024-07-09 18:09:39浏览次数:26  
标签:Java 翻页 示例 http 爬虫 jsoup import apache org

编写一个Java爬虫以进行翻页通常涉及到使用HTTP客户端(如Apache HttpClient或OkHttp)来发送请求,解析HTML页面(如使用Jsoup库),以及处理分页逻辑(如通过URL参数或页面内的链接进行翻页)。

1. 使用Jsoup和Apache HttpClient的Java爬虫示例

以下是一个使用Jsoup和Apache HttpClient的Java爬虫示例,该爬虫从一个假设的博客网站抓取文章标题,该网站具有分页功能(例如,通过URL中的page=参数控制)。

首先,请确保在项目的pom.xml文件中添加必要的依赖项(如果我们使用的是Maven):

<dependencies>  
    <dependency>  
        <groupId>org.jsoup</groupId>  
        <artifactId>jsoup</artifactId>  
        <version>1.14.3</version>  
    </dependency>  
    <dependency>  
        <groupId>org.apache.httpcomponents</groupId>  
        <artifactId>httpclient</artifactId>  
        <version>4.5.13</version>  
    </dependency>  
</dependencies>

接下来是爬虫的实现代码:

import org.apache.http.client.methods.CloseableHttpResponse;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.impl.client.CloseableHttpClient;  
import org.apache.http.impl.client.HttpClients;  
import org.apache.http.util.EntityUtils;  
import org.jsoup.Jsoup;  
import org.jsoup.nodes.Document;  
import org.jsoup.nodes.Element;  
import org.jsoup.select.Elements;  
  
public class BlogSpider {  
  
    private static final String BASE_URL = "http://example.com/blog?page=";  
  
    public static void main(String[] args) {  
        int maxPages = 5; // 假设我们只爬取前5页  
  
        for (int i = 1; i <= maxPages; i++) {  
            String url = BASE_URL + i;  
            System.out.println("Fetching page: " + url);  
            fetchAndParsePage(url);  
        }  
    }  
  
    private static void fetchAndParsePage(String url) {  
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {  
            HttpGet request = new HttpGet(url);  
            try (CloseableHttpResponse response = httpClient.execute(request)) {  
                if (response.getStatusLine().getStatusCode() == 200) {  
                    String html = EntityUtils.toString(response.getEntity(), "UTF-8");  
                    Document doc = Jsoup.parse(html);  
  
                    // 假设每个文章标题都在<h2>标签内  
                    Elements articleTitles = doc.select("h2.post-title"); // 可能需要根据实际情况调整选择器  
                    for (Element title : articleTitles) {  
                        System.out.println(title.text());  
                    }  
                }  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

代码解释:

(1)依赖项:我们使用Jsoup来解析HTML,使用Apache HttpClient来发送HTTP请求。

(2)基础URL:设置要爬取的网站的URL基础部分,这里假设分页通过URL中的page=参数控制。

(3)主函数:设置要爬取的最大页数,并在循环中调用fetchAndParsePage方法。

(4)fetchAndParsePage:

  • 使用HttpClient发送GET请求到指定的URL。
  • 检查响应状态码是否为200(成功)。
  • 使用Jsoup解析HTML字符串。
  • 选择页面上的文章标题元素(这里假设标题在<h2 class="post-title">中,我们可能需要根据实际情况调整选择器)。
  • 打印出每个找到的标题。

注意:

  • 请确保我们遵守目标网站的robots.txt规则和版权政策。
  • 本示例中的URL和选择器是假设的,我们需要根据目标网站的实际结构进行调整。
  • 在实际应用中,我们可能还需要处理异常(如网络错误、HTML解析错误等)和进行性能优化(如设置合理的请求头、连接超时时间等)。

2. 完整的代码示例

下面是一个完整的Java代码示例,它使用Apache HttpClient和Jsoup库来从一个假设的博客网站抓取文章标题。这个示例包括了必要的异常处理和一些基本的HTTP请求配置。

首先,确保我们已经将Apache HttpClient和Jsoup作为依赖项添加到我们的项目中。如果我们使用的是Maven,可以在pom.xml中添加以下依赖:

<dependencies>  
    <dependency>  
        <groupId>org.jsoup</groupId>  
        <artifactId>jsoup</artifactId>  
        <version>1.14.3</version>  
    </dependency>  
    <dependency>  
        <groupId>org.apache.httpcomponents</groupId>  
        <artifactId>httpclient</artifactId>  
        <version>4.5.13</version>  
    </dependency>  
</dependencies>

接下来是完整的Java代码示例:

import org.apache.http.client.methods.CloseableHttpResponse;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.impl.client.CloseableHttpClient;  
import org.apache.http.impl.client.HttpClients;  
import org.apache.http.util.EntityUtils;  
import org.jsoup.Jsoup;  
import org.jsoup.nodes.Document;  
import org.jsoup.nodes.Element;  
import org.jsoup.select.Elements;  
  
public class BlogSpider {  
  
    private static final String BASE_URL = "http://example.com/blog?page=";  
  
    public static void main(String[] args) {  
        int maxPages = 5; // 假设我们只爬取前5页  
  
        for (int i = 1; i <= maxPages; i++) {  
            String url = BASE_URL + i;  
            System.out.println("Fetching page: " + url);  
            try {  
                fetchAndParsePage(url);  
            } catch (Exception e) {  
                System.err.println("Error fetching and parsing page " + i + ": " + e.getMessage());  
            }  
        }  
    }  
  
    private static void fetchAndParsePage(String url) throws Exception {  
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {  
            HttpGet request = new HttpGet(url);  
            // 你可以在这里设置请求头,比如User-Agent  
            // request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");  
  
            try (CloseableHttpResponse response = httpClient.execute(request)) {  
                if (response.getStatusLine().getStatusCode() == 200) {  
                    String html = EntityUtils.toString(response.getEntity(), "UTF-8");  
                    Document doc = Jsoup.parse(html);  
  
                    // 假设每个文章标题都在<h2 class="post-title">标签内  
                    Elements articleTitles = doc.select("h2.post-title");  
                    for (Element title : articleTitles) {  
                        System.out.println(title.text());  
                    }  
                } else {  
                    System.err.println("Failed to fetch page: HTTP status code " + response.getStatusLine().getStatusCode());  
                }  
            }  
        } catch (Exception e) {  
            throw e; // 或者你可以在这里处理特定的异常,比如IOException  
        }  
    }  
}

在这个示例中,我添加了一个try-catch块来捕获fetchAndParsePage方法中可能抛出的任何异常,并将其错误消息打印到标准错误输出。同时,我添加了一个注释掉的请求头设置示例,我们可以根据需要取消注释并修改它。

请注意,这个示例中的BASE_URL和选择器h2.post-title是假设的,我们需要根据我们要爬取的实际网站的HTML结构来修改它们。

此外,这个示例使用了try-with-resources语句来自动关闭CloseableHttpClientCloseableHttpResponse资源,这是一种更简洁且安全的资源管理方式。

标签:Java,翻页,示例,http,爬虫,jsoup,import,apache,org
From: https://www.cnblogs.com/TS86/p/18292498

相关文章

  • Java volatile 深度解析
    简介被volatile修饰的变量有两大特点:当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时,JMM会把线程对应的本地内存设置为无效,需要工作线程重新回到主内存中读取最新共享变量。所以volatile的写的内存语......
  • 【转】-Java反射
    Java反射由浅入深|进阶必备原文链接本博文主要记录我学习Java反射(reflect)的一点心得,在了解反射之前,你应该先了解Java中的Class类,如果你不是很了解,可以先简单了解下。一、Java反射机制参考了许多博文,总结了以下个人观点,若有不妥还望指正:Java反射机制在程序运行时,......
  • 教你了解八大排序(含代码注释示例java)
    目录1.冒泡排序(BubbleSort)2.选择排序(SelectSort)3.插入排序(InsertionSort)4.希尔排序(ShellSort)5.归并排序(MergeSort)6.快速排序(QuickSort)7.堆排序(HeapSort)8.基数排序(RadixSort)1.冒泡排序(BubbleSort)这是最简单的排序算法之一。它......
  • 【狂神说Java】系列学习笔记01——MarkDown语法
    #MarkDown学习本文为B站老师秦疆【狂神说Java】系列,课堂学习笔记,主要联练习的是MarkDown的使用方法,老师的博客链接我没找到,广告1.标题+加粗2级3级4级5级6级最多七级标题Helloworld!Helloworld!Helloworld!Helloworld!引用-沐风6标题一级标题(#+空格)二......
  • Java IO
    JavaI/OBIO详解BIO就是:blockingIO。最容易理解、最容易实现的IO工作方式,应用程序向操作系统请求网络IO操作,这时应用程序会一直等待;另一方面,操作系统收到请求后,也会等待,直到网络上有数据传到监听端口;操作系统在收集数据后,会把数据发送给应用程序;最后应用程序受到数据,并解除......
  • java+selenium+autoIt 实现下载(打印)功能
    java+selenium+autoIt实现下载(打印)功能selenium是一个开源的自动化测试框架,它可以模拟用户对浏览器的操作,进行自动化的测试。但是,它不仅仅只能用来做测试。AutoIt是一个使用类似BASIC脚本语言的免费软件,它设计用于WindowsGUI(图形用户界面)中进行自动化操作。它利用模拟键盘......
  • [Java SE] Java-文件系统-常用文件路径的获取方法
    1获取相对路径/***获取相对路径【推荐】*使用Java提供的Path类和Paths类来获取相对路径。*例如,假设有两个路径a和b,我们可以使用Path类的relativize()方法来获取相对路径,该方法返回一个相对路径的Path对象。*/@TestpublicvoidgetRelativePathTest1(){ Pathpath......
  • JAVA-二维数组-要求计算出每个季度的总营业额和全年的总营业额-求指导
            二维数组的练习某商城每个季度的营业额如下:单位(万元)第一季度:22,66,44第二季度:77,33,88第三季度:25,45,65第四季度:11,66,99要求计算出每个季度的总营业额和全年的总营业额package_exercis;publicclassTwoArray{publicstaticvoidmain(S......
  • [深入理解Java虚拟机]Java内存模型
    Java内存模型概述多任务处理在现代计算机操作系统中几乎已是一项必备的功能了。在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络通信或者数......
  • Javase-3.运算符
    3.运算符1.算术运算符1.基本运算符:加减乘除模(+-*/%)inta=2;intb=1;System.out.println(a+b);//3System.out.println(a-b);//1System.out.println(a*b);//2System.out.println(b/a);//0int/int结果还是int类型,而且会向下取整System.out.print......