999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Web在線爬蟲的設計與實現

2018-10-19 03:55:48韓前進
軟件 2018年9期
關鍵詞:頁面程序數據庫

韓前進

?

Web在線爬蟲的設計與實現

韓前進

(石河子大學 信息科學與技術學院,新疆 石河子 832000)

為了方便用戶簡單高效的獲取互聯網數據,提出一種結合Web技術與爬蟲技術的在線輕量級網絡爬蟲。該爬蟲可在Web頁面上進行配置,用戶提交配置到遠程服務器,服務器端爬蟲程序進行數據抓取分析,最后由Web應用將結果返回到頁面進行預覽,同時支持生成數據結果接口URL,方便用戶調用服務器上爬蟲程序爬到的數據。

網絡爬蟲;搜索引擎;Web技術

0 引言

隨著信息社會的飛速發展,互聯網已經達到了一個空前的規模。網絡爬蟲作為分析互聯網有效數據的得力工具,同樣也在不停發展。

以往用戶想要采集獲得互聯網數據,要么尋找開源的爬蟲,要么自己寫爬蟲,再或者花錢請專業公司進行數據采集。無論是選擇尋找開源的爬蟲還是自己寫爬蟲程序,都需要進行安裝軟件,配置環境,安裝依賴,學習使用等一系列步驟,對有基礎的用戶來說,這沒什么大不了,但對于沒有基礎的用戶來說,這無疑是一道坎。選擇自己寫爬蟲程序時,還需要耗費大量時間與精力去編寫代碼與調試代碼。花錢請專門的公司進行數據采集,除了增加開銷之外,還可能面臨數據時效性低的問題。

Web在線爬蟲以期方便用戶簡單高效獲得互聯網數據。它結合了Web技術與爬蟲技術。用戶只需要安裝一個瀏覽器,在配置頁提交相關數據,即可調用服務器上的爬蟲程序。用戶通過Web應用提供的配置面板,將必要配置提交到服務器,服務器爬蟲程序根據配置進行數據請求處理,最后將結果返回。用戶在登錄的情況下可根據數據抓取結果選擇生成數據接口URL,用戶在自己的程序中請求數據接口URL得到數據,將獲得的數據構造到自己的應用場景中。

本文將對Web在線爬蟲實現的實現原理、抓取策略、工作流程等進行分析介紹。

1 Web在線爬蟲原理

1.1 Web在線爬蟲實現原理簡述

動態網站中相似網頁的網頁結構都是有規律的。以京東為例,京東網站的每個產品詳情頁中,分析頁面結構,可以看到產品名稱的類名為sku- name。那么,如果想獲得該產品的相關數據,用戶只需給出目標網址,目標網頁中數據所在的標簽,使用標簽選擇器與屬性選擇器就可以得到該類名標簽中的數據。根據這個特點,可以設計讓用戶自行觀察網頁結構,提供標簽選擇器與屬性選擇器,指定目標網頁URL即可讓爬蟲抓取數據。

Web在線爬蟲主要分為Web應用與爬蟲程序兩大模塊。

Web應用是用戶與爬蟲程序之間“聯絡人”,負責中轉用戶調用爬蟲的請求與返回爬蟲處理后的數據結果。

爬蟲基于Node.js平臺[1],使用Superagent請求初始頁面URL,獲得整個網頁,使用Cheerio根據用戶配置中的標簽選擇器與屬性選擇器分析頁面,得到目標數據。

為了滿足用戶調用爬蟲爬到的數據的需求,Web在線爬蟲支持生成數據接口,這是一個返回爬蟲爬取數據的URL。Web應用負責與數據庫交互,數據庫保存用戶的爬蟲配置。生成數據接口時,將爬蟲配置寫入數據庫,請求數據接口時,從數據庫獲得配置,將配置設置到爬蟲中進行爬取數據。為了提高響應速度,可以將爬蟲爬取結果保存到數據庫中,設置定時任務,定時調用爬蟲程序爬取數據,更新數據庫。當用戶請求數據接口,直接從數據庫取出數據進行響應。

1.2 Web在線爬蟲的結構

Web在線爬蟲運行結構如圖1所示。它分為用戶、Web應用、爬蟲程序與互聯網四大模塊。用戶發起調用爬蟲請求,Web應用接受請求并調用爬蟲程序,爬蟲向互聯網發起請求,處理分析得到的數據之后,將結果遞交Web應用,Web應用將結果反饋給用戶。

圖1 Web在線爬蟲運行結構

1.3 爬蟲程序爬取過程

爬蟲程序獲得目標數據的過程如圖2所示。從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁的過程中,不斷從當前頁面上抽取新的URL放入隊列,直到滿足停止條件。

圖2 爬蟲獲得目標數據的過程

1.4 爬蟲程序獲得中間URL

爬蟲獲得中間URL過程如圖3所示,用戶需要提供初始頁面到目標頁面的每一級a標簽位置,以使得爬蟲程序順利找到目標頁面。在目標頁面,用戶需要提供標簽選擇器與屬性選擇器以使得爬蟲獲得目標數據。

2 爬蟲抓取策略

遍歷策略[2]是爬蟲的核心問題。在爬蟲系統中,待抓取URL隊列是很重要的一部分。待抓取URL隊列中的URL以什么樣的順序排列也是一個很重要的問題,因為這涉及到先抓取哪個頁面,后抓取哪個頁面。決定這些URL排列順序的方法,叫做抓取策略。

爬蟲策略主要有以下幾種:

(1)深度優先遍歷策略:

深度優先遍歷測試是指網絡爬蟲會從起始頁開始,一個鏈接一個鏈接跟蹤下去,處理完這條線路的鏈接之后,在再轉入下一個起始頁,繼續跟蹤鏈接。

圖3 爬蟲獲取中間URL的過程

深度優先策略不一定能適用于所有情況,深度優先如果誤入無窮分枝(深度無限),則不可能找到目標節點

(2)廣度優先策略

廣度優先策略是按照樹的層次進行搜索,如果此層沒有搜索完成,不會進入下一層搜索。即,首先完成一個層次的搜索,其次在進行下一層次,也稱之為分層處理。

廣度優先遍歷策略屬于盲目搜索,它并不考慮結果存在的可能位置,會徹底地搜索整張圖,因而效率較低,但是,如果盡可能的覆蓋較多的網頁,廣度優先搜索方法是較好的選擇。

(3)部分的PageRank的策略

對于已經下載的網頁,連同待抓取URL隊列的URL,形成網頁集合,計算每個頁面的PageRank值,計算完之后,將待抓取隊列中的URL按照網頁級別的值的大小排列,并按照順序依次抓取網址頁面。

(4)OPIC(在線頁面重要性計算)策略:

在算法開始前,給所有頁面一個相同的初始現金,當下載了某個頁面P之后,將P的現金分攤給所有從P中分析出的鏈接,并且將P的現金清空。對于待抓取URL隊列中的所有頁面按照現金數進行排序。

OPIC與PageRank的區別在于:PageRank的的的每次需要迭代計算,而OPIC策略不需要迭代過程所以計算速度遠遠快與PageRank的的的,適合實時計算使用。

Web在線爬蟲系統采用廣度優先搜索算法,用戶在提供的配置面板中配置從初始頁面到目標頁面搜索路徑,有效避免了廣度優先搜索的盲目搜索問題。

廣度優先搜索是一種簡單直觀且歷史悠久的遍歷方法。Web在線爬蟲通過一個或一組URL為初始頁面,通過用戶指出的每層的URL(用戶給出a標簽選擇器,利用cheerio分析HTML標簽即可獲取URL),逐層向下請求分析搜索,直到得到目標數據。

爬蟲的廣度優先搜索路徑如圖4所示,程序首先會從初始頁面中分析獲得所有到目標頁面的一級URL,然后依次請求一級URL,得到網頁數據,進行分析之后,再得到二級URL,再進行請求分析...請求分析到目標頁面停止,此時在目標頁面運用標簽選擇器與屬性選擇器即可獲得目標數據。

圖4 爬蟲的廣度優先搜索路徑

3 Web在線爬蟲的工作流程

(1)用戶發起URL請求,Web應用響應Web在線爬蟲配置面板

(2)用戶提交爬蟲配置,Web應用將配置遞交爬蟲程序

(3)爬蟲程序根據遞交的配置,進行數據請求,處理分析,最后將處理結果遞交Web應用

(4)Web應用將結果返回用戶

(5)數據符合用戶需求,用戶發起生成數據接口請求

(6)Web應用判斷用戶是否登錄,如果登錄,數據庫保存用戶提交的爬蟲配置,與數據處理結果,如果沒有登錄,返回登錄提示。

(7)程序定時請求從數據庫獲得爬蟲配置,調用爬蟲程序,獲得結果數據后,更新數據庫中結果數據,保持數據庫數據“新鮮”

(8)用戶調用數據接口,Web應用取出數據庫數據進行響應

4 Web在線爬蟲實現

4.1 技術儲備

Web在線爬蟲后端采用Node.js平臺,原因是Node.js輕量,生態豐富。前端使用Vue框架進行頁面搭建。

采用Koa.js[3]Web開發框架。它具有輕量、表現力豐富、健壯的特點。

采用Superagent[4]請求庫。這是一個輕量的、漸進式的Ajax API,是Node.js里一個非常方便的客戶端請求代理模塊,可讀性較好。

采用Cheerio[5]。這是一個Node.js的抓取頁面模塊,是為服務器特別定制的,快速、靈活、實施的jQuery核心實現。適合各種Web爬蟲程序。

采用Async[6]。這是一個流程控制工具包,提供了直接而強大的異步功能。基于JavaScript為Node.js設計,同時也可以直接在瀏覽器中使用。

采用MongoDB[7]。這是一個基于分布式文件存儲的數據庫。它支持的數據結構非常松散,是類似JSON的BSON格式。這種文檔結構的存儲方式,使用戶能夠更便捷的獲取數據。

采用Vue.js[8]前端框架。這是一套用于構建用戶界面的漸進式框架。

4.2 在線爬蟲具體實現

(1)使用Koa.js Web開發框架,搭建Web應用。

(2)編寫Web前端頁面,負責用戶填寫提交爬蟲配置。爬蟲基本配置項有:1)初始頁面URL。2)初始頁面到中間頁面n中每一級的a標簽選擇器。3)目標頁面目標數據的標簽選擇器與屬性選擇器。

(3)將Web頁面配置提供的a標簽選擇器壓入隊列。

(4)編寫爬蟲程序。Superagent請求庫請求初始頁面URL,根據用戶提供的a標簽選擇器,使用Cheerio分析獲得下一級頁面的URL,將所有獲得到的URL壓入隊列,遞歸調用Superagent,直到a標簽選擇器隊列里,所有標簽都分析完。此時,分析到目標頁面,根據標簽選擇器與屬性選擇器,得到目標數據。

(5)將爬蟲得到的數據存入數組,由Web應用返回給用戶。

(6)為了增強爬取效率,使用Async異步請求庫,進行并發請求。

(7)為了防止被目標服務器發現爬蟲爬取數據。為Superagent設置請求頭,使用HTTP代理池,代理訪問請求。

(8)調用數據接口時,Web應用從數據庫查找用戶配置,再調用爬蟲抓取數據,最后再返回結果。當調用數據接口頻率過大時,會對服務器造成不小的壓力。因此,將爬蟲爬取的結果存入數據庫,設置定時任務,定時調用爬蟲程序,更新數據庫中爬蟲爬取的結果。當請求數據接口時,直接從數據庫中找到數據,返回結果。

5 爬蟲核心代碼

5.1 爬蟲主函數

//爬蟲主函數,根據a標簽選擇器,得到下一級URL

function splider(urls) {

return new Promise((resolve, reject) => {

//async流程控制庫,控制并發請求數量為5

async.mapLimit(urls, 5, function(url, callback) {

//superagent請求url

superagent.get(url).end(function(err, res) {

//服務器響應錯誤,或網絡錯誤

if (err) {

reject(err);

}

//保存結果

var allurls = [];

//將服務器響應內容載入Cheerio

var $ = cheerio.load(res. text);

//分析過濾

$('#list a').each(function(idx, element) {

var $element = $(element);

var href = url.resolve (url, $element.attr('href'));

allurls.push(href);

});

//調用回調函數,將局部結果傳遞到回調函數中保存,回調函數內部將局部結果拼接。

callback(null, allurls)

}, function(err, result) {

if (err) reject(err);

//函數執行完畢,將結果 返回

resolve(result);

})

})

})

}

5.2 Web應用響應函數

//Koa.js處理Web請求

app.use(async function(ctx, next) {

//用戶以get方式,請求/result路徑

if (ctx.request.path === "/result" && ctx.request.method === "GET") {

//請求參數(內含爬蟲配置參數)

const body = ctx.request.query;

try {

//響應用戶爬蟲的爬取結果

ctx.response.body = await splider (body.targetUrl);

} catch (e) {

//爬蟲響應失敗,返回錯誤提示

ctx.response.body = "Something was wrong " + e;

}

} else {

await next();

}

});

6 Web在線爬蟲使用實例

爬取目標:豆瓣電影排行榜中每部電影的詳細信息。

豆瓣電影排行榜如圖5所示。

豆瓣電影的電影詳情頁如圖6所示。

爬蟲配置頁面如圖7所示。配置頁中爬取深度指出初始頁面到目標頁面之間有幾層,目標網址即初始頁面URL,1級選擇器是初始頁面到目標頁面的a標簽選擇器,2級選擇器則為數據所在的普通選擇器,輸出結果格式中保存數據的屬性選擇器。

圖5 豆瓣電影排行榜(部分)

圖6 豆瓣電影的電影詳情頁

圖7 在線爬蟲配置頁面

請求數據接口響應的爬蟲爬取結果如圖8所示。

圖8 數據接口響應的數據

7 數據接口調用

7.1 數據接口

數據接口實例:http://www.domain.com/inter-face?name=tom&cid=123456

鏈接參數說明:

name參數指注冊用戶用戶名。只有注冊用戶才能生成數據接口。

cid參數指當前用戶的爬蟲配置參數id,每個cid對應數據庫中一個爬蟲配置。

7.2 Java調用實例[9]

public static String sendGet(String url, String param) {

String result = "";

BufferedReader in = null;

try {

String urlNameString = url + "?" + param;

URL realUrl = new URL(url-Na-me-String);

// 打開和URL之間的連接

URLConnection connection = realUrl.openConnection();

// 設置通用的請求屬性

connection.setRequestProperty("accept", "*/*");

connection.setRequestProperty("connection", "Keep-Alive");

connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

// 建立實際的連接

connection.connect();

// 獲取所有響應頭字段

Map> map = connection.getHeaderFields();

// 遍歷所有的響應頭字段

for (String key : map.keySet()) {

System.out.println(key + "--->" + map.get(key));

}

// 定義 BufferedReader輸入流來讀取URL的響應

in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

result += line;

}

} catch (Exception e) {

System.out.println("發送GET請求出現異常!" + e);

e.printStackTrace();

}

// 使用finally塊來關閉輸入流

finally {

try {

if (in != null) {

in.close();

}

} catch (Exception e2) {

e2.printStackTrace();

}

}

return result;

}

sendGet(‘http://www.domain.com/interface’,’name=tom&cid=123456’);

7.3 PHP調用實例[10]

function do_get($url, $params) {

$url = "{$url}?".http_build_query($params);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

curl_setopt($ch, CURLOPT_TIMEOUT, 60);

curl_setopt($ch, CURLOPT_POSTFIELDS, $params);

$result = curl_exec($ch);

curl_close($ch);

return $result;

}

do_get("http://www.domain.com/interface", array('name' => 'tom','cid'=>'12345'));

7.4 Node.js調用實例

const request = require('request');

request('http://www.domain.com/interface?name= tom&cid=123456',function(error,response, body) {

if (!error && response.statusCode == 200) {

console.log(body)

}

})

8 結語

本文介紹了Web在線網絡爬蟲設計與實現,對在線爬蟲原理進行了簡要分析,并重點對爬蟲實現的關鍵技術進行了講解與實現。雖然市面上爬蟲技術的數據采集系統有很多,但基本都需要進行安裝軟件、配置環境等一系列的過程,如果沒有合適的爬蟲程序,則還需要程序員手動編寫代碼實現自己的爬蟲,而這期間,耗費的時間與精力不言而喻。Web在線爬蟲簡化了過程,只需要在Web頁面上進行簡單的配置,就可以利用服務器上的爬蟲程序,獲得爬取的數據結果。選擇生成數據接口之后,用戶在自己的程序中,利用HTTP請求庫,請求數據接口獲得數據,將數據構造到自己的程序即可。這大大方便了用戶獲取互聯網上的數據。

沒有一種爬蟲程序適用所有應用場景。同樣,對于Web在線爬蟲來說也是如此,Web在線爬蟲爬取的數據,是以HTTP報文的形式在互聯網上傳輸,當Web應用響應的數據量過大,很容易造成響應超時、響應中斷的結果。所以Web在線爬蟲適合爬取傳輸一些數據量較小的數據。同時因為互聯網數以億計的網站中,網頁結構千差萬別,為了滿足爬蟲的通用性,爬蟲并沒有對Ajax動態響應的內容進行解析與處理,所以對于一些使用Ajax動態加載的網頁無能為力。但是,這并不意味著Web在線爬蟲沒有實用價值。使用Web在線爬蟲,可以用來監控目標網站數據,比如,我想知道北京到西安的某一個航班在10月的機票價格情況,可以使用Web在線爬蟲爬取航空公司網站,生成數據接口之后,用戶每天請求數據接口,將得到的數據保存匯總即可。同樣,還可以用來監控自己在購物網站上喜愛的物品降價沒有,自己追的劇更新沒有等等。

[1] alsotang. 使用superagent與cheerio完成簡單爬蟲[OL]. (2014-10-27)[2018-07-5]. https://github.com/alsotang/node- lessons/tree/master/lesson3.

[2] neituime. 網絡爬蟲基本工作流程和抓取策略[OL]. (2015- 12-08)[2018-07-6]. https://blog.csdn.net/neituime/article/det-ails/50218833.

[3] StrongLoop. Koa-next generation web framework for node.js [OL]. [2018-07-6]. https://koajs.com.

[4] visionmedia.SuperAgent-elegant API for AJAX in Node and browsers[OL]. [2018-07-6]. http://visionmedia.github.io/sup-era-gent/.

[5] cheeriojs. Cheerio[OL](2018-7-7)[2018-7-8]. https://github. com/cheer-iojs/cheerio.

[6] caolan. async [OL].(2018-5-20) [2018-7-10]. https://caolan. github.io/async/.

[7] Dwight, Merriman, Eliot, Horowitz, Kevin, Ryan. MongoDB Documentation [OL]. [2018-7-10]. https://docs.mongodb.com/.

[8] Phan An, defcc, Jinjiang. Vue教程[OL]. [2018-7-10]. https: //cn.vuejs.org/v2/guide/index.html.

[9] 五指少年. java發送http請求[OL]. (2016-08-31) [2018- 07-10]. https://www.cnblogs.com/xrab/p/5825105.html.

[10] 小云云. PHP實現發送HTTP請求[OL]. (2018-03-27) [2018- 07-10]. http://www.php.cn/php-weizijiaocheng-390267.html.

Design and Implementation of Web Online Crawler

HAN Qian-jin

(Shihezi University, Shihezi Xinjiang, 832000, China)

In order to facilitate users to obtain Internet data simply and efficiently, an online lightweight web crawler combining Web technology and crawler technology is proposed. The crawler can be configured on the Web page, the user submits the configuration to the remote server, the server crawler program carries out the data capture and analysis, and finally returns the result to the page for preview by the Web application, and supports the generation of the data result interface URL, which is convenient for the user to call the data crawled by the crawler program on the server.

Search engines; Web crawler; Web technology

TP393.092

A

10.3969/j.issn.1003-6970.2018.09.018

韓前進(1996-),男,石河子大學信息科學與技術學院計算機科學與技術專業學生。

本文著錄格式:韓前進. Web在線爬蟲的設計與實現[J]. 軟件,2018,39(9):86-92

猜你喜歡
頁面程序數據庫
大狗熊在睡覺
刷新生活的頁面
保健醫苑(2022年1期)2022-08-30 08:39:14
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
數據庫
財經(2017年2期)2017-03-10 14:35:35
數據庫
財經(2016年15期)2016-06-03 07:38:02
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
主站蜘蛛池模板: 凹凸国产熟女精品视频| 成人韩免费网站| 中文字幕波多野不卡一区| 国产成人精品2021欧美日韩| 女人18毛片一级毛片在线 | 在线看免费无码av天堂的| 漂亮人妻被中出中文字幕久久| 国产91高跟丝袜| 福利视频一区| 欧美一区精品| 激情综合图区| 国产av无码日韩av无码网站| 国产激爽大片在线播放| 国产在线精彩视频二区| 在线另类稀缺国产呦| 国产一区二区丝袜高跟鞋| а∨天堂一区中文字幕| 国产69囗曝护士吞精在线视频| 亚洲品质国产精品无码| 日本欧美视频在线观看| 成人亚洲视频| 狠狠色香婷婷久久亚洲精品| 国产成人福利在线| 麻豆精品在线| 3p叠罗汉国产精品久久| 97se亚洲综合不卡| 亚洲天堂视频网站| 色欲国产一区二区日韩欧美| 国产AV毛片| 免费一级无码在线网站| 六月婷婷精品视频在线观看| 亚洲天堂精品视频| 久久久久久午夜精品| 国产香蕉在线视频| a网站在线观看| 无码高清专区| 巨熟乳波霸若妻中文观看免费| 欧美日韩北条麻妃一区二区| 最近最新中文字幕在线第一页| 国产欧美网站| 国产永久无码观看在线| 毛片免费视频| 色欲不卡无码一区二区| 国产大片黄在线观看| 韩日无码在线不卡| 国产亚洲视频免费播放| 91无码网站| 国产一区成人| 在线观看国产小视频| 无码中文字幕乱码免费2| 久久婷婷五月综合97色| 欧美日韩中文字幕在线| 久久国产香蕉| av在线无码浏览| 夜夜操天天摸| 日韩美毛片| 九九久久99精品| 最新国产精品鲁鲁免费视频| 久久精品这里只有精99品| 国产精品嫩草影院av| 日韩精品专区免费无码aⅴ| 欧美精品一区二区三区中文字幕| 色婷婷狠狠干| 成人日韩视频| 国内自拍久第一页| 欧美成人aⅴ| 欧美精品成人一区二区视频一| 一区二区在线视频免费观看| 五月天福利视频| 久久网欧美| 午夜视频www| 国产大片喷水在线在线视频| 高清久久精品亚洲日韩Av| 色综合天天综合中文网| 久久国产黑丝袜视频| 国产xxxxx免费视频| 四虎综合网| 国产成人无码综合亚洲日韩不卡| 国产在线麻豆波多野结衣| 久久成人18免费| 亚洲无码在线午夜电影| 亚洲一区二区三区在线视频|