您好,登錄后才能下訂單哦!
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è)試一下看看效果:
數(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),終于完成了雪球滬深一覽的征服。先看下跑出來的效果。
完整代碼如下:
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。
免責(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)容。