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资源,这是一种更简洁且安全的资源管理方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/42723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为机试HJ108求最小公倍数

华为机试HJ108求最小公倍数 题目&#xff1a; 想法&#xff1a; 要找到输入的两个数的最小公倍数&#xff0c;这个最小公倍数要大于等于其中最大的那个数值&#xff0c;遍历最大的那个数值的倍数&#xff0c;最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…

C++休眠的方法

Windows的API函数 Sleep(INFINITE); 休眠时间为永久 Linux的API函数sleep 没有直接表示无限时间的参数&#xff0c;根据POSIX标准&#xff0c;sleep() 函数的参数应该是 unsigned int 类型&#xff0c;因此最大可以接受的参数值是 UINT_MAX&#xff0c;即 4294967295 秒。sleep…

OpenFWI代码

重点关注文章第4部分 一、代码模块概览 这一部分了解代码主要实现的功能有哪些。 二、运行 这一部分关注如何跑通。 三、数据集 12个数据集&#xff08;11个2D1个3D&#xff09; 对计算机而言&#xff0c;上述输入、输出维度大小是按次数定义的。 以“Vel&#xff0c;F…

线程池【开发实践】

文章目录 一、为什么要用线程池1.1 单线程的问题1.2 手动创建多线程的问题1.3 线程池的作用&#xff08;优点&#xff09;1.4 线程池的使用场景 二、线程池的基础知识2.1 线程池的核心组件2.2 JUC中的线程池架构2.3 线程池的配置参数2.4 线程池常见的拒绝策略&#xff08;可自定…

appium 实战问题 播放视频时无法定位到元素

背景 在做UI自动化时&#xff0c;有播放详情页的用例&#xff0c;但是发现视频在播放的时候无法定位到元素或者很慢&#xff0c;了解到appium在动态的页面实时获取布局元素导致定位变慢。所以只能将视频暂停在操作元素&#xff0c;点击到暂停按钮又是个问题&#xff0c;通过ad…

昇思25天学习打卡营第21天|LSTM+CRF序列标注

1. 学习内容复盘 概述 序列标注指给定输入序列&#xff0c;给序列中每个Token进行标注标签的过程。序列标注问题通常用于从文本中进行信息抽取&#xff0c;包括分词(Word Segmentation)、词性标注(Position Tagging)、命名实体识别(Named Entity Recognition, NER)等。以命名…

Spring Boot项目中JPA操作视图会改变原表吗?

一直有一种认识就是:使用JPA对视图操作,不会影响到原表。 直观的原因就是视图是一种数据库中的虚拟表,它由一个或多个表中的数据通过SQL查询组成。视图不包含数据本身,而是保存了一条SQL查询,这条查询是用来展示数据的。 但是在实际项目种的一个场景颠覆和纠正了这个认识…

汇川伺服 (4)FFT、机械特性、闭环、惯量、刚性、抑制振动

一、参数解释 二、FFT 三、机械特性分析 四、多级配方与对象字典 对机组网配方 对象字典 五、InoServoShop 主要是用于调试620P620N将压缩报解压后不需要安装就可以直接使用 六、InoDriveWorkShop 主要是调试660 670 810 520 等系列 惯量识别 Etune Stune 惯量比调试 大惯…

Error:sql: expected 1 arguments, got 2

一 背景 在测试一个API接口时&#xff0c;看到日志里面突然抛出一个错误&#xff1a;Error:sql: expected 1 arguments, got 2 看了下&#xff0c;对应的表里面是有相关数据的&#xff0c;sql语句放在mysql里面执行也是没问题&#xff01;那奇了怪了&#xff0c;为啥会产生这样…

git只列出本地分支

git只列出本地分支 git branch --list git强制删除本地分支 git branch -D_error: the branch dlx-test is not fully merged. -CSDN博客文章浏览阅读648次。git branch -d 可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删除特定分支。git删除远程remote分支…

算法之工程化内容(2)—— Git常用命令

目录 1. git初始化配置 2. 新建仓库 3. 工作区——>暂存区——>本地仓库 4. git reset回退版本 5. 查看差异 git diff 6. 删除文件git rm 7. .gitignore 8. vscode操作git 9. git分支、合并和删除 10. 解决合并冲突 11. 回退和rebase 12. 添加远程仓库 参考链接&#xff…

【Go语言】Go语言的占位符

Go语言的占位符 Golang 的字符串占位符在 fmt 包的各种打印函数中使用&#xff0c;如 fmt.Printf、fmt.Sprintf。 变量值与类型的打印 %v: 打印变量的值 %v 会根据变量的类型选择合适的格式进行打印。对于结构体&#xff0c;%v 会打印出结构体的字段。对于指针类型&#xf…

Linux 网络--TCP协议收包流程(NAPI机制)

Linux 网络--TCP协议收包流程&#xff08;NAPI机制&#xff09; 平台环境简介&#xff1a;宿主机: ubuntu18.04Linux内核源码版本: Linux-4.15网卡驱动: Intel e1000 &#xff08;ubuntu 虚拟机默认网卡驱动&#xff09;协议&#xff1a;TCP协议&#xff0c;本文分析收包过程 本…

缓存新境界:Eureka中服务的分布式缓存实现策略

缓存新境界&#xff1a;Eureka中服务的分布式缓存实现策略 引言 在微服务架构中&#xff0c;服务间的通信和数据交换频繁&#xff0c;引入分布式缓存可以显著提高系统性能和响应速度。Eureka作为Netflix开源的服务发现框架&#xff0c;虽然本身不提供缓存机制&#xff0c;但可…

【线程状态-2】

1、线程礼让 &#xff08;1&#xff09;礼让线程&#xff0c;让当前正在执行的线程暂停&#xff0c;但不阻塞 &#xff08;2&#xff09;将线程从运行状态转为就绪状态 &#xff08;3&#xff09;让cpu重新调度&#xff0c;礼让不一定成功&#xff01;看cpu心情 package st…

单对以太网:工业4.0时代的通信革命

单对以太网连接器概述 单对以太网&#xff08;Single Pair Ethernet&#xff0c;简称SPE&#xff09;是一种新兴的以太网技术&#xff0c;它通过一对双绞线实现数据传输&#xff0c;支持PoDL&#xff08;Power over Data Line&#xff09;技术&#xff0c;为终端设备提供电力供…

【AI工具介绍】— webkit简介

目录 一、起源与发展 二、核心组件与功能 三、特性与优势 四、应用与影响 五、结论 一、起源与发展 WebKit起源于苹果公司&#xff0c;最初是为了开发Safari浏览器而创建的。WebKit项目的起源可以追溯到苹果公司在2001年推出基于Unix的操作系统Mac OS X时&#xff0c;对浏…

windows JDK11 与JDK1.8自动切换,以及切换后失效的问题

1.windows安装不同环境的jdk 2.切换jdk 3.切换失败 原因&#xff1a;这是因为当我们安装并配置好JDK11之后它会自动生成一个环境变量&#xff08;此变量我们看不到&#xff09;&#xff0c;此环境变量优先级较高&#xff0c;导致我们在切换回JDK8后系统会先读取到JDK11生成的…

Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的中小型企业财务管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单…

Spark实现电商消费者画像案例

作者/朱季谦 故事得从这一张图开始说起—— 可怜的打工人准备下班时&#xff0c;突然收到领导发来的一份电商消费者样本数据&#xff0c;数据内容是这样的—— 消费者姓名&#xff5c;年龄&#xff5c;性别&#xff5c;薪资&#xff5c;消费偏好&#xff5c;消费领域&#x…