互聯網金融爬蟲怎麼寫-第四課 雪球網股票爬蟲(單頁面多數據)

Previous on  系列教程:ajax

互聯網金融爬蟲怎麼寫-第一課 p2p網貸爬蟲(XPath入門)正則表達式

互聯網金融爬蟲怎麼寫-第二課 雪球網股票爬蟲(正則表達式入門)json

互聯網金融爬蟲怎麼寫-第三課 雪球網股票爬蟲(ajax分析)瀏覽器

哈哈,我又來了,話說出教程就是這麼任性,我們乘熱打鐵,把上節課分析完成可是沒寫的代碼給完成了!cookie

工具要求與基礎知識:框架

工具要求:dom

教程中主要使用到了 一、神箭手雲爬蟲 框架  這個是爬蟲的基礎,二、Chrome瀏覽器和Chrome的插件XpathHelper 這個用來測試Xpath寫的是否正確 三、Advanced REST Client用來模擬提交請求工具

基礎知識:學習

本教程中主要用到了一些基礎的js和xpath語法,若是對這兩種語言不熟悉,能夠提早先學習下,都很簡單。測試

三步走

還記得咱們在遙遠的電商系列爬蟲教程的第一課裏提到具體寫爬蟲的幾個步驟嗎?咱們沿着路徑再來走一遍:

第一步:肯定入口URL

暫且使用這個第一頁的ajax的url連接:

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

第二步:區份內容頁和中間頁

此次你們有點犯難了,雖說每個股票都有一個單獨的頁面,可是列表頁的信息已經蠻多的了,光爬取列表頁信息就已經夠了,那怎麼區份內容頁和中間頁呢?其實咱們只須要將內容頁和中間頁的正則設置成同樣的既可。以下:

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

在提醒你們一下,這裏之因此轉義符用了兩個是由於在神箭手中,設置正則時,是字符串設置,須要對轉義符再作一次轉義。

第三步:內容頁抽取規則

因爲ajax返回的是json,而神箭手是支持jsonpath的提取方式的,所以提取規則就很簡單了。不過這裏要特殊注意的是,因爲咱們是在列表頁抽取數據,所以數據最頂層至關因而一個列表,咱們須要在頂層的field上設置一個列表數據的值。具體抽取規則以下:

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:"當前價格",

selector:"$.current",

selectorType:SelectorType.JsonPath,

},

{

name:"high",

alias:"最高價格",

selector:"$.high",

selectorType:SelectorType.JsonPath,

},

{

name:"low",

alias:"最低價格",

selector:"$.low",

selectorType:SelectorType.JsonPath,

}

]

}

]

我簡單抽取了一些信息,其餘信息都相似。

好了,主要的代碼基本已經寫好了,剩下的還須要解決兩個問題

1.爬取前須要先訪問一下首頁獲取cookie

2.雖然能夠直接加入下一頁,可是一共有多少頁並不知道。

首先對於第一點,咱們只須要在beforeCrawl回調中訪問一下首頁便可,神箭手會自動對cookie進行處理和保存,具體代碼以下:

configs.beforeCrawl =function(site){

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

};

好了,除了下一頁基本已經沒什麼問題了,咱們先測試一下看看效果:

數據已經出來了,沒問題,第一頁的數據都有了,那下一頁怎麼處理呢?咱們有兩個方案:

第一個方案:

咱們能夠看到json的返回值中有一個count字段,這個字段目測應該是總數據量的值,那沒咱們根據這個值,再加上單頁數據條數,咱們就能夠判斷總共有多少頁了。

第二個方案:

咱們先訪問一下,假設頁數很大,看看會雪球會返回什麼,咱們嘗試訪問第500頁,能夠看到返回值中的stocks是0個,那麼咱們能夠根據是否有數據來判斷需不須要加下一頁。

兩個方案各有利弊,咱們這裏選擇用第一個方案來處理,具體代碼以下:

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

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

//若是是第一頁

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");

}

}

}

};

好了,經過三課的艱苦奮戰,終於完成了雪球滬深一覽的征服。先看下跑出來的效果。

完整代碼以下:

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:"當前價格",

selector:"$.current",

selectorType:SelectorType.JsonPath,

},

{

name:"high",

alias:"最高價格",

selector:"$.high",

selectorType:SelectorType.JsonPath,

},

{

name:"low",

alias:"最低價格",

selector:"$.low",

selectorType:SelectorType.JsonPath,

}

]

}

]

};

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

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

//若是是第一頁

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();

這樣咱們的雪球網股票爬蟲就算大功告成,固然咱們還能夠把type的設置模板化。不過這個是一些高級的方法,咱們會在後面的課程中再去詳細描述

最後,對爬蟲感興趣的童鞋歡迎加qq羣跟我討論:566855261。

相關文章
相關標籤/搜索