当前位置: 首页 > news >正文

Java爬虫翻页

编写一个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爬虫翻页

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

.net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护

1、/etc/systemd/system/ 目录下创建service文件 如&#xff1a;/etc/systemd/system/testDemoSer.service 2、文件内容示例&#xff1a; [Unit] DescriptiontestDemoSer running on CentOS [Service] WorkingDirectory/usr/project/iis Typesimple Userroot Grouproot Exec…...

02 源码编译构建LAMP

目录 2.1Apache 网站服务基础 2.1.1Apache 简介 1. Apache 的起源 2. Apache的主要特点 2.1.2安装httpd服务器 1. 准备工作 2.源码编译及安装 (1)解包 (2)配置 (3)编译及安装 3.确认安装结果 4.优化执行路径 5. 添加 httpd 系统服务 2.2 httpd服务器的基本配置 …...

【Axure视频教程】页面滚动距离函数

今天教大家在Axure里如何使用页面滚动距离函数&#xff0c;我们会先学习该函数的基础&#xff0c;然后通过滚动到指定位置后显示对应元件位案例来学习怎么应该这个函数。具体效果可以打开下方试看版视频观看。 注:函数教程主要是讲解函数的用法&#xff0c;不包含案例中元件的制…...

【Linux】:程序替换

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux程序替换的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门…...

使用ResizeObserver观察DOM元素的尺寸变化

文章目录 关于ResizeObserver示例代码示例代码结果如下所示echarts自适应容器div大小示例代码结果如下所示echarts自适应容器大小的方式二 关于ResizeObserver 关于这个Web API&#xff0c;可以看mdn的官网&#xff0c;ResizeObserver - Web API | MDN (mozilla.org)&#xff…...

前端使用Vue和Element实现可拖动弹框效果,且不影响底层元素操作(可拖拽的视频实时播放弹框,底层元素可以正常操作)

简述&#xff1a;在前端开发中&#xff0c;弹框和实时视频播放是常见的需求。这里来简单记录一下&#xff0c;如何使用Vue.js和Element UI实现一个可拖动的弹框&#xff0c;并在其中播放实时视频。同时&#xff0c;确保在拖拽弹框时&#xff0c;底层元素仍然可以操作。 一、项目…...

文华财经多空K变色支撑压力画线趋势波段指标公式

文华财经多空K变色支撑压力画线趋势波段指标公式&#xff1a; VERTLINE(TIME0900,RGB(128,128,255)),DOT; VERTLINE(TIME2100,COLORBLACK),DOT; HH:HHV(HIGH,26); LL:LLV(LOW,26); HH1:BARSLAST((HH > REF(HH,1))); LL1:BARSLAST((LL < REF(LL,1))); PARTLINE((HH…...

tomcat9漏洞CVE-2024-23672

序号 漏洞名称 影响主机个数 1 Apache Tomcat 安全漏洞(CVE-2024-23672) 1/1 2 Apache Tomcat 输入验证错误漏洞(CVE-2024-24549) 1/1 漏洞名称&#xff1a;CVE-2024-23672 影响版本&#xff1a;tomcat9.0.0-M1 to 9.0.85&#xff1b;tomcat8.5.0 to 8.5.98 处理…...

ChatGLM-6B入门

ChatGLM-6B ChatGLM-6B 一、介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最…...

项目实战--Spring Boot + GraphQL实现实时数据推送

背景 用户体验不断提升而3对实时数据的需求日益增长&#xff0c;传统的数据获取方式无法满足实时数据的即时性和个性化需求。 GraphQL作为新兴的API查询语言&#xff0c;提供更加灵活、高效的数据获取方案。结合Spring Boot作为后端框架&#xff0c;利用GraphQL实现实时数据推…...

ASPICE是汽车软件开发中的质量保证流程

复杂的汽车系统对软件的质量和可靠性提出了极高的要求。为了确保汽车软件的高质量和可靠性&#xff0c;ASPICE&#xff08;Automotive SPICE&#xff0c;汽车软件过程改进和能力确定&#xff09;流程应运而生。本文将对ASPICE流程进行详细介绍。 一、ASPICE概述 ASPICE是汽车行…...

Linux调试器-gdb使用以及Linux项目自动化构建工具-make/Makefile

目录 1.gdb背景2.开始使用gdb3.make/makefile 背景4.实例代码5.依赖关系6.依赖方法7.原理8.项目清理 1.gdb背景 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 要使用gdb调试&#xff0c;必须在源代码生…...

Html5前端基本知识整理与回顾下篇

今天我们继续结合发布的Html5基础知识点文档进行复习&#xff0c;希望对大家有所帮助。 目录 列表 无需列表 有序列表 自定义列表 样例 表格 基本属性 ​编辑 相关属性 Border Width Height ​编辑 表格标题 ​编辑 表格单元头 合并单元格 垂直单元格合并 水…...

vmware 虚拟机扩容 centos 硬盘扩容 kylinos v10扩容

1. 虚拟机先扩容 1.1 关机&#xff0c;并点击系统&#xff0c;让他是点选状态&#xff0c;但是没开机 1.2 右击&#xff0c;点击最下方设置&#xff0c;点击硬盘 1.3 点击扩展磁盘 1.4 选择你需要扩容的大小&#xff0c;数字为总大小 完成提示&#xff1a; 磁盘已成功扩展。您…...

什么样的开放式耳机好用?,五大超强卷王单品推荐!

对于热衷尝试不同耳机类型的小伙伴们而言&#xff0c;经过对佩戴舒适度、音质清晰度及电池续航能力的全面考量&#xff0c;开放式蓝牙耳机因其卓越的平衡性脱颖而出&#xff0c;成为多数人的心头好。其轻巧设计不仅保证了长时间佩戴的舒适感&#xff0c;还兼顾了音质与续航的双…...

java使用poi-tl模版引擎导出word之饼状图生成及循环批量生成饼状图

文章目录 一、单个饼状图生成1.word模版制作2.编写接口完整代码3.导出结果 二、批量生成饼图1.word模版制作2.编写接口完整代码3.导出结果 一、单个饼状图生成 1.word模版制作 在word中创建一个饼状图&#xff0c;点击图表&#xff0c;点击“文本选项”&#xff0c;在可选文字…...

指定版本ceph-common安装

如&#xff0c;安装15.2.13的ceph-common PACKAGE_NAMEceph-common CEPH_VERSION15.2.13 wget -q -O- https://download.ceph.com/keys/release.asc | sudo apt-key add - echo deb http://download.ceph.com/debian-${CEPH_VERSION}/ $(lsb_release -sc) main | sudo tee …...

C++语言特性——关键字(static、volatile、extern、const、mutable、inline)

注意&#xff1a; 本内容为摘抄网上的学习资料&#xff0c;作为个人笔记使用&#xff0c;如有侵权, 立刻删除。 C语言特性 1.关键字 &#xff08;1&#xff09;static static全局变量和普通全局变量 面试高频指数&#xff1a;★★★☆☆ 相同点&#xff1a; 存储方式&…...

在Ubuntu 16.04上安装和配置VNC的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 ###介绍 VNC&#xff0c;即“Virtual Network Computing”&#xff0c;是一种连接系统&#xff0c;允许您使用键盘和鼠标与远程服务器上…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...