[Java爬蟲] 使用 Xpath + HtmlUnit 爬取網頁基本資訊
阿新 • • 發佈:2019-02-20
一、前言
使用 Jsoup + HttpClient (組合一)基本可以爬取很多我們需要的資訊了,Xpath + HtmlUnit (組合二)的組合更是強大,無論是從選擇上,還是從解析上,都可以勝任組合一的。下面列舉一個簡單的例子,主要展示了其主要的技術:①模擬瀏覽器、②使用代理IP、③取消CSS、JS解析、④Xpath的簡單使用
二、需求
現在要爬取 CSDN 的【今日推薦】的文章標題(實際應用上,應該是爬取整篇文章,很多 IT 社群就是這樣建立起來的)
三、程式碼
package com.cun.test;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
* 核心技術:
* 1、HtmlUnit 基本使用架構
* 2、HtmlUnit 模擬瀏覽器
* 3、使用代理 IP
* 4、靜態網頁爬取,取消 CSS、JS 支援,提高速度
* @author linhongcun
*
*/
public class JsoupHttpClient {
public static void main(String[] args) {
// 例項化Web客戶端、①模擬 Chrome 瀏覽器 ✔ 、②使用代理IP ✔
WebClient webClient = new WebClient(BrowserVersion.CHROME, "118.114.77.47", 8080);
webClient.getOptions().setCssEnabled(false); // 取消 CSS 支援 ✔
webClient.getOptions().setJavaScriptEnabled(false ); // 取消 JavaScript支援 ✔
try {
HtmlPage page = webClient.getPage("https://www.csdn.net/"); // 解析獲取頁面
/**
* Xpath:級聯選擇 ✔
* ① //:從匹配選擇的當前節點選擇文件中的節點,而不考慮它們的位置
* ② h3:匹配<h3>標籤
* ③ [@class='company_name']:屬性名為class的值為company_name
* ④ a:匹配<a>標籤
*/
List<HtmlElement> spanList=page.getByXPath("//h3[@class='company_name']/a");
for(int i=0;i<spanList.size();i++) {
//asText ==> innerHTML ✔
System.out.println(i+1+"、"+spanList.get(i).asText());
}
} catch (FailingHttpStatusCodeException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
webClient.close(); // 關閉客戶端,釋放記憶體
}
}
}
pom.xml依賴
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.29</version>
</dependency>
四、效果
怎樣,是不是覺得很簡單?
——————————2018.3.22—————————
後來才發現少了網頁的原始碼,這樣使用 Xpath 的那部分程式碼就有點難以理解
今天就補上去吧,雖然今日推薦已經改了,但是標籤結構是不變的