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