web-dev-qa-db-ja.com

java)を使用したWebクロール(Ajax / JavaScript対応ページ)

私はこのWebクロールに非常に慣れていません。 crawler4jを使用してWebサイトをクロールしています。これらのサイトをクロールして必要な情報を収集しています。ここでの私の問題は、次のサイトのコンテンツをクロールできなかったことです。 http://www.sciencedirect.com/science/article/pii/S1568494612005741。上記のサイトから以下の情報をクロールしたい(添付のスクリーンショットをご覧ください)。

enter image description here

添付のスクリーンショットを見ると、3つの名前があります(赤いボックスで強調表示されています)。リンクの1つをクリックすると、ポップアップが表示され、そのポップアップにはその作成者に関するすべての情報が含まれます。そのポップアップにある情報をクロールしたい。

次のコードを使用してコンテンツをクロールしています。

public class WebContentDownloader {

private Parser parser;
private PageFetcher pageFetcher;

public WebContentDownloader() {
    CrawlConfig config = new CrawlConfig();
    parser = new Parser(config);
    pageFetcher = new PageFetcher(config);
}

private Page download(String url) {
    WebURL curURL = new WebURL();
    curURL.setURL(url);
    PageFetchResult fetchResult = null;
    try {
        fetchResult = pageFetcher.fetchHeader(curURL);
        if (fetchResult.getStatusCode() == HttpStatus.SC_OK) {
            try {
                Page page = new Page(curURL);
                fetchResult.fetchContent(page);
                if (parser.parse(page, curURL.getURL())) {
                    return page;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    } finally {
        if (fetchResult != null) {
            fetchResult.discardContentIfNotConsumed();
        }
    }
    return null;
}

private String processUrl(String url) {
    System.out.println("Processing: " + url);
    Page page = download(url);
    if (page != null) {
        ParseData parseData = page.getParseData();
        if (parseData != null) {
            if (parseData instanceof HtmlParseData) {
                HtmlParseData htmlParseData = (HtmlParseData) parseData;
                return htmlParseData.getHtml();
            }
        } else {
            System.out.println("Couldn't parse the content of the page.");
        }
    } else {
        System.out.println("Couldn't fetch the content of the page.");
    }
    return null;
}

public String getHtmlContent(String argUrl) {
    return this.processUrl(argUrl);
}
}

前述のリンク/サイトからコンテンツをクロールすることができました。しかし、赤いボックスにマークした情報はありません。それらは動的なリンクだと思います。

  • 私の質問は、前述のリンク/ウェブサイトからコンテンツをクロールするにはどうすればよいですか... ???
  • Ajax/JavaScriptベースのWebサイトからコンテンツをクロールする方法... ???

誰かがこれについて私を助けてくれますか?.

ありがとう&よろしく、アマール

11
Amar

こんにちは私は別のライブラリで回避策を見つけました。 Selinium WebDriver(org.openqa.Selenium.WebDriver)ライブラリを使用して動的コンテンツを抽出しました。これがサンプルコードです。

public class CollectUrls {

private WebDriver driver;

public CollectUrls() {
    this.driver = new FirefoxDriver();
    this.driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

protected void next(String url, List<String> argUrlsList) {
    this.driver.get(url);
    String htmlContent = this.driver.getPageSource();
}

ここでは、「htmlContent "」が必須です。問題が発生した場合はお知らせください... ???

ありがとう、アマール

7
Amar

簡単に言うと、Crawler4jは静的クローラーです。これは、ページ上のJavaScriptを解析できないことを意味します。したがって、あなたが言及した特定のページをクロールして、必要なコンテンツを取得する方法はありません。もちろん、それを機能させるためのいくつかの回避策があります。

クロールするのがこのページだけの場合は、接続デバッガーを使用できます。いくつかのツールについては この質問 をチェックしてください。 AJAXリクエストが呼び出すページを見つけて、そのページをクロールします。

動的コンテンツ(JavaScript/ajax)を持つさまざまなWebサイトがある場合は、 Crawljax (これもJavaで記述されています)のような動的コンテンツ対応のクローラーの使用を検討する必要があります。

5
Erwin
I have find out the Solution of Dynamic Web page Crawling using Aperture and Selenium.Web Driver.
Aperture is Crawling Tools and Selenium is Testing Tools which can able to rendering Inspect Element. 

1. Extract the Aperture- core Jar file by Decompiler Tools and Create a Simple Web Crawling Java program. (https://svn.code.sf.net/p/aperture/code/aperture/trunk/)
2. Download Selenium. WebDriver Jar Files and Added to Your Program.
3. Go to CreatedDataObjec() method in org.semanticdesktop.aperture.accessor.http.HttpAccessor.(Aperture Decompiler).
Added Below Coding 

   WebDriver driver = new FirefoxDriver();
   String baseurl=uri.toString();
   driver.get(uri.toString());
   String str = driver.getPageSource();
        driver.close();
 stream= new ByteArrayInputStream(str.getBytes());
1
BasK