1. 程式人生 > >使用htmlunit採集網頁+點選網頁按鈕

使用htmlunit採集網頁+點選網頁按鈕

概念

htmlunit:這東西是java無介面瀏覽器,說白了就是全部是api操作,你就可以訪問別人的網頁。這意味著 你可以寫程式批量去做很多事情 告別手工

問題:

我們採集網頁的時候 經常發現 javascript ajax等方式加載出來的html無法採集到,

這個時候選擇htmlunit 可以解決這個煩惱 因為這貨就是一個瀏覽器 啥不能幹啊 除了沒介面而已

版本:

嘗試了2.3到2.9版本 結果跑起來發現 沒有一個能用的  可能是我使用方式不當 各種js執行異常報錯

最後使用2.15版本 同樣程式碼順利跑起來

專案是maven依賴

        <dependency>
            <groupId>net.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
            <version>2.15</version>
        </dependency>

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.7.3</version>
        </dependency>

參考程式碼:

test 1:採集網頁

// 模擬一個瀏覽器
        WebClient webClient = new WebClient(BrowserVersion.getDefault());
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);


        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.getOptions().setActiveXNative(false);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.waitForBackgroundJavaScript(10*1000);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());


        webClient.getOptions().setJavaScriptEnabled(true);

  URL URL = new URL(url);
        HtmlPage page= webClient.getPage(URL);

String firstPageHtml = page.asXml();
        Document doc = Jsoup.parse(firstPageHtml);
        Element element = doc.select(".album-page-1").first();
        String firstPagePhoto = element.html();
        outputAppend(output,firstPagePhoto);
        //追加分頁資料 根據class來獲取節點 獲取li class=pagination下面所有的a 至於你要獲取其他方式 參考xpath 
        List links = (List) page.getByXPath ("//li[@class='pagination']/a");

//迴圈去點選頁面下一頁按鈕
        if(null!=links){
            int size = links.size();
            if(size>3){
                int min = 2;
                int max = size-2;
                for(int i=min;i<=max;i++){

//因為迴圈點選頁面按鈕,返回的總是第一頁資料,所有我們乾脆就重新請求一次下一頁再發起一次瀏覽器請求 拜求大神能解決這個問題 
                    getNextPageContent(url, i);
                }
            }
        }

    private String getNextPageContent(String url,int idx) throws IOException {
        HtmlPage newPage = HtmlPager.getPage(url);
        WebClientFactory.getWebClient().waitForBackgroundJavaScript(1000*4);
        List newLinks = (List) newPage.getByXPath ("//li[@class='pagination']/a");
        HtmlAnchor newlink = (HtmlAnchor)newLinks.get(idx);
        newPage = newlink.click();
        WebClientFactory.closeAllWindows();
        String newHtml = newPage.asXml();
        Document doc = Jsoup.parse(newHtml);
        Element element = doc.select(".album-page-" + idx).first();
        return element.html();
    }

至此 結束了 文章中程式碼不一定能直接跑起來 拷貝程式碼比較麻煩 但是大體90%的邏輯都在了

希望htmlUnit儘快的強大起來 

另外求高手賜教 如何能迴圈點選獲取js執行的最新的所有html

test 2 驗證碼登入

try
        {
            WebClient webClient = new WebClient(BrowserVersion.CHROME);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);


        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.getOptions().setActiveXNative(false);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.waitForBackgroundJavaScript(10*1000);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
            HtmlPage page = webClient.getPage("http://www.***.com.cn/login.htm");


            HtmlElement username = (HtmlElement)page.getElementById("mobile");
            HtmlElement password = (HtmlElement)page.getElementById("password");
            HtmlElement valiCode = (HtmlElement)page.getElementById("checkCode");
            HtmlImage valiCodeImg = (HtmlImage) page.getElementById("checkCodeImage");
            ImageReader imageReader = valiCodeImg.getImageReader();
            BufferedImage bufferedImage = imageReader.read(0);


            JFrame f2 = new JFrame();
            JLabel l = new JLabel();
            l.setIcon(new ImageIcon(bufferedImage));
            f2.getContentPane().add(l);
            f2.setSize(300, 300);
            f2.setTitle("驗證碼");
            f2.setVisible(true);


            String valicodeStr = JOptionPane.showInputDialog("請輸入驗證碼:");
            f2.setVisible(false);
            List newLinks = (List) page.getByXPath ("//li[@class='login']/a");
            HtmlAnchor newlink = (HtmlAnchor)newLinks.get(0);

            username.click();
            username.type("123456");
            password.click();
            password.type("123456");
            valiCode.click();
            valiCode.type(valicodeStr);
            HtmlPage logingPage= newlink.click();

//拿到登入後返回資料 
           System.out.println(logingPage.getWebResponse().getContentAsString());

//繼續登陸後的操作

//......
            System.exit(0);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

相關推薦

使用htmlunit採集網頁+網頁按鈕

概念 htmlunit:這東西是java無介面瀏覽器,說白了就是全部是api操作,你就可以訪問別人的網頁。這意味著 你可以寫程式批量去做很多事情 告別手工 問題: 我們採集網頁的時候 經常發現 javascript ajax等方式加載出來的html無法採集到, 這個時

android 呼叫js webView網頁,提交按鈕無效(注意加上setWebChromeClient())

// 如果不設定這個,JS程式碼中的按鈕會顯示,但是按下去卻不彈出對話方塊 // Sets the chrome handler. This is an implementation of WebChromeClient // for

2016/6/21--網頁儲存按鈕將資料存到資料庫

——今天實現的功能是前臺表單上的儲存按鈕,將資料存到資料庫中。 貼幾段關鍵的程式碼: .jsp <span style="font-size:14px;"><form action="${ctx}/db5q/saveAddChild.do" metho

小程式嵌入web-view網頁後,網頁中的按鈕跳轉回小程式

1.首先在網頁端引入js <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.0.js"&

網頁拉到底部後,重新整理按鈕或F5,頁面內容重複顯示

正常情況: 重複顯示後: 產生問題的原因:queryActs()----queryActsAdd() 進入到改方法中了,但是還沒走到flag=false的時候,scoll觸發,此時的flag = true,因此又載入了一次queryActsAdd方法。【是不是就是

複製按鈕複製指定文字內容,實現網頁中的複製功能

<div style="width: 48px; height: 36px; position: absolute; margin-left: 232px;*margin-left:0px;_margin-left: 0">

網頁分享按鈕,觸發微信分享功能

微信公眾平臺開始支援前端網頁,大家可能看到很多網頁上都有分享到朋友圈,關注微信等按鈕,點選它們都會彈出一個視窗讓你分享和關注,這個是怎麼實現的呢?今天就給大家講解下如何在微信公眾平臺前端網頁上新增分享到朋友圈,關注微訊號等按鈕。 我們可以發現微信內嵌瀏覽器定義了一個私有 J

模擬網頁按鈕

轉自:http://blog.csdn.net/tiantian1980/article/details/12322191 點選放大 三、程式實現  <1> 取得 IHTMLDocument2 的介面指標。根據IE瀏覽器的執行方式,有多種不同的

破解網頁不可按鈕方法

一個button在網頁裡,實現不可點選比較傳統的方法是disabled=true,假設這個網頁的按鈕有id,那最簡單的方法就是直接重置它的disabled屬性。 使用ie8拿百度的首頁來做例子: 預設狀態下,“百度一下”這個按鈕是可以點選的。然後按一下F12,開啟開發人員

滑鼠網頁出現愛心特效

 像這樣的滑鼠點選網頁出現js的特效,程式碼如下,只需要直接把這段程式碼複製到<script></script>標籤下執行就可以實現了,要匯入css和js: //滑鼠點擊出現愛心特效 (function(window,

python爬蟲+網頁事件+selenium模擬瀏覽器,爬取股寶內容

(一)PYTHON的安裝(已安裝,可跳過此步驟)         1、PYTHON下載                 PYTHON官網:https://www.python.org/                                按照對應的系統下載,

webbrowser網頁內部連結阻止從IE開啟

使用mfc webbrowser控制元件載入的網頁,如果點選網頁內部連結時,總是自動使用IE瀏覽器開啟新連結網頁,那麼,該如何阻止IE開啟新連結,而是用webbrowser控制元件開啟網頁連結了。 在這裡有一種很簡單的方法,為webbrowser控制元件新增NewWindow3訊息響應 在

WKWebview與JavaScript 互動(二)監聽遠端網頁事件

引言 監聽網頁的按鈕的點選事件,並且網頁不是我們招呼一聲對方就能改的。那麼繼續。 正文 1.WKUserScript 先介紹WebKit框架一個類WKUserScript: 核心方法,傳入JS程式碼字串,返回給我們一個WKUserScr

JavaWeb-Servlet技術的監聽器-解析與例項-網站線上使用者資訊與網頁

轉載請註明出處: http://blog.csdn.net/qq_26525215 本文源自 在Web專案中,我們對下面這幾個監聽器必須熟練的使用,它們的作用真的很大。熟練的使用後,可以使我們少繞彎路,少寫很多程式碼、 事件源

js使網頁其他地方使顯示框消失

有時候我們需要實現這樣一個效果: 點選圖示或者按鈕會出現一個下拉框或者顯示框,點選圖示或者按鈕顯示框消失,或者需要點選網頁其他任意地方顯示框消失。 點選固定圖示或按鈕顯示框顯示或消失這個jQuery或者js就能很容易實現,這裡說下點選網頁其他任意地方顯示框消失。 jQ

python指令碼網頁搶購京東樂視2(現在好像不用搶購了)

前陣子,想搶太魅藍NOTE3,在京東上點選搶購了好多下,果然沒搶到。然後又關注到了樂視2,價效比高,但確實 沒有魅藍好看,電池也小。為了不想重複點選搶購操作,用splinter模組來模擬滑鼠點選操作,辦法很笨,搶購效果差,但也成功過,只是沒下決心買就取消

手機網頁連結觸發手機自動撥打或儲存電話的程式碼

通過網頁撥打電話    <p><a href=”wtai://wp/mc;135xxxxxxxx ”>撥打電話</a></p>   注: 135xxxxxxxx是號碼, 你可以換成你想撥打的號碼.   通過

網頁連結,跳轉qq新增好友

 一、網頁版本點選跳轉到新增好友介面: http://wpa.qq.com/msgrd?v=3&uin=1570915261&site=qq&menu=yes 效果:

如何網頁上的某個連結,達到啟動本機應用程式的目的。

如何點選網頁上的某個連結,達到啟動本機應用程式的目的, 我們經常會在網站看到線上qq客服,只要你一點選,電腦就會自動啟動本機的qq,在你成功登陸之後彈出一個臨時聊天的視窗。 具體程式碼: <a href="tencent://message/?uin=215555521&Site=J

模擬網頁事件

本文純粹無聊為了玩耍,向各位指令碼大神(阿里搶月餅系 )致敬 一言不合就開幹,百度咯,先找到百度的“百度”按鈕 主要是為了找到id ,模擬點選事件:document.all.su.click()