1. 程式人生 > >爬蟲學習1-爬從基礎jsoup

爬蟲學習1-爬從基礎jsoup

java爬從使用jsoup工具包,主要利用了css的選擇器選擇元素獲取資訊,demo程式碼如下:

package com.jack.spiderone.test;

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

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * create by jack 2018/11/17
 *
 * @author jack
 * @date: 2018/11/17 15:32
 * @Description:
 *
 *
 * 1,Node(節點):HTML 中所包含的內容都可以看成一個節點。節點有很多種型別:屬性節點(Attribute)、註釋節點(Note)、文字節點(Text)、元素節點(Element)等。解析 HTML 內容的過程,其實就是對節點操作的過程。
2,Element(元素):元素是節點的子集,所以一個元素也是一個節點。
3,Document(文件):指整個 HTML 文件的原始碼內容。
 *
 */
public class JsoupTest1 {

    /**
     * 1,網頁對應的 HTML 檔案
     *
     * @throws IOException
     */
    public static void JsoupTest1() throws IOException {
        //get方式獲取html
        //Document doc = Jsoup.connect("http://www.w3school.com.cn/b.asp").get();
        //System.out.println(doc);

        //通過post方式獲取html
        //可以看到該網址通過兩種方法都能請求到內容
        //Document doc = Jsoup.connect("http://www.w3school.com.cn/b.asp").post();
        //System.out.println(doc);

        //設定延遲時間,5000指5秒
        Document doc = Jsoup.connect("http://www.w3school.com.cn/b.asp").timeout(5000).get();
        System.out.println(doc);

    }


    /**
     * 2,設定請求頭信心
     *
     * @throws IOException
     */
    public static void JsoupTest2() throws IOException {
        //獲取請求連線
        Connection connect = Jsoup.connect("http://www.w3school.com.cn/b.asp");
        //使用Map集合儲存頭資訊
        Map<String, String> header = new HashMap<String, String>();
        header.put("Host", "www.w3school.com.cn");
        header.put("User-Agent", " Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36");
        header.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
        header.put("Accept-Language", "zh-cn,zh;q=0.5");
        header.put("Accept-Encoding", "gzip, deflate");
        header.put("Cache-Control", "max-age=0");
        header.put("Connection", "keep-alive");
         //新增頭資訊
        Connection conheader = connect.headers(header);
         //使用get()請求頁面內容
        Document document = conheader.get();
         //輸出頁面內容
        System.out.println(document);
    }


    /**
     * 3,給定一個 HTML 字串,jsoup 使用 Jsoup.parse(String html) 的方法,
     * 將 String 型別的 HTML 轉化成了 Document 型別,
     * 並可以使用 select 選擇器定位要解析的內容
     * @throws IOException
     */
    public static void JsoupTest3() throws IOException{
        //需要解析的HTML文字
        String html = "<html><body><div id=\"w3school\"> <h1>瀏覽器指令碼教程</h1> <p><strong>從左側的選單選擇你需要的教程!</strong></p> </div>"
                + "<div>  <div id=\"course\"> <ul> <li><a href=\"/js/index.asp\" title=\"JavaScript 教程\">JavaScript</a></li> </ul> </div> </body></html>";

        //轉化成Document
        Document doc = Jsoup.parse(html);
        //獲取Element
        Element element = doc.select("div[id=w3school]").get(0);
        //從Element提取內容(抽取一個Node對應的資訊)
        String text1 = element.select("h1").text();
        //從Element提取內容(抽取一個Node對應的資訊)
        String text2 = element.select("p").text();
        System.out.println("輸出解析的元素內容為:");
        System.out.println(element);
        System.out.println("抽取的文字資訊為:");
        System.out.println(text1 + "\n" + text1);
    }


    /**
     * 4,jsoup解析URL載入的Document
     * @throws IOException
     */
    public static void JsoupTest4() throws IOException{
        //獲取URL對應的HTML內容
        Document doc = Jsoup.connect("http://www.w3school.com.cn/b.asp").timeout(5000).get();
        System.out.println(doc);
        //select選擇器解析內容
        //獲取Element,這裡相當於div[id=w3school]
        Element element = doc.select("div#w3school").get(0);
        //從Element提取內容(抽取一個Node對應的資訊)
        String text1 = element.select("h1").text();
        //從Element提取內容(抽取一個Node對應的資訊)
        String text2 = element.select("p").text();
        System.out.println("輸出解析的元素內容為:");
        System.out.println(element);
        System.out.println("抽取的文字資訊為:");
        System.out.println(text1 + "\t" + text2);
    }


    /**
     *5,
     *
     * @throws IOException
     */
    public static void JsoupTest5() throws IOException{
        //獲取URL對應的HTML內容
        Document doc = Jsoup.connect("http://www.w3school.com.cn/b.asp").timeout(5000).get();
         //層層定位到要解析的內容,可以發現包含多個li標籤
        //Elements elements = doc.select("div[id=course]").select("li");
        Elements elements = doc.select("div#course").select("li");
         //遍歷每一個li節點
        for (Element ele : elements) {
            //.text()為解析標籤中的文字內容
            String title = ele.select("a").text();
            //.attr(String)表示獲取標籤內某一屬性的內容
            String course_url = ele.select("a").attr("href");
            System.out.println("課程的標題為:" + title + "\t對應的URL為:" + course_url);
        }
    }


    /**
     * 6,
     * getElementById(String id)  //通過id查詢
     getElementsByTag(String tag)  //通過標籤查詢
     getElementsByClass(String className) //通過類名查詢
     getElementsByAttribute(String key) (and related methods)  //通過屬性查詢
     Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()  //獲取兄弟節點
     Graph: parent(), children(), child(int index) //獲取節點的父節點,子節點
     * @throws IOException
     */
    public static void JsoupTest6() throws IOException{
        //獲取URL對應的HTML內容
        Document doc = Jsoup.connect("http://www.w3school.com.cn/b.asp").timeout(5000).get();
        //層層定位到要解析的內容,可以發現包含多個li標籤
        //通過id定位,並獲取文字
        System.out.println("通過id提取的結果為:" + doc.getElementById("course").text());
        System.out.println("通過tag提取的結果為:" + doc.getElementById("course").getElementsByTag("a").text());
        System.out.println("通過attr提取的結果為:" + doc.getElementById("course").getElementsByAttribute("href").text());
        //獲取HTML文件中指定class名的所有元素
        Elements elements = doc.getElementsByClass("browserscripting");
        System.out.println("通過class提取的元素為:" + elements);
    }


    /**
     * 7,
     * @throws IOException
     */
    public static void JsoupTest7() throws IOException{
        //獲取URL對應的HTML內容
        Document doc = Jsoup.connect("http://www.w3school.com.cn/b.asp").timeout(5000).get();
        //[attr=value]: 利用屬性值來查詢元素,例如[id=course]; 通過tagname: 通過標籤查詢元素,比如:a
        System.out.println(doc.select("[id=course]").select("a").get(0).text());
        //fb[[attr=value]:利用標籤屬性聯合查詢
        System.out.println(doc.select("div[id=course]").select("a").get(0).text());
        //#id: 通過ID查詢元素,例如,#course
        System.out.println(doc.select("#course").select("a").get(0).text());
        //通過屬性屬性查詢元素,比如:[href]
        System.out.println(doc.select("#course").select("[href]").get(0).text());
       //.class通過class名稱查詢元素
        System.out.println(doc.select(".browserscripting").text());
       //[attr^=value], [attr$=value], [attr*=value]利用匹配屬性值開頭、結尾或包含屬性值來查詢元素(很常用的方法)
        System.out.println(doc.select("#course").select("[href$=index.asp]").text());
        //[attr~=regex]: 利用屬性值匹配正則表示式來查詢元素,*指匹配所有元素
        System.out.println(doc.select("#course").select("[href~=/*]").text());
    }

    public static void main(String[] args) throws IOException {
        //1,獲取html
        //JsoupTest1();
        //2,設定請求頭新獲取html
        //3,JsoupTest2();
        //JsoupTest3();
        //JsoupTest4();
        //JsoupTest5();
        //JsoupTest6();
        JsoupTest7();
    }
}

相關引入的jar包:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.jack</groupId>
	<artifactId>spider-one</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>spider-one</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.0.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- 爬蟲主要工具包https://mvnrepository.com/artifact/org.jsoup/jsoup -->
		<dependency>
			<groupId>org.jsoup</groupId>
			<artifactId>jsoup</artifactId>
			<version>1.11.3</version>
		</dependency>

		<!-- http請求工具包https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
		<dependency>
			<groupId>org.apache.httpcomponents</groupId>
			<artifactId>httpclient</artifactId>
			<version>4.5.6</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.8.1</version>
		</dependency>

		<!--Commons-BeanUtils 提供對 Java 反射和自省API的包裝 https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils</artifactId>
			<version>1.9.3</version>
		</dependency>

		<!--Codec 包含一些通用的編碼解碼演算法。包括一些語音編碼器, Hex, Base64, 以及URL encoder. https://mvnrepository.com/artifact/commons-codec/commons-codec -->
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.11</version>
		</dependency>
		<!-- 提供一個類包來擴充套件和增加標準的 Java Collection框架 https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-collections4</artifactId>
			<version>4.2</version>
		</dependency>

		<!-- FileUpload 使得在你可以在應用和Servlet中容易的加入強大和高效能的檔案上傳能力https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.3</version>
		</dependency>

		<!--是一個 I/O 工具集 https://mvnrepository.com/artifact/commons-io/commons-io -->
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.6</version>
		</dependency>


		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.4</version>
			<scope>provided</scope>
		</dependency>



		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

原始碼地址:

原始碼