2013-01-19 38 views
1

我正在尝试使用crawler4j下载一些网站。我唯一的问题是,即使我对shouldVisit函数中的所有.js文件返回true,它们也不会被下载。使用crawler4j下载js文件

@Override 
public boolean shouldVisit(WebURL url) { 
    return true; 
} 

@Override 
public void visit(Page page) { 
    String url = page.getWebURL().getURL(); 
    System.out.println("URL: " + url); 
} 

.js文件的URL永远不会打印出来。

回答

1

我注意到“<脚本>”标记不会被crawler4j处理。这是所有“.js”文件发生的地方。所以我不认为这个问题仅限于“.js”文件 - 我认为它是“<脚本>”标签(通常恰好是“.js”文件)中的任何内容。

它最初看起来像修改HtmlContentHandler的Enumeration和startElement()方法将解决问题。我试过了,但没有奏效。在调试它的时候,我观察到Tika Parser或TagSoup(Tika使用的)不是拾取脚本标签。因此它甚至从未到达crawler4j进行处理。

作为解决方法,我使用JSoup在我的visit()方法中解析所有“<脚本>”标记的HTML,然后我安排对这些文件进行爬网。

我认为真正的解决方案是确定为什么Tika(或TagSoup)没有拿起脚本标签。这可能是它被crawler4j调用的方式。一旦解决了,那么修改HtmlContentHandler将会起作用。

+0

@JulienS发布答案时,我使用完全相同的方法来提取.js文件。 (使用JSoup)。不过,我认为也许修改源代码会有所帮助。我可以分享代码,但它太简单了。 –

1

看一看源代码,原因可以在HTMLContentHandler class找到。

该课程负责从下载的网页中提取链接。 脚本标签从不处理。

如果你想下载.js文件,我建议你克隆项目,扩展这个类,这很简单。您还需要修改调用HTMLContentHandler的WebCrawler。

+0

谢谢。我只是想知道为什么它不在源代码中! –

+1

好问题,这是一个重要的隐藏实现决定。我认为这对开发者应该是可选的。 – Julien