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语句来自动关闭CloseableHttpClient和CloseableHttpResponse资源,这是一种更简洁且安全的资源管理方式。
相关文章:
Java爬虫翻页
编写一个Java爬虫以进行翻页通常涉及到使用HTTP客户端(如Apache HttpClient或OkHttp)来发送请求,解析HTML页面(如使用Jsoup库),以及处理分页逻辑(如通过URL参数或页面内的链接进行翻页ÿ…...
.net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
1、/etc/systemd/system/ 目录下创建service文件 如:/etc/systemd/system/testDemoSer.service 2、文件内容示例: [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里如何使用页面滚动距离函数,我们会先学习该函数的基础,然后通过滚动到指定位置后显示对应元件位案例来学习怎么应该这个函数。具体效果可以打开下方试看版视频观看。 注:函数教程主要是讲解函数的用法,不包含案例中元件的制…...
【Linux】:程序替换
朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux程序替换的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门…...
使用ResizeObserver观察DOM元素的尺寸变化
文章目录 关于ResizeObserver示例代码示例代码结果如下所示echarts自适应容器div大小示例代码结果如下所示echarts自适应容器大小的方式二 关于ResizeObserver 关于这个Web API,可以看mdn的官网,ResizeObserver - Web API | MDN (mozilla.org)ÿ…...
前端使用Vue和Element实现可拖动弹框效果,且不影响底层元素操作(可拖拽的视频实时播放弹框,底层元素可以正常操作)
简述:在前端开发中,弹框和实时视频播放是常见的需求。这里来简单记录一下,如何使用Vue.js和Element UI实现一个可拖动的弹框,并在其中播放实时视频。同时,确保在拖拽弹框时,底层元素仍然可以操作。 一、项目…...
文华财经多空K变色支撑压力画线趋势波段指标公式
文华财经多空K变色支撑压力画线趋势波段指标公式: 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 漏洞名称:CVE-2024-23672 影响版本:tomcat9.0.0-M1 to 9.0.85;tomcat8.5.0 to 8.5.98 处理…...
ChatGLM-6B入门
ChatGLM-6B ChatGLM-6B 一、介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最…...
项目实战--Spring Boot + GraphQL实现实时数据推送
背景 用户体验不断提升而3对实时数据的需求日益增长,传统的数据获取方式无法满足实时数据的即时性和个性化需求。 GraphQL作为新兴的API查询语言,提供更加灵活、高效的数据获取方案。结合Spring Boot作为后端框架,利用GraphQL实现实时数据推…...
ASPICE是汽车软件开发中的质量保证流程
复杂的汽车系统对软件的质量和可靠性提出了极高的要求。为了确保汽车软件的高质量和可靠性,ASPICE(Automotive SPICE,汽车软件过程改进和能力确定)流程应运而生。本文将对ASPICE流程进行详细介绍。 一、ASPICE概述 ASPICE是汽车行…...
Linux调试器-gdb使用以及Linux项目自动化构建工具-make/Makefile
目录 1.gdb背景2.开始使用gdb3.make/makefile 背景4.实例代码5.依赖关系6.依赖方法7.原理8.项目清理 1.gdb背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生…...
Html5前端基本知识整理与回顾下篇
今天我们继续结合发布的Html5基础知识点文档进行复习,希望对大家有所帮助。 目录 列表 无需列表 有序列表 自定义列表 样例 表格 基本属性 编辑 相关属性 Border Width Height 编辑 表格标题 编辑 表格单元头 合并单元格 垂直单元格合并 水…...
vmware 虚拟机扩容 centos 硬盘扩容 kylinos v10扩容
1. 虚拟机先扩容 1.1 关机,并点击系统,让他是点选状态,但是没开机 1.2 右击,点击最下方设置,点击硬盘 1.3 点击扩展磁盘 1.4 选择你需要扩容的大小,数字为总大小 完成提示: 磁盘已成功扩展。您…...
什么样的开放式耳机好用?,五大超强卷王单品推荐!
对于热衷尝试不同耳机类型的小伙伴们而言,经过对佩戴舒适度、音质清晰度及电池续航能力的全面考量,开放式蓝牙耳机因其卓越的平衡性脱颖而出,成为多数人的心头好。其轻巧设计不仅保证了长时间佩戴的舒适感,还兼顾了音质与续航的双…...
java使用poi-tl模版引擎导出word之饼状图生成及循环批量生成饼状图
文章目录 一、单个饼状图生成1.word模版制作2.编写接口完整代码3.导出结果 二、批量生成饼图1.word模版制作2.编写接口完整代码3.导出结果 一、单个饼状图生成 1.word模版制作 在word中创建一个饼状图,点击图表,点击“文本选项”,在可选文字…...
指定版本ceph-common安装
如,安装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)
注意: 本内容为摘抄网上的学习资料,作为个人笔记使用,如有侵权, 立刻删除。 C语言特性 1.关键字 (1)static static全局变量和普通全局变量 面试高频指数:★★★☆☆ 相同点: 存储方式&…...
在Ubuntu 16.04上安装和配置VNC的方法
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 ###介绍 VNC,即“Virtual Network Computing”,是一种连接系统,允许您使用键盘和鼠标与远程服务器上…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
