API例子:用Java/JavaScript下载内容提取器

1,引言

本文讲解怎样用Java和JavaScript使用 GooSeeker API 接口下载内容提取器,这是一个示例程序。什么是内容提取器?为什么用这种方式?源自Python即时网络爬虫开源项目:通过生成内容提取器,大幅节省程序员时间。具体请参看《内容提取器的定义》

2, 用Java下载内容提取器

这是一系列实例程序中的一个,就目前编程语言发展来看,Java实现网页内容提取并不合适,除了语言不够灵活便捷以外,整个生态不够活跃,可选的类库增长缓慢。另外,要从JavaScript动态网页中提取内容,Java也很不方便,需要一个JavaScript引擎。用JavaScript下载内容提取器可以直接跳到第3部分的内容。

具体实现

注解:

  • 使用Java类库 jsoup(1.8.3以上版本),可以很便利、快速的获取网页dom。
  • 通过GooSeeker API 获取xslt(参考 1分钟快速生成用于网页内容提取的xslt
  • 使用Java自带的类TransformerFactory执行网页内容转换

源代码如下:

    public static void main(String[] args)
    {
        InputStream xslt = null;
        try
        {
            String grabUrl = "http://m.58.com/cs/qiuzu/22613961050143x.shtml"; // 抓取网址
            String resultPath = "F:/temp/xslt/result.xml"; // 抓取结果文件的存放路径
            // 通过GooSeeker API接口获得xslt
            xslt = getGsExtractor();
            // 抓取网页内容转换结果文件
            convertXml(grabUrl, xslt, resultPath);
        } catch (Exception e)
        {
            e.printStackTrace();
        } finally
        {
            try
            {
                if (xslt != null)
                    xslt.close();
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    /**
     * @description dom转换
     */
    public static void convertXml(String grabUrl, InputStream xslt, String resultPath) throws Exception
    {
        // 这里的doc对象指的是jsoup里的Document对象
        org.jsoup.nodes.Document doc = Jsoup.parse(new URL(grabUrl).openStream(), "UTF-8", grabUrl);
        W3CDom w3cDom = new W3CDom();
        // 这里的w3cDoc对象指的是w3c里的Document对象
        org.w3c.dom.Document w3cDoc = w3cDom.fromJsoup(doc);
        Source srcSource = new DOMSource(w3cDoc);
        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer(new StreamSource(xslt));
        transformer.transform(srcSource, new StreamResult(new FileOutputStream(resultPath)));
    }

    /**
     * @description 获取API返回结果
     */
    public static InputStream getGsExtractor()
    {
        // api接口
        String apiUrl = "http://www.gooseeker.com/api/getextractor";
        // 请求参数
        Map<String,Object> params = new HashMap<String, Object>();
        params.put("key", "xxx");  // Gooseeker会员中心申请的API KEY
        params.put("theme", "xxx");  // 提取器名,就是用MS谋数台定义的规则名
        params.put("middle", "xxx");  // 规则编号,如果相同规则名下定义了多个规则,需填写
        params.put("bname", "xxx"); // 整理箱名,如果规则含有多个整理箱,需填写
        String httpArg = urlparam(params);
        apiUrl = apiUrl + "?" + httpArg;
        InputStream is = null;
        try
        {
            URL url = new URL(apiUrl);
            HttpURLConnection urlCon = (HttpURLConnection) url.openConnection();
            urlCon.setRequestMethod("GET");
            is = urlCon.getInputStream();
        } catch (ProtocolException e)
        {
            e.printStackTrace();
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        return is;
    }

    /**
     * @description 请求参数
     */
    public static String urlparam(Map<String, Object> data)
    {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, Object> entry : data.entrySet())
        {
            try
            {
                sb.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue() + "", "UTF-8")).append("&");
            } catch (UnsupportedEncodingException e)
            {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }
    
[object Object]

3, 用JavaScript下载内容提取器

请注意,如果本例的JavaScript代码是在网页上运行的,因为跨域问题,是无法实现非本站网页内容爬取的。所以,要运行在具有特权的JavaScript引擎上,比如,浏览器扩展程序、自研的浏览器、自己的程序中含有JavaScript引擎等。

本例为了实验方便,仍然放在网页上运行,为了绕开跨域问题,是把目标网页存下来并进行修改,把JavaScript插入进去。这么多人工操作,仅仅是为了实验,正式使用的时候需要考虑别的手段。

具体实现

注解:

  • 引用 jQuery 类库 (jQuery-1.9.0 以上)
  • 为了解决跨域问题,把目标网页预先保存到硬盘上
  • 在目标网页中插入JavaScript代码
  • 使用GooSeeker API,把内容提取器下载下来,内容提取器是一个xslt程序,下例使用了jQuery的ajax方法从api获得xslt
  • 用xslt处理器作内容提取

下面是源代码:

// 目标网页网址为http://m.58.com/cs/qiuzu/22613961050143x.shtml,预先保存成本地html文件,并插入下述代码
$(document).ready(function(){
    $.ajax({
        type: "get", 
        url: "http://www.gooseeker.com/api/getextractor?key=申请的appKey&theme=规则主题名", 
        dataType: "xml", 
        success: function(xslt)
            {
            var result = convertXml(xslt, window.document);
            alert("result:" + result);
        } 
    });  
});

/* 用xslt将dom转换为xml对象 */
function convertXml(xslt, dom)
{
    // 定义XSLTProcessor对象
    var xsltProcessor = new XSLTProcessor();
    xsltProcessor.importStylesheet(xslt);
    // transformToDocument方式
    var result = xsltProcessor.transformToDocument(dom);
    return result;
}

返回结果截图如下

4,展望

同样可以用Python来获取指定网页内容,感觉Python的语法更加简洁,后续增加Python语言的示例,有兴趣的小伙伴可以加入一起研究。

5,相关文档

1, Python即时网络爬虫:API说明

6,集搜客GooSeeker开源代码下载源

1, GooSeeker开源Python网络爬虫GitHub源

7,文档修改历史

1,2016-06-27:V1.0

时间: 2024-10-11 00:41:05

API例子:用Java/JavaScript下载内容提取器的相关文章

Python即时网络爬虫项目: 内容提取器的定义(Python2.7版本)

1. 项目背景 在Python即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间太多了(见上图),从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作中. 这个项目推出以后受到很大关注,因为开放源码,大家可以在现成源码基础上进一步开发.然而,Python3和Python2是有区别的,<Python即时网络爬虫项目: 内容提取器的定义> 一文的源码无法在Python2.7下使用,本文将发布一个Python2.7的内容提取器. 2.

Python即时网络爬虫项目: 内容提取器的定义

1. 项目背景在python 即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间,从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作中. 2. 解决方案为了解决这个问题,我们把影响通用性和工作效率的提取器隔离出来,描述了如下的数据处理流程图: 图中"可插拔提取器"必须很强的模块化,那么关键的接口有: 标准化的输入:以标准的HTML DOM对象为输入 标准化的内容提取:使用标准的xslt模板提取网页内容 标准化的输出:以标

Arcgis API For Javascript下载与安装

本文以3.9版本为示例 1.最新API下载地址:http://support.esrichina-bj.cn/2011/0223/960.html 2.解压缩包:arcgis_js_v39_api.zip 3.复制解压出来的Library到C:\Inetpub\wwwroot\arcgis_js_api\library(arcgis_js_api文件夹若没有自己创建) 4.打开 C:\Inetpub\wwwroot\arcgis_js_api\library\3.9\3.9\init.js 替换

Java反射API研究(2)——java.lang.reflect详细内容与关系

对于最新的java1.8而言,reflect中接口的结构是这样的: java.lang.reflect.AnnotatedElement java.lang.reflect.AnnotatedType java.lang.reflect.AnnotatedArrayType java.lang.reflect.AnnotatedParameterizedType java.lang.reflect.AnnotatedTypeVariable java.lang.reflect.Annotated

如何用 JavaScript 下载文件

简介 我们知道,下载文件是一个非常常见的需求,但由于浏览器的安全策略的限制,我们通常只能通过一个额外的页面,访问某个文件的 url 来实现下载功能,但是这种用户体验非常不好.幸好,HTML 5 里面为 <a> 标签添加了一个 download 的属性,我们可以轻易的利用它来实现下载功能,再也不需要用以前的笨办法了. 原理 我们先看看 download 的使用方法: <a href="http://somehost/somefile.zip" download=&quo

基于七牛API开发的前端JavaScript SDK

这是我们工程实践的内容,由于时间原因,具体不赘述,啊~主要还是因为懒o(╯□╰)o工程实践的题目为openedx后端管理系统的功能拓展与优化,我们要优化的一个主要功能便是实现视频本地化上传,我们采用的视频云服务商为七牛云存储,以下链接是基于它的API开发的前端JavaScript SDK,http://developer.qiniu.com/docs/v6/sdk/javascript-sdk.html我的任务是看完,找到需要改的参数,刚刚大概看了一下,很多东西不是很明白,先把我觉得需要改的参数

Atitit.实现继承的原理and方法java javascript .net c# php ...

Atitit.实现继承的原理and方法java javascript .net c# php ... 1. 实现继承的问题 1 2. 如何拷贝基类方法?采用prototype原型方式,通过冒充对象 1 3. 2.属性如何继承? 2 4. 几种继承方式的比较    2 5. 常用的apply ,call方法 3 6. 参考 3 1. 实现继承的问题 JavaScript中要实现继承,其实就是实现三层含义: 1.子类的实例可以共享父类的方法: 2.子类可以覆盖父类的方法或者扩展新的方法: 3.子类和

Java大部分的内容

写在前面: 过去,我学习Java的时候,全部采取的是“短平快”的培训教材: 1.  它们会把重点列举出来 2.  在学校里老师不看基础,只看到你做了什么产品 现在工作了,觉得工作的内容并没有什么难度,多出来的时间,巩固基础. 正文: 先说一句话: 只会Java并不可耻   (即使你不仅仅只会Java) 1. <Java自学教程>  快速根据例子把Java大部分内容 遍历一遍. 2. <Java语言程序设计>(基础篇和进阶教程) 3.  辅助教材<疯狂Java精髓>  (

浅谈 c++/java/javascript 之传参

本文主要梳理了几种语言的传参机制,即关于 传值.传引用 之争 最近开始学node.js搭后端服务器时,碰到这样一句话 java只有一种传参机制就是传值 javascript其大部分语法规范取自于JAVA语法规范, 那么这种句话也适用于它,于是也有  javascript只有一种传参机制就是传值 为了理解这句话,我从个人感觉较为接近底层的语言c++写一些测试,代码如下 #include<iostream> using namespace std; class Test { public: int