资讯专栏INFORMATION COLUMN

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

JackJiang / 1144人阅读

摘要:,引言本文讲解怎样用和使用接口下载内容提取器,这是一个示例程序。具体请参看内容提取器的定义。用下载内容提取器可以直接跳到第部分的内容。

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 params = new HashMap();
    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 data)
{
    StringBuilder sb = new StringBuilder();
    for (Map.Entry 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();
}

返回结果如下:

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-24:V1.0

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38033.html

相关文章

  • API例子Python驱动Firefox采集网页数据

    摘要:开源即时网络爬虫项目将与基于的异步网络框架集成,所以本例将使用采集淘宝这种含有大量代码的网页数据,但是要注意本例一个严重缺陷用加载网页的过程发生在中,破坏了的架构原则。 showImg(https://segmentfault.com/img/bVyzAX); 1,引言 本文讲解怎样用Python驱动Firefox浏览器写一个简易的网页数据采集器。开源Python即时网络爬虫项目将与S...

    Harriet666 评论0 收藏0
  • 快速制作规则及获取规则提取API

    摘要:也就是用可视化的集搜客爬虫软件针对亚马逊图书商品页做一个采集规则,并结合规则提取器抓取网页内容。安装集搜客爬虫软件前期准备进入集搜客官网产品页面,下载对应版本。 showImg(https://segmentfault.com/img/bVEFvL?w=300&h=300); 1. 引言 前面文章的测试案例都用到了集搜客Gooseeker提供的规则提取器,在网页抓取工作中,调试正则表达...

    itvincent 评论0 收藏0
  • Python即时网络爬虫:API说明

    摘要:用于数据分析和数据挖掘的网络爬虫程序中,内容提取器是影响通用性的关键障碍,如果这个提取器是从获得的,您的网络爬虫程序就能写成通用的框架。,相关文档,即时网络爬虫项目内容提取器的定义,集搜客开源代码下载源,开源网络爬虫源,文档修改历史, showImg(https://segmentfault.com/img/bVynLk); API说明——下载gsExtractor内容提取器 1,接口...

    genefy 评论0 收藏0
  • 让Scrapy的Spider更通

    摘要:而分配任务的是会员中心的爬虫罗盘,实现集中管理分布执行。开源即时网络爬虫项目同样也要尽量实现通用化。网址和提取规则本来应该硬编码到中的,现在隔离出来,由会员中心进行管理,那么就很容易做通用了。 showImg(https://segmentfault.com/img/bVyEnS); 1,引言 《Scrapy的架构初探》一文所讲的Spider是整个架构中最定制化的一个部件,Spider...

    MartinDai 评论0 收藏0
  • Python即时网络爬虫项目: 内容提取的定义(Python2.7版本)

    摘要:然而,和是有区别的,即时网络爬虫项目内容提取器的定义一文的源码无法在下使用,本文将发布一个的内容提取器。 1. 项目背景 showImg(https://segmentfault.com/img/bVz5hX); 在Python即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间太多了(见上图),从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投...

    xuxueli 评论0 收藏0

发表评论

0条评论

JackJiang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<