使用java进行Web爬行(支持Ajax / JavaScript的页面)

时间:2014-06-23 11:49:45

标签: java web-crawler crawler4j

我对此网络抓取非常新。我正在使用 crawler4j 来抓取网站。我通过抓取这些网站收集所需的信息。我的问题是我无法抓取以下网站的内容。的 http://www.sciencedirect.com/science/article/pii/S1568494612005741 即可。我想从上述网站抓取以下信息(请查看附带的屏幕截图)。

enter image description here

如果您观察到附加的屏幕截图,则它有三个名称(在红色框中突出显示)。如果单击其中一个链接,您将看到一个弹出窗口,该弹出窗口包含有关该作者的全部信息。我想抓取弹出窗口中的信息。

我使用以下代码抓取内容。

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的网站抓取内容...... ???

请允许任何人帮助我。

谢谢&问候, 阿玛尔

3 个答案:

答案 0 :(得分:7)

您好我找到了另一个库的解决方法。我用了 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 ”是必需的。如果您遇到任何问题,请告诉我...... ???

谢谢, 阿玛尔

答案 1 :(得分:5)

简单地说,Crawler4j是静态爬虫。这意味着它无法解析页面上的JavaScript。因此,无法通过抓取您提到的特定页面来获取所需内容。当然,有一些解决方法可以使它工作。

如果您只想抓取此页面,则可以使用连接调试程序。查看this question了解一些工具。找出AJAX请求调用的页面,并抓取该页面。

如果您有各种具有动态内容(JavaScript / ajax)的网站,您应该考虑使用支持动态内容的抓取工具,例如Crawljax(也是用Java编写的)。

答案 2 :(得分: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());