1,引言
本文讲解怎样用Java使用 GooSeeker API 接口下载内容提取器,这是一个示例程序。什么是内容提取器?为什么用这种方式?源自GooSeeker的Python开源项目:通过生成内容提取器,大幅节省程序员时间。具体请参看《内容提取器的定义》。
这是一系列实例程序中的一个,就目前编程语言发展来看,Java实现网页内容提取并不合适,除了语言不够灵活便捷以外,整个生态不够活跃,可选的类库增长缓慢。另外,要从JavaScript动态网页中提取内容,Java也很不方便,需要一个JavaScript引擎。其它更合适的编程语言示例是:
2,具体实现
注解:
- 使用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();
- }
复制代码 返回结果如下:
3,展望
同样可以用python来获取指定网页内容,感觉python的语法更加简洁,后续增加python语言的示例,有兴趣的小伙伴可以加入一起研究。
4,相关文档
1, GooSeeker API说明(1)--下载内容提取器
2, GooSeeker API例子——用JavaScript下载内容提取器
5,集搜客GooSeeker开源代码下载源
1, GooSeeker开源Python网络爬虫GitHub源
6,文档修改历史
1,2016-06-07:V1.0
2,2016-06-10:V2.0,将JavaScript代码分出去另起一篇
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|
|
|
|
共 0 个关于本帖的回复 最后回复于 2016-6-7 18:49