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.pswp.cn/web/42723.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42723.shtml
英文地址,請注明出處:http://en.pswp.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…