Java+Jsoup實現最基本的網頁爬蟲功能

Java+Jsoup實現最基本的網頁爬蟲功能

Jsoup簡介

Jsoup是一款Java的HTML解析器,可直接解析某個URL地址,HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於Jquery的操作方法取出和操作數據。

Jsoup的主要功能如下

  1. 從一個URL,文件或字符串中解析HTML;
  2. 使用DOM或CSS選擇器來查找,取出數據;
  3. 可操作性HTML元素,屬性,文本;

Jsoup是基於MIT協議發佈的,可放心適用於商業項目。
最近在寫項目的時候正好需要使用爬蟲功能,所以就先學習了一下。目標是爬一個學校網站的新聞首頁,然後保存在本地數據庫,本片文章先介紹第一步,如何使用Java語言爬去靜態網頁上的信息。

第一步 導入Jsoup jar包

我自己建的項目是Maven項目,直接在pom文件中加入以下依賴就ok了。不是Maven項目需要jar包的可以評論以下我私發給你。

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.9.2</version>
</dependency>

第二步 獲取網頁,通過Jsoup解析網頁內容

Jsoup處理HTML文件,是將用戶輸入的HTML文檔,解析轉換成一個Document對象進行處理。Jsoup一般支持一下幾種來源內容的轉換。全部代碼在最下方。

  • 解析一個HTML字符串
  • 解析一個Body片段
  • 根據一個url地址加載Document對象
  • 根據一個文件加載Document對象
    我們有URL地址,所以採用URL來加載Document對象。
			//通過Jsoup的Connect方法獲取document類
			Document document = Jsoup.connect("http://www.haie.edu.cn/xyxw.htm").get();
			System.out.println(document.title());//控制檯打印網頁標題

我們可以根據URL獲取一個Document對象,然後我們可以對這個Document對象進行操作,網頁解析。這時候就需要對你想爬取的網站進行分析了,我要爬取的是一個較爲規範的校園新聞網頁,如下圖:

在這裏插入圖片描述
單擊右鍵,選擇檢查選項,就我的這個網頁來說,我想取的信息是校園新聞的標題,新聞URL以及後邊的標題。檢查網頁,看看這些html標籤有沒有相同的標識,如:
在這裏插入圖片描述
圖上可以看到,網頁新聞標題的a標籤統一使用 class = “c125126” 這個樣式,同理的我們也可以取到後面的時間標籤。
Document類有很多方法可以用來獲取內容,常用的方法如下:

查找元素:

  • getElementById(String id)
  • getElementsByTag(String tag)
  • getElementsByClass(String className)
  • getElementsByAttribute(String key)

元素數據:

  • attr(String key)獲取屬性attr(String key, String value)設置屬性
  • attributes()獲取所有屬性
  • id() , className() and classNames()
  • text() 獲取文本內容

用的比較多的就是這些,我們剛剛知道了新聞a標籤都具有相同的class,可以使用getElementsByClass 方法獲取Elements。

			//根據class獲取Elements類
			Elements titleElement = document.getElementsByClass("c125126");//標題
			Elements timeElement = document.getElementsByClass("timestyle125126");//時間

我們可以根據獲取的Element類來取到我們想要的文字內容。輸出到控制檯看起來不是很舒服,我把它寫入到指定的txt文件裏,這樣看起來比較舒服。

			//指定文件名及路徑
			File file = new File("D:\\Jsoup\\title.txt");
			File contentFile = new File("D:\\Jsoup\\content.txt");
			if(!file.exists()){
				file.createNewFile();
			}
			if(!contentFile.exists()){
				contentFile.createNewFile();
			}
			
			//寫入本地
			PrintWriter pw = new PrintWriter("D:\\Jsoup\\title.txt");
			PrintWriter contentPw = new PrintWriter("D:\\Jsoup\\content.txt");
			for (int i = 0; i < titleElement.size(); i++) {
				pw.println(titleElement.get(i).text());
				pw.println(titleElement.get(i).attr("href"));
				pw.println(timeElement.get(i).text());
				pw.println("---------------------------");
			}
			pw.close();

這裏我們取到了新聞的標題和URL,把它輸入到了指定的文件中,然後我們根據每個新聞的URL,再次重複第一步動作,打開這個URL,連接到新聞詳細信息網頁,抓取新聞的詳細信息,和作者時間等信息。
在這裏插入圖片描述
分析了頁面之後,操作和上面一樣,取出作者和文章詳細內容。

for (int i = 0; i < titleElement.size(); i++) {
				String href = titleElement.get(i).attr("href");//取出新聞標題的url
				String schoolHref = "http://www.haie.edu.cn/";
				//因爲取出來的新聞url不規範,直接訪問不了,需要將其拼接成正常的網頁url
				String contentHref = schoolHref+href;
				//重複第一步的內容,根據URL取Documet類
				Document contentDoc = Jsoup.connect(contentHref).get();
				//繼續觀察網頁,取出新聞詳細頁面的文字。
				Elements contentElement = contentDoc.getElementsByClass("contentstyle125127");
				Elements authorElement = contentDoc.getElementsByClass("authorstyle125127");
				String content = contentElement.text();
				String author = authorElement.text();
				//打印出作者,新聞詳細內容
				contentPw.println(author);
				contentPw.println(content);
				contentPw.println("---------------------------");
			}
			contentPw.close();

注意一下,一些url很可能不是很規範,譬如我爬取的這個頁面,新聞列表頁去的URL需要在前方加網頁的網址,拼接成新聞真正的URL。就是下面的地方:
在這裏插入圖片描述

如果你需要全部代碼,下方是全部代碼~

package com.zhangsmile.work;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class JsoupDemo {
	
	public static void main(String[] args) {
		
		try {
			//通過Jsoup的Connect方法獲取document類
			Document document = Jsoup.connect("http://www.haie.edu.cn/xyxw.htm").get();
			System.out.println(document.title());//控制檯打印網頁標題
			
			//根據class獲取Elements類
			Elements titleElement = document.getElementsByClass("c125126");//標題
			Elements timeElement = document.getElementsByClass("timestyle125126");//時間
			
			//指定文件名及路徑
			File file = new File("D:\\Jsoup\\title.txt");
			File contentFile = new File("D:\\Jsoup\\content.txt");
			if(!file.exists()){
				file.createNewFile();
			}
			if(!contentFile.exists()){
				contentFile.createNewFile();
			}
			
			//寫入本地
			PrintWriter pw = new PrintWriter("D:\\Jsoup\\title.txt");
			PrintWriter contentPw = new PrintWriter("D:\\Jsoup\\content.txt");
			for (int i = 0; i < titleElement.size(); i++) {
				pw.println(titleElement.get(i).text());
				pw.println(titleElement.get(i).attr("href"));
				pw.println(timeElement.get(i).text());
				pw.println("---------------------------");
			}
			pw.close();
			
			for (int i = 0; i < titleElement.size(); i++) {
				String href = titleElement.get(i).attr("href");//取出新聞標題的url
				String schoolHref = "http://www.haie.edu.cn/";
				//因爲取出來的新聞url不規範,直接訪問不了,需要將其拼接成正常的網頁url
				String contentHref = schoolHref+href;
				//重複第一步的內容,根據URL取Documet類
				Document contentDoc = Jsoup.connect(contentHref).get();
				//繼續觀察網頁,取出新聞詳細頁面的文字。
				Elements contentElement = contentDoc.getElementsByClass("contentstyle125127");
				Elements authorElement = contentDoc.getElementsByClass("authorstyle125127");
				String content = contentElement.text();
				String author = authorElement.text();
				//打印出作者,新聞詳細內容
				contentPw.println(author);
				contentPw.println(content);
				contentPw.println("---------------------------");
			}
			contentPw.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

輸出結果

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
這是很簡單的例子,爬下來的數據還可以存到數據庫裏,我還用了一個很好用的爬蟲框架,下一篇再說~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章