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

Ama*_*mar 11 java web-crawler crawler4j

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

在此输入图像描述

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

我使用以下代码来抓取内容.

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);
}
}
Run Code Online (Sandbox Code Playgroud)

我能够抓取上述链接/网站中的内容.但它没有我在红色框中标记的信息.我认为那些是动态链接.

  • 我的问题是如何从上述链接/网站抓取内容...... ???
  • 如何从基于Ajax/JavaScript的网站抓取内容...... ???

请有人帮我这个.

感谢和问候,Amar

Ama*_*mar 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();
}
Run Code Online (Sandbox Code Playgroud)

这里的" htmlContent "是必需的.如果您遇到任何问题,请告诉我...... ???

谢谢,阿玛尔


Erw*_*win 5

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

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

如果您有各种具有动态内容(JavaScript/ajax)的网站,则应考虑使用支持动态内容的爬网程序,如Crawljax(也使用Java编写).