1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          HttpUnit 基礎知識

          來源:互聯網轉載 時間:2024-01-29 07:44:14

          HttpUnit

          htmlunit是一款開源的Java頁面分析工具,讀取頁面后,可以有效的使用htmlunit 分析頁面上的內容。項目可以模擬瀏覽器運行,被譽為Java瀏覽器的開源實現。這個沒有界面的瀏覽器,運行速度也是非常迅速的。

          起步

          依賴

          <!-- https://mvnrepository.com/artifact/net.sourceforge.htmlunit/htmlunit --><dependency>    <groupId>net.sourceforge.htmlunit</groupId>    <artifactId>htmlunit</artifactId>    <version>2.42.0</version></dependency>

          示例

          在接口中設置默認方法,子類不用實現即可調用。

          public interface NewsPuller {    void pullNews();    default Document getHtmlFromUrl(String url, boolean useHtmlUnit) throws Exception {        if (!useHtmlUnit) {            return Jsoup.connect(url)                    //模擬火狐瀏覽器                    .userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")                    .get();        }        WebClient webClient = new WebClient(BrowserVersion.CHROME); //新建一個模擬谷歌Chrome瀏覽器的瀏覽器客戶端對象        webClient.getOptions().setJavaScriptEnabled(true); //很重要,啟用JS        webClient.getOptions().setCssEnabled(false); //是否啟用CSS, 因為不需要展現頁面, 所以不需要啟用        webClient.getOptions().setActiveXNative(false);        webClient.getOptions().setCssEnabled(false);        webClient.getOptions().setThrowExceptionOnScriptError(false); //當JS執行出錯的時候是否拋出異常        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); //當HTTP的狀態非200時是否拋出異常        //webClient.setAjaxController(new NicelyResynchronizingAjaxController());//設置支持AJAX        webClient.getOptions().setUseInsecureSSL(true);        webClient.getOptions().setTimeout(10 * 1000);        HtmlPage rootPage = null;        try {            rootPage = webClient.getPage(url);            webClient.waitForBackgroundJavaScript(10 * 1000); //異步JS執行需要耗時,所以這里線程要阻塞10秒,等待異步JS執行結束            String htmlStr = rootPage.asXml(); //直接將加載完成的頁面轉換成xml格式的字符串            //System.out.println(htmlStr);            return Jsoup.parse(htmlStr); //獲取html文檔        } finally {            webClient.close();        }    }}

          模仿特定瀏覽器

          有時你想模仿一個特殊的瀏覽器,這可以通過WebClient構造函數的com.gargoylesoftware.htmlunit.BrowserVersion 參數實現,其中已經提供一些常見瀏覽器的常量,但是,你可以通過BrowserVersion 的實例說明創建你自己擁有的特殊版本。

          WebClient webClient = new WebClient(BrowserVersion.CHROME); //新建一個模擬谷歌Chrome瀏覽器的瀏覽器客戶端對象

          指定這個BrowserVersion 會改變用戶代理發送到服務器的報頭,也會改變一些JavaScript 的行為。

          支持 JavaScript

          HtmlUnit對JavaScript的支持是其最大的亮點,也是其最需要完善的地方??偟膩碚fHtmlUnit是一款很棒的java工程,值得我們花一些時間來學習和嘗試,給我們的武器庫增加一件武器,也許什么時候你就會用到它。

          webClient.getOptions().setJavaScriptEnabled(true); //很重要,啟用JS

          實際應用

          結合 Jsoup + HtmlUtil,爬取鳳凰網新聞為例子:

          @Component("ifengNewsPuller")public class IfengNewsPuller implements NewsPuller {    private static final Logger logger = LoggerFactory.getLogger(IfengNewsPuller.class);    @Value("${news.ifeng.url}")    private String url;    @Autowired    private NewsService newsService;    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    @Override    public void pullNews() {        logger.info("開始拉取鳳凰新聞!");        // 1. 獲取首頁        Document html = null;        try {            html = getHtmlFromUrl(url, false);        } catch (Exception e) {            logger.error("==============獲取鳳凰首頁失敗: {} =============", url);            e.printStackTrace();            return;        }        // 2. jsoup 獲取新聞 <a> 標簽        Elements newsATags = html.select("p#newsList")                .select("ul.news_list-3wjAJJJM")                .select("li")                .select("a");        // 3.從<a>標簽中抽取基本信息,封裝成news        HashSet<News> newsSet = new HashSet<>();        for (Element a : newsATags) {            String url = a.attr("href");            String title = a.text();            News n = new News();            n.setSource("鳳凰");            n.setUrl(url);            n.setTitle(title);            n.setCreateDate(new Date());            newsSet.add(n);        }        // 4.根據新聞url訪問新聞,獲取新聞內容        newsSet.parallelStream().forEach(news -> {            logger.info("開始抽取鳳凰新聞《{}》內容:{}", news.getTitle(), news.getUrl());            Document newsHtml = null;            try {                newsHtml = getHtmlFromUrl(news.getUrl(), false);                Elements contentElement = newsHtml.select("p.text-3zQ3cZD4");                if (contentElement.isempty()) {                    contentElement = newsHtml.select("p.caption-3_nUnnKX h1");                }                if (contentElement.isEmpty()) {                    return;                }                // 直接從頭部信息獲取部分數據                String time = newsHtml.head().select("meta[name=og:time ]").attr("content");                if (StringUtils.isNotBlank(time)) {                    news.setNewsDate(sdf.parse(time));                }                String content = contentElement.toString();                String image = NewsUtils.getImageFromContent(content);                news.setContent(contentElement.text());                news.setImage(image);                newsService.saveNews(news);                logger.info("抽取鳳凰新聞《{}》成功!", news.getTitle());            } catch (Exception e) {                logger.error("鳳凰新聞抽取失敗:{}", news.getUrl());                e.printStackTrace();            }        });        logger.info("鳳凰新聞抽取完成!");    }}

          編寫工具類

          /** * @Description: http工具(使用net.sourceforge.htmlunit獲取完整的html頁面,即完成后臺js代碼的運行) * 參考1: https://www.cnblogs.com/davidwang456/articles/8693050.html * 參考2: https://blog.csdn.net/hundan_520520/article/details/79387982 * @Author Ray * @Date 2020/8/6 0006 13:29 * @Version 1.0 */public class HttpUtils {    /**     * 請求超時時間,默認20000ms     */    private int timeout = 200000;    /**     * 等待異步JS執行時間,默認20000ms     */    private int waitForBackgroundJavaScript = 20000;    /**     * HttpUtils 實例     */    private static HttpUtils httpUtils;    /**     * 單例模式 - 私有化構造函數     */    private HttpUtils() {    }    /**     * 單例模式 - 獲取實例     */    public static HttpUtils getInstance() {        if (null == httpUtils) {            httpUtils = new HttpUtils();        }        return httpUtils;    }    /**     * 將網頁內容返回為解析后的文檔格式     * @param html 待解析的頁面     * @return 解析后的文檔     * @throws Exception     */    public static Document parseHtmlToDoc(String html) throws Exception {        return removeHtmlSpace(html);    }    /**     * 轉換空格     */    private static Document removeHtmlSpace(String str) {        Document doc = Jsoup.parse(str);        String result = doc.html().replace("&nbsp;", "");        return Jsoup.parse(result);    }    /**     * 將網頁地址返回為解析后的文檔格式     * @param url 待解析的頁面地址     * @return 解析后的文檔     * @throws Exception     */    private static Document connectToDoc(String url) throws Exception {        return Jsoup.connect(url)                //模擬火狐瀏覽器                .userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")                .get();    }    /**     * 解析頁面     * 默認解析靜態頁面,如果需要爬取動態數據,請調用重載方法并設置為 true     * @param url     * @return     * @throws Exception     */    public String getHtmlPageResponse(String url) throws Exception {        return getHtmlPageResponse(url, false);    }    public String getHtmlPageResponse(String url, boolean useHtmlUnit) throws Exception {        if (!useHtmlUnit) {            return connectToDoc(url).toString();        }        WebClient webClient = new WebClient(BrowserVersion.CHROME); //新建一個模擬谷歌Chrome瀏覽器的瀏覽器客戶端對象        webClient.getOptions().setJavaScriptEnabled(true); //很重要,啟用JS        webClient.getOptions().setCssEnabled(false); //是否啟用CSS, 因為不需要展現頁面, 所以不需要啟用        webClient.getOptions().setActiveXNative(false);        webClient.getOptions().setCssEnabled(false);        webClient.getOptions().setThrowExceptionOnScriptError(false); //當JS執行出錯的時候是否拋出異常        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); //當HTTP的狀態非200時是否拋出異常        webClient.setAjaxController(new NicelyResynchronizingAjaxController());//設置支持AJAX        webClient.getOptions().setTimeout(timeout); //設置“瀏覽器”的請求超時時間        webClient.setJavaScriptTimeout(timeout); //異步JS執行需要耗時, 等待異步JS執行結束        HtmlPage rootPage;        String result = "";        try {            rootPage = webClient.getPage(url); //設置鏈接地址            webClient.waitForBackgroundJavaScript(waitForBackgroundJavaScript);  //該方法阻塞線程            result = rootPage.asXml(); //直接將加載完成的頁面轉換成xml格式的字符串        } finally {            webClient.close();        }        return result;    }    /**     * 獲取頁面文檔Document對象     * 默認 false     */    public Document getHtmlPageResponseAsDocument(String url) throws Exception {        return parseHtmlToDoc(getHtmlPageResponse(url, false));    }    /**     * 獲取頁面文檔Document對象     * (如果為 true 等待異步JS執行)     */    public Document getHtmlPageResponseAsDocument(String url, boolean useHtmlUnit) throws Exception {        return parseHtmlToDoc(getHtmlPageResponse(url, useHtmlUnit));    }    public int getTimeout() {        return this.timeout;    }    /**     * 設置請求超時時間     */    public void setTimeout(int timeout) {        this.timeout = timeout;    }    public int getWaitForBackgroundJavaScript() {        return waitForBackgroundJavaScript;    }    /**     * 設置獲取完整HTML頁面時等待異步JS執行的時間     */    public void setWaitForBackgroundJavaScript(int waitForBackgroundJavaScript) {        this.waitForBackgroundJavaScript = waitForBackgroundJavaScript;    }}
          /** * @Description: HttpUtils 工具類測試 * @Author Ray * @Date 2020/8/6 0006 14:22 * @Version 1.0 */@SpringBootTestpublic class HttpUtilsTest {    private static final String TEST_URL_STATIC = "https://www.baidu.com/";    private static final String TEST_URL_NOT_STATIC = "http://www.ifeng.com/";    /**     * 處理靜態頁面     */    @Test    public void testGetHtmlPageResponse() {        HttpUtils httpUtils = HttpUtils.getInstance();        httpUtils.setTimeout(30000);        httpUtils.setWaitForBackgroundJavaScript(30000);        try {            String htmlPageStr = httpUtils.getHtmlPageResponse(TEST_URL_STATIC);            System.out.println(htmlPageStr);        } catch (Exception e) {            e.printStackTrace();        }    }    @Test    public void testGetHtmlPageResponseAsDocument() {        HttpUtils httpUtils = HttpUtils.getInstance();        httpUtils.setTimeout(30000);        httpUtils.setWaitForBackgroundJavaScript(30000);        try {            Document document = httpUtils.getHtmlPageResponseAsDocument(TEST_URL_STATIC);            System.out.println(document);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 處理非靜態頁面     */    @Test    public void testGetHtmlPageResponse2() {        HttpUtils httpUtils = HttpUtils.getInstance();        httpUtils.setTimeout(30000);        httpUtils.setWaitForBackgroundJavaScript(30000);        try {            String htmlPageStr = httpUtils.getHtmlPageResponse(TEST_URL_NOT_STATIC, true);            System.out.println(htmlPageStr);        } catch (Exception e) {            e.printStackTrace();        }    }    @Test    public void testGetHtmlPageResponseAsDocument2() {        HttpUtils httpUtils = HttpUtils.getInstance();        httpUtils.setTimeout(30000);        httpUtils.setWaitForBackgroundJavaScript(30000);        try {            Document document = httpUtils.getHtmlPageResponseAsDocument(TEST_URL_NOT_STATIC, true);            System.out.println(document);        } catch (Exception e) {            e.printStackTrace();        }    }}
          標簽:httpunit-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          達摩盤和數據銀行的區別?達摩盤是阿里巴巴基于營銷場景搭建的數據管理平臺,擁有消費者行為、興趣偏好、地理位置等諸多數據標簽。賣家可以通過達摩板塊實現對各類買家的分析,潛在買家可以通過達摩板塊的標簽快速圈定想要的目標人群,從而實現不同人群在各種營銷渠道中的定位,實現有針對性的精準營銷。數據庫(DBank網盤)是指建立在高速分布式存儲網絡上的數據中心。其最大的優勢在于將存儲產品轉化為存儲服務。數據庫通過...

          lol韓服王者排名實時查詢?查英雄聯盟職業選手排名的小程序叫 "韓服排名小程序 "所以當你打開上的搜索框,搜索 "韓服排名,可以看到韓服排名小程序,點擊即可添加。也方便搜索所有英雄聯盟職業選手的實時記錄,了解該選手的具體排名信息。怎么看lpl選手的rank?可以在opgg查詢,在小程序查看韓服排名,或者下載一個英雄聯盟官方助手。我們可以在游戲搜索中輸入他們的賬號名稱,然后就可以點擊進去查看他們的記...

          庫庫馬力為什么停止營業?庫馬利變得無趣,玩家不玩了,游戲公司在無法盈利的情況下也停止了。4399庫庫馬力目前什么車最好?火赤練,攻擊,速度:220。王者,絕對的王者。蟒蛇的時代已經過去,削鐵已成歷史~ ~是誰,是速度賽還是比賽?當然,只是暫時的。HP:650,號稱血牛的彩虹只有663 ~ EP:340,好大的驚喜~ ~ EP,永遠都是滿滿的灰色。對于技能的使用,小庫們一直擔心EP的問題,火減少了很...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>