HttpUnit爬取中國知網特定大學網頁
阿新 • • 發佈:2018-12-03
繼昨天使用Selenium+ChromeDriver爬取中國知網頁面後,今天又想到了一些別的方法,就是HtmlUnit,作為一名萌新程式設計師,多寫寫總是好的,操蛋的是,還沒想出好的爬取方法。
奉上jar包
<!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit --> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.29</version> </dependency> <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit-core-js --> <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit-core-js</artifactId> <version>2.28</version> </dependency>
HtmlUnit就是無GUI的瀏覽器操作頁面,本質上還是一個瀏覽器,所以在本質上和Selenium差別不大吧,穩定性可能存在差異。
說一下我的思路把找到特定大學的網址,檢索出論文數量,和頁面數量,抓取每個論文連線特有的filename,然後點選下一頁,以福建農林大學為例,總共100355篇論文,我最多的時候抓取到了10339條記錄,還是不完善。
下面就是程式碼了:
package com.qdcz.plugins;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit .html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSpan;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.List;
public class CnkiPost {
/*
* 獲取動態url
* throws IOException
* InterruptedException
* */
public static void main(String args[]) throws IOException, InterruptedException {
HtmlPage page=null;
WebClient webClient=new WebClient();
// 禁止JS
//webClient.getOptions().setJavaScriptEnabled(false); 暫不需要下一頁需要js渲染點選
// 禁止CSS
webClient.getOptions().setCssEnabled(false);
// 將返回錯誤狀態碼錯誤設定為false
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
// 啟動客戶端重定向
webClient.getOptions().setRedirectEnabled(true);
page=webClient.getPage("http://navi.cnki.net/knavi/PPaperDetail?pcode=CDMD&logo=GFJNU");
//休息等待資料緩衝
Thread.sleep(2000);
//獲取總頁數
List<HtmlSpan> span=page.getByXPath("//*[@id=\"partiallistcount2\"]");
String nums=span.get(0).asText();
int num=Integer.parseInt(nums);
System.out.println(num);
int y=0;
for(int j=0;j<num;j++){
List<HtmlAnchor> l=page.getByXPath("//*[@id=\"rightCatalog\"]/div[2]/div[2]/table/tbody/tr/td/a");
//獲取論文的獨有的filename
for(int i=0;i<l.size();i++){
String links=StringUtils.substringAfter(l.get(i).toString(),"FD&");
String linkss=StringUtils.substringBefore(links,"&tab");
System.out.println("--"+ i+"--"+linkss);
y++;
}
System.out.println("現在爬取到"+ (j+1)+"頁");
//點選下一頁
HtmlAnchor next=(HtmlAnchor) page.getByXPath("//*[@id=\"rightCatalog\"]/div[1]/div[2]/a[2]").get(0);
next.click();
Thread.sleep(3500);
}
System.out.println(y);
}
}
老大布置的活過了幾天了,還是原地踏步,心塞,頭疼。
諸位有什麼好的想法,可以告知一下在下,不勝感激。