java抓取js,API例子:用Java/JavaScript下载内容提取器

bVyszb

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();

}

返回结果如下:

bVysAk

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;

}

返回结果截图如下

bVysAD

4,展望

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

5,相关文档

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

7,文档修改历史

1,2016-06-24:V1.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值