2

我正在尝试在 Groovy 中制作一个网络爬虫。我正在寻找从网页中提取资源类型。我需要检查特定网页是否具有以下资源类型:

PDF 文件

JMP 文件

SWF 文件

压缩文件

MP3 文件

图片

电影文件

JSL 文件

我正在使用 crawler4j 进行爬行,使用 JSoup 进行解析。一般来说,我想知道任何方法来获取我将来可能需要的任何资源类型。我在我的 BasicCrawler.groovy 中尝试了以下内容。它只是告诉页面的内容类型,即 text/html 或 text/xml。我需要获取该页面上所有类型的资源。请纠正我哪里出错了:

@Override
void visit(Page page) {
    println "inside visit"
    int docid = page.getWebURL().getDocid()
    url =  page.getWebURL().getURL()
    String domain = page.getWebURL().getDomain()
    String path = page.getWebURL().getPath()
    String subDomain = page.getWebURL().getSubDomain()
    parentUrl = page.getWebURL().getParentUrl()
    String anchor = page.getWebURL().getAnchor()
    println("Docid: ${docid} ")
    println("URL: ${url}  ")
    Document doc = Jsoup.connect(url).get();
    Elements nextLinks = doc.body().select("[href]");
    for( Element link : nextLinks ) {
        String contentType = new URL(link.attr("href")).openConnection().getContentType();
        println url + "***" + contentType
    }
    if (page.getParseData() instanceof HtmlParseData) {
        HtmlParseData htmlParseData = (HtmlParseData) page.getParseData()
        String text = htmlParseData.getText()
        String html = htmlParseData.getHtml()
        List<WebURL> links = htmlParseData.getOutgoingUrls()

    }
    println("FINISHED CRAWLING")
    def crawlObj = new Resource(url : url)
    if (!crawlObj.save(flush: true, failOnError: true)) {
        crawlObj.errors.each { println it }
    }
}

打印两个 doc id 后,它会抛出错误:ERROR crawler.WebCrawler - Exception while running the visit method. Message: 'unknown protocol: tel' at java.net.URL.<init>(URL.java:592)

4

2 回答 2

3

您可以检查 Document 中的所有 URL 并向服务器询问内容类型。这是一个快速+肮脏的例子:

Document doc = Jsoup.connect("http://yourpage").get();
Elements elements = doc.body().select("[href]");
for (Element element : elements) {
    String contentType = new URL(element.attr("href")).openConnection().getContentType();
}

对于图像、嵌入元素等,您应该搜索src属性。

于 2014-06-24T09:51:21.147 回答
2

Apache Tika 涵盖了很多这些格式

http://tika.apache.org

Apache Tika™ 工具包使用现有解析器库从各种文档中检测和提取元数据和结构化文本内容。

而那些没有的,你应该能够写一个识别器

于 2014-06-23T19:49:04.203 回答