摘要:,引言本文講解怎樣用和使用接口下載內(nèi)容提取器,這是一個示例程序。具體請參看內(nèi)容提取器的定義。用下載內(nèi)容提取器可以直接跳到第部分的內(nèi)容。
1,引言
本文講解怎樣用Java和JavaScript使用 GooSeeker API 接口下載內(nèi)容提取器,這是一個示例程序。什么是內(nèi)容提取器?為什么用這種方式?源自Python即時網(wǎng)絡(luò)爬蟲開源項目:通過生成內(nèi)容提取器,大幅節(jié)省程序員時間。具體請參看《內(nèi)容提取器的定義》。
2, 用Java下載內(nèi)容提取器這是一系列實例程序中的一個,就目前編程語言發(fā)展來看,Java實現(xiàn)網(wǎng)頁內(nèi)容提取并不合適,除了語言不夠靈活便捷以外,整個生態(tài)不夠活躍,可選的類庫增長緩慢。另外,要從JavaScript動態(tài)網(wǎng)頁中提取內(nèi)容,Java也很不方便,需要一個JavaScript引擎。用JavaScript下載內(nèi)容提取器可以直接跳到第3部分的內(nèi)容。
具體實現(xiàn)
注解:
使用Java類庫 jsoup(1.8.3以上版本),可以很便利、快速的獲取網(wǎng)頁dom。
通過GooSeeker API 獲取xslt(參考 1分鐘快速生成用于網(wǎng)頁內(nèi)容提取的xslt)
使用Java自帶的類TransformerFactory執(zhí)行網(wǎng)頁內(nèi)容轉(zhuǎn)換
源代碼如下:
public static void main(String[] args) { InputStream xslt = null; try { String grabUrl = "http://m.58.com/cs/qiuzu/22613961050143x.shtml"; // 抓取網(wǎng)址 String resultPath = "F:/temp/xslt/result.xml"; // 抓取結(jié)果文件的存放路徑 // 通過GooSeeker API接口獲得xslt xslt = getGsExtractor(); // 抓取網(wǎng)頁內(nèi)容轉(zhuǎn)換結(jié)果文件 convertXml(grabUrl, xslt, resultPath); } catch (Exception e) { e.printStackTrace(); } finally { try { if (xslt != null) xslt.close(); } catch (IOException e) { e.printStackTrace(); } } } `/**` `* @description dom轉(zhuǎn)換` `*/` 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返回結(jié)果` `*/` public static InputStream getGsExtractor() { // api接口 String apiUrl = "http://www.gooseeker.com/api/getextractor"; // 請求參數(shù) Mapparams = new HashMap (); params.put("key", "xxx"); // Gooseeker會員中心申請的API KEY params.put("theme", "xxx"); // 提取器名,就是用MS謀數(shù)臺定義的規(guī)則名 params.put("middle", "xxx"); // 規(guī)則編號,如果相同規(guī)則名下定義了多個規(guī)則,需填寫 params.put("bname", "xxx"); // 整理箱名,如果規(guī)則含有多個整理箱,需填寫 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 請求參數(shù)` `*/` 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(); }
返回結(jié)果如下:
請注意,如果本例的JavaScript代碼是在網(wǎng)頁上運行的,因為跨域問題,是無法實現(xiàn)非本站網(wǎng)頁內(nèi)容爬取的。所以,要運行在具有特權(quán)的JavaScript引擎上,比如,瀏覽器擴展程序、自研的瀏覽器、自己的程序中含有JavaScript引擎等。
本例為了實驗方便,仍然放在網(wǎng)頁上運行,為了繞開跨域問題,是把目標(biāo)網(wǎng)頁存下來并進行修改,把JavaScript插入進去。這么多人工操作,僅僅是為了實驗,正式使用的時候需要考慮別的手段。
具體實現(xiàn)
注解:
引用 jQuery 類庫 (jQuery-1.9.0 以上)
為了解決跨域問題,把目標(biāo)網(wǎng)頁預(yù)先保存到硬盤上
在目標(biāo)網(wǎng)頁中插入JavaScript代碼
使用GooSeeker API,把內(nèi)容提取器下載下來,內(nèi)容提取器是一個xslt程序,下例使用了jQuery的ajax方法從api獲得xslt
用xslt處理器作內(nèi)容提取
下面是源代碼:
// 目標(biāo)網(wǎng)頁網(wǎng)址為http://m.58.com/cs/qiuzu/22613961050143x.shtml,預(yù)先保存成本地html文件,并插入下述代碼 $(document).ready(function(){ $.ajax({ type: "get", url: "http://www.gooseeker.com/api/getextractor?key=申請的appKey&theme=規(guī)則主題名", dataType: "xml", success: function(xslt) { var result = convertXml(xslt, window.document); alert("result:" + result); } }); }); /* 用xslt將dom轉(zhuǎn)換為xml對象 */ function convertXml(xslt, dom) { // 定義XSLTProcessor對象 var xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xslt); // transformToDocument方式 var result = xsltProcessor.transformToDocument(dom); return result; }
返回結(jié)果截圖如下
同樣可以用Python來獲取指定網(wǎng)頁內(nèi)容,感覺Python的語法更加簡潔,后續(xù)增加Python語言的示例,有興趣的小伙伴可以加入一起研究。
5,相關(guān)文檔1, Python即時網(wǎng)絡(luò)爬蟲:API說明
6,集搜客GooSeeker開源代碼下載源1, GooSeeker開源Python網(wǎng)絡(luò)爬蟲GitHub源
7,文檔修改歷史1,2016-06-24:V1.0
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/38033.html
摘要:開源即時網(wǎng)絡(luò)爬蟲項目將與基于的異步網(wǎng)絡(luò)框架集成,所以本例將使用采集淘寶這種含有大量代碼的網(wǎng)頁數(shù)據(jù),但是要注意本例一個嚴重缺陷用加載網(wǎng)頁的過程發(fā)生在中,破壞了的架構(gòu)原則。 showImg(https://segmentfault.com/img/bVyzAX); 1,引言 本文講解怎樣用Python驅(qū)動Firefox瀏覽器寫一個簡易的網(wǎng)頁數(shù)據(jù)采集器。開源Python即時網(wǎng)絡(luò)爬蟲項目將與S...
摘要:也就是用可視化的集搜客爬蟲軟件針對亞馬遜圖書商品頁做一個采集規(guī)則,并結(jié)合規(guī)則提取器抓取網(wǎng)頁內(nèi)容。安裝集搜客爬蟲軟件前期準(zhǔn)備進入集搜客官網(wǎng)產(chǎn)品頁面,下載對應(yīng)版本。 showImg(https://segmentfault.com/img/bVEFvL?w=300&h=300); 1. 引言 前面文章的測試案例都用到了集搜客Gooseeker提供的規(guī)則提取器,在網(wǎng)頁抓取工作中,調(diào)試正則表達...
摘要:用于數(shù)據(jù)分析和數(shù)據(jù)挖掘的網(wǎng)絡(luò)爬蟲程序中,內(nèi)容提取器是影響通用性的關(guān)鍵障礙,如果這個提取器是從獲得的,您的網(wǎng)絡(luò)爬蟲程序就能寫成通用的框架。,相關(guān)文檔,即時網(wǎng)絡(luò)爬蟲項目內(nèi)容提取器的定義,集搜客開源代碼下載源,開源網(wǎng)絡(luò)爬蟲源,文檔修改歷史, showImg(https://segmentfault.com/img/bVynLk); API說明——下載gsExtractor內(nèi)容提取器 1,接口...
摘要:而分配任務(wù)的是會員中心的爬蟲羅盤,實現(xiàn)集中管理分布執(zhí)行。開源即時網(wǎng)絡(luò)爬蟲項目同樣也要盡量實現(xiàn)通用化。網(wǎng)址和提取規(guī)則本來應(yīng)該硬編碼到中的,現(xiàn)在隔離出來,由會員中心進行管理,那么就很容易做通用了。 showImg(https://segmentfault.com/img/bVyEnS); 1,引言 《Scrapy的架構(gòu)初探》一文所講的Spider是整個架構(gòu)中最定制化的一個部件,Spider...
摘要:然而,和是有區(qū)別的,即時網(wǎng)絡(luò)爬蟲項目內(nèi)容提取器的定義一文的源碼無法在下使用,本文將發(fā)布一個的內(nèi)容提取器。 1. 項目背景 showImg(https://segmentfault.com/img/bVz5hX); 在Python即時網(wǎng)絡(luò)爬蟲項目啟動說明中我們討論一個數(shù)字:程序員浪費在調(diào)測內(nèi)容提取規(guī)則上的時間太多了(見上圖),從而我們發(fā)起了這個項目,把程序員從繁瑣的調(diào)測規(guī)則中解放出來,投...
閱讀 2120·2021-11-23 10:06
閱讀 3482·2021-11-11 16:54
閱讀 3348·2019-08-29 17:31
閱讀 3573·2019-08-29 17:05
閱讀 2173·2019-08-26 13:36
閱讀 2165·2019-08-26 12:17
閱讀 530·2019-08-26 12:12
閱讀 1678·2019-08-26 10:19