9

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

ここに画像の説明を入力

添付のスクリーンショットを見ると、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 サイトからコンテンツをクロールする方法...???

誰でもこれについて私を助けてください。

よろしくお願いします、 アマール

4

3 に答える 3

6

こんにちは、別のライブラリで回避策を見つけました。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」が必須です。問題が発生した場合はお知らせください...???

ありがとう、アマール

于 2014-12-03T10:00:42.740 に答える
5

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

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

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

于 2014-06-24T10:17:51.483 に答える
1
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());
于 2015-02-19T12:51:16.880 に答える