4

リンクをクリックしたときに __doPostBack 関数を使用する ASP ページからデータを取得しようとしています。HTMLUnit でリンクをクリックすると、開始したページが返されます。ポストバックを完了して次のページに戻るにはどうすればよいですか?

コード:

import java.util.List;

import com.gargoylesoftware.htmlunit.ScriptResult;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class ScrapperApp {

    private static void go() throws Exception {
        /* turn off annoying htmlunit warnings */
        java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);

        HtmlPage nextPage;
        ScriptResult onClick; 

        String url = "http://media.ethics.ga.gov/search/Campaign/Campaign_Name.aspx?NameID=5751&FilerID=C2009000085&Type=candidate";

        final WebClient webclient = new WebClient(BrowserVersion.CHROME_16);
        final HtmlPage page = webclient.getPage(url);

        System.out.println("PULLING LINKS:");

        List<HtmlAnchor> articles = (List<HtmlAnchor>) page.getByXPath("//table[@id='ctl00_ContentPlaceHolder1_Name_Reports1_TabContainer1_TabPanel1_dgReports']/tbody/tr/td/a[@class='lblentrylink']");

        for(int x=0; x<articles.size(); x++) {
            System.out.println("Clicking "+x+": "+articles.get(x).asText()); 
            nextPage = articles.get(x).click();
            System.out.println(nextPage.getUrl());
        }
    }

    public static void main(String[] args) throws Exception {
        go();
        System.out.println("COMPLETE");
    }

}

出力:

PULLING LINKS:
Clicking 0: 
http://media.ethics.ga.gov/search/Campaign/Campaign_Name.aspx?NameID=5751&FilerID=C2009000085&Type=candidate
Clicking 1: 
http://media.ethics.ga.gov/search/Campaign/Campaign_Name.aspx?NameID=5751&FilerID=C2009000085&Type=candidate
...
4

1 に答える 1

5

ブラウザの新しいウィンドウで強制的に開くことができないのと同じように、これらのリンクをループすることはできません。

クリックするたびに「url」ページに戻る必要があります。

さらに、htmlunit を適切に機能させるには、いくつかの調整が必要です。これが私の作業コードです。

    webClient = new WebClient(BrowserVersion.FIREFOX_24);
    webClient.getOptions().setTimeout(120000);
    webClient.waitForBackgroundJavaScript(60000);
    webClient.getOptions().setRedirectEnabled(true);
    webClient.getOptions().setJavaScriptEnabled(true);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setCssEnabled(false);
    webClient.getOptions().setUseInsecureSSL(true);
    webClient.setAjaxController(new NicelyResynchronizingAjaxController());

    String url = "http://media.ethics.ga.gov/search/Campaign/Campaign_Name.aspx?NameID=5751&FilerID=C2009000085&Type=candidate";

    HtmlPage rootPage = webClient.getPage(url);

    List<String> texts = new ArrayList<String>();
    for (HtmlAnchor a : (List<HtmlAnchor>) rootPage.getByXPath("//table[@id='ctl00_ContentPlaceHolder1_Name_Reports1_TabContainer1_TabPanel1_dgReports']/tbody/tr/td/a[@class='lblentrylink']")) {
        rootPage = webClient.getPage(url);
        HtmlPage page = a.click();
        String text = page.asText();

        if (!texts.contains(text)) {
            System.out.println(page.getUrl());
            texts.add(text);
        } else {
            System.out.println("already seen");
        }
    }
    for (String s : texts) {
        System.out.println(s);
    }
于 2014-07-15T11:15:36.397 に答える