溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

互聯(lián)網(wǎng)金融爬蟲怎么寫-第四課 雪球網(wǎng)股票爬蟲(單頁(yè)面多數(shù)據(jù))

發(fā)布時(shí)間:2020-07-27 22:13:03 來源:網(wǎng)絡(luò) 閱讀:402 作者:游牧民族V 欄目:開發(fā)技術(shù)

Previous on  系列教程:

互聯(lián)網(wǎng)金融爬蟲怎么寫-第一課 p2p網(wǎng)貸爬蟲(XPath入門)

互聯(lián)網(wǎng)金融爬蟲怎么寫-第二課 雪球網(wǎng)股票爬蟲(正則表達(dá)式入門)

互聯(lián)網(wǎng)金融爬蟲怎么寫-第三課 雪球網(wǎng)股票爬蟲(ajax分析)


哈哈,我又來了,話說出教程就是這么任性,咱們乘熱打鐵,把上節(jié)課分析完成但是沒寫的代碼給完成了!


工具要求:

教程中主要使用到了 1、神箭手云爬蟲 框架  這個(gè)是爬蟲的基礎(chǔ),2、Chrome瀏覽器和Chrome的插件XpathHelper 這個(gè)用來測(cè)試Xpath寫的是否正確 3、Advanced REST Client用來模擬提交請(qǐng)求

基礎(chǔ)知識(shí):

本教程中主要用到了一些基礎(chǔ)的js和xpath語(yǔ)法,如果對(duì)這兩種語(yǔ)言不熟悉,可以提前先學(xué)習(xí)下,都很簡(jiǎn)單。


還記得我們?cè)谶b遠(yuǎn)的電商系列爬蟲教程的第一課里提到具體寫爬蟲的幾個(gè)步驟嗎?我們沿著路徑再來走一遍:


第一步:確定入口URL

暫且使用這個(gè)第一頁(yè)的ajax的url鏈接:

http://xueqiu.com/stock/cata/stocklist.json?page=1&size=30&order=desc&orderby=percent&type=11%2C12

第二步:區(qū)分內(nèi)容頁(yè)和中間頁(yè)

這次大家有點(diǎn)犯難了,雖然說每一個(gè)股票都有一個(gè)單獨(dú)的頁(yè)面,但是列表頁(yè)的信息已經(jīng)蠻多的了,光爬取列表頁(yè)信息就已經(jīng)夠了,那怎么區(qū)分內(nèi)容頁(yè)和中間頁(yè)呢?其實(shí)我們只需要將內(nèi)容頁(yè)和中間頁(yè)的正則設(shè)置成一樣的既可。如下:

http://xueqiu.com/stock/cata/stocklist\\.json\\?page=\\d+&size=30&order=desc&orderby=percent&type=11%2C12

在提醒大家一下,這里之所以轉(zhuǎn)義符用了兩個(gè)是因?yàn)樵谏窦种?,設(shè)置正則時(shí),是字符串設(shè)置,需要對(duì)轉(zhuǎn)義符再做一次轉(zhuǎn)義。

第三步:內(nèi)容頁(yè)抽取規(guī)則

由于ajax返回的是json,而神箭手是支持jsonpath的提取方式的,因此提取規(guī)則就很簡(jiǎn)單了。不過這里要特殊注意的是,由于我們是在列表頁(yè)抽取數(shù)據(jù),因此數(shù)據(jù)最頂層相當(dāng)于是一個(gè)列表,我們需要在頂層的field上設(shè)置一個(gè)列表數(shù)據(jù)的值。具體抽取規(guī)則如下:

fields: [

{

name:"stocks",

selector:"$.stocks",

selectorType:SelectorType.JsonPath,

repeated:true,

children:[

{

name:"code",

alias:"代碼",

selector:"$.code",

selectorType:SelectorType.JsonPath,

},

{

name:"name",

alias:"名稱",

selector:"$.name",

selectorType:SelectorType.JsonPath,

},

{

name:"current",

alias:"當(dāng)前價(jià)格",

selector:"$.current",

selectorType:SelectorType.JsonPath,

},

{

name:"high",

alias:"最高價(jià)格",

selector:"$.high",

selectorType:SelectorType.JsonPath,

},

{

name:"low",

alias:"最低價(jià)格",

selector:"$.low",

selectorType:SelectorType.JsonPath,

}

]

}

]

我簡(jiǎn)單抽取了一些信息,其他信息都類似。

好了,主要的代碼基本已經(jīng)寫好了,剩下的還需要解決兩個(gè)問題

1.爬取前需要先訪問一下首頁(yè)獲取cookie

2.雖然可以直接加入下一頁(yè),但是一共有多少頁(yè)并不知道。

首先對(duì)于第一點(diǎn),我們只需要在beforeCrawl回調(diào)中訪問一下首頁(yè)即可,神箭手會(huì)自動(dòng)對(duì)cookie進(jìn)行處理和保存,具體代碼如下:

configs.beforeCrawl =function(site){

    site.requestUrl("http://xueqiu.com");

};

好了,除了下一頁(yè)基本已經(jīng)沒什么問題了,我們先測(cè)試一下看看效果:

互聯(lián)網(wǎng)金融爬蟲怎么寫-第四課 雪球網(wǎng)股票爬蟲(單頁(yè)面多數(shù)據(jù))

數(shù)據(jù)已經(jīng)出來了,沒問題,第一頁(yè)的數(shù)據(jù)都有了,那下一頁(yè)怎么處理呢?我們有兩個(gè)方案:


第一個(gè)方案:

我們可以看到j(luò)son的返回值中有一個(gè)count字段,這個(gè)字段目測(cè)應(yīng)該是總數(shù)據(jù)量的值,那沒我們根據(jù)這個(gè)值,再加上單頁(yè)數(shù)據(jù)條數(shù),我們就可以判斷總共有多少頁(yè)了。

第二個(gè)方案:

我們先訪問一下,假設(shè)頁(yè)數(shù)很大,看看會(huì)雪球會(huì)返回什么,我們嘗試訪問第500頁(yè),可以看到返回值中的stocks是0個(gè),那么我們可以根據(jù)是否有數(shù)據(jù)來判斷需不需要加下一頁(yè)。

兩個(gè)方案各有利弊,我們這里選擇用第一個(gè)方案來處理,具體代碼如下:

configs.onProcessHelperPage =function(page, content, site){

if(page.url.indexOf("page=1&size=30") !== -1){

//如果是第一頁(yè)

varresult = JSON.parse(page.raw);

varcount = result.count.count;

varpage_num = Math.ceil(count/30);

if(page_num > 1){

for(vari = 2;i<=page_num;i++){

site.addUrl("http://xueqiu.com/stock/cata/stocklist.json?page="+i+"&size=30&order=desc&orderby=percent&type=11%2C12");

}

}

}

};


好了,通過三課的艱苦奮戰(zhàn),終于完成了雪球滬深一覽的征服。先看下跑出來的效果。

互聯(lián)網(wǎng)金融爬蟲怎么寫-第四課 雪球網(wǎng)股票爬蟲(單頁(yè)面多數(shù)據(jù))


完整代碼如下:

varconfigs = {

domains: ["xueqiu.com"],

scanUrls: ["http://xueqiu.com/stock/cata/stocklist.json?page=1&size=30&order=desc&orderby=percent&type=11%2C12"],

contentUrlRegexes: ["http://xueqiu.com/stock/cata/stocklist\\.json\\?page=\\d+&size=30&order=desc&orderby=percent&type=11%2C12"],

helperUrlRegexes: ["http://xueqiu.com/stock/cata/stocklist\\.json\\?page=\\d+&size=30&order=desc&orderby=percent&type=11%2C12"],

fields: [

{

name:"stocks",

selector:"$.stocks",

selectorType:SelectorType.JsonPath,

repeated:true,

children:[

{

name:"code",

alias:"代碼",

selector:"$.code",

selectorType:SelectorType.JsonPath,

},

{

name:"name",

alias:"名稱",

selector:"$.name",

selectorType:SelectorType.JsonPath,

},

{

name:"current",

alias:"當(dāng)前價(jià)格",

selector:"$.current",

selectorType:SelectorType.JsonPath,

},

{

name:"high",

alias:"最高價(jià)格",

selector:"$.high",

selectorType:SelectorType.JsonPath,

},

{

name:"low",

alias:"最低價(jià)格",

selector:"$.low",

selectorType:SelectorType.JsonPath,

}

]

}

]

};

configs.onProcessHelperPage =function(page, content, site){

if(page.url.indexOf("page=1&size=30") !== -1){

//如果是第一頁(yè)

varresult = JSON.parse(page.raw);

varcount = result.count.count;

varpage_num = Math.ceil(count/30);

if(page_num > 1){

for(vari = 2;i<=page_num;i++){

site.addUrl("http://xueqiu.com/stock/cata/stocklist.json?page="+i+"&size=30&order=desc&orderby=percent&type=11%2C12");

}

}

}

};

configs.beforeCrawl =function(site){

site.requestUrl("http://xueqiu.com");

};

varcrawler =newCrawler(configs);

crawler.start();

這樣我們的雪球網(wǎng)股票爬蟲就算大功告成,當(dāng)然我們還可以把type的設(shè)置模板化。不過這個(gè)是一些高級(jí)的方法,我們會(huì)在后面的課程中再去詳細(xì)描述

最后,對(duì)爬蟲感興趣的童鞋歡迎加qq群跟我討論:566855261。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI