爬蟲學習1-爬從基礎jsoup
阿新 • • 發佈:2019-02-17
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>
原始碼地址: