如何編寫互聯網金融爬蟲——第壹課p2p網貸爬蟲(XPath入門)
如何編寫互聯網金融爬蟲——第二課雪球網股票爬蟲(正則表達式介紹)
如何編寫互聯網金融爬蟲——第三課雪球股票爬蟲(ajax分析)
哈哈,壹個小時沒見,又來了,說教程這麽任性。我們趁熱打鐵,把上節課分析過但沒寫的代碼寫完!
工具要求:教程主要使用1,Archer雲爬蟲框架,是爬蟲的基礎;2.Chrome瀏覽器和Chrome插件XpathHelper,用來測試Xpath寫的是否正確;3.高級REST客戶端用於模擬提交請求。
基礎知識:本教程主要使用壹些基本的js和xpath語法。如果不熟悉這兩種語言,可以提前學習,很簡單。
還記得我們在遠方電商系列爬蟲教程第壹課提到的寫壹個爬蟲的幾個步驟嗎?讓我們再沿著小路走壹遍:
第壹步:確定入口URL。
暫時在第壹頁使用ajax的url鏈接:
[html]查看純文本
/stock/cata/stocklist.json?page=1。size = 30 & amp訂單= desc & amp;百分比& amptype=11%2C12
第二步:區分內容頁和中間頁。
這壹次,大家都有點不解。雖然每只股票都有單獨的頁面,但是列表頁面上已經有很多信息了。抓取列表頁面上的信息就足夠了。怎樣才能區分內容頁和中間頁?其實我們只需要把內容頁和中間頁的規整度設置成壹樣就可以了。如下所示:
[html]查看純文本
/stock/cata/stocklist\\。json\\?page = \ \ d+& amp;size = 30 & amp訂單= desc & amp;orderby =百分比& amptype=11%2C12
只是提醒壹下,這裏之所以用兩個轉義字符,是因為在Archer中,設置正則化時,是字符串設置,轉義字符需要重新轉義。
步驟3:內容頁面提取規則
由於ajax返回json,Archer支持jsonpath提取,所以提取規則非常簡單。但是,需要註意的是,由於我們是從列表頁面中提取數據,所以頂層數據相當於壹個列表,我們需要在top字段上設置壹個列表數據的值。具體提取規則如下:
[javascript]查看純文本
字段:[
{
名稱:“股票”,
選擇器:“$。股票”,
selectorType:SelectorType。JsonPath,
重復:真的,
兒童:[
{
名稱:“代碼”,
別名:“代碼”,
選擇器:“$。代碼”,
selectorType:SelectorType。JsonPath,
},
{
姓名:“姓名”,
別名:“姓名”,
選擇器:“$。姓名”,
selectorType:SelectorType。JsonPath,
},
{
名稱:“當前”,
別名:“現價”,
選擇器:“$。當前”,
selectorType:SelectorType。JsonPath,
},
{
名稱:“高”,
別名:“最高價”,
選擇器:“$。高”,
selectorType:SelectorType。JsonPath,
},
{
名稱:“低”,
別名:“最低價”,
選擇器:“$。低",
selectorType:SelectorType。JsonPath,
}
]
}
]
我只是簡單摘錄了壹些信息,其他信息也差不多。
好了,主代碼已經基本寫好了,剩下的需要解決兩個問題。
1.在抓取之前,您需要訪問主頁來獲取cookie。
2.雖然可以直接添加下壹頁,但是不知道有多少頁。
首先,對於第壹點,我們只需要訪問beforeCrawl回調中的主頁,archer會自動處理並保存cookie。具體代碼如下:
[javascript]查看純文本
configs . before crawl = function(site){
site . request URL(" ");
};
好的,除了下壹頁,基本沒有問題。我們先測試壹下看看效果:
數據已經出來了,沒問題。我們在第壹頁上有所有的數據。下壹頁我們該怎麽辦?我們有兩個計劃:
第壹個計劃:
我們可以看到json的返回值中有壹個count字段,直觀上應該是總數據量的值,所以我們可以根據這個值和單頁的數據量來判斷有多少頁。
第二個計劃:
我們先訪問壹下,假設頁數很大,看看雪球會返回什麽。我們嘗試訪問500頁,可以看到返回值中有0只股票,可以根據是否有數據來判斷是否需要添加下壹頁。
這兩種方案各有利弊。這裏我們選擇第壹種方案來處理它。具體代碼如下:
[javascript]查看純文本
configs . onprocesshelperpage = function(頁面、內容、網站){
if(page . URL . index of(" page = 1 & amp;size=30 ")!== -1){
//如果是第壹頁
var result = JSON . parse(page . raw);
var計數= result . count . count;
var page _ num = math . ceil(count/30);
if(page _ num & gt;1){
for(var I = 2;我& lt=頁面編號;i++){
site . addurl("/stock/cata/stock list . JSON?page = "+I+" & amp;size = 30 & amp訂單= desc & amp;百分比& amptype = 11% 2c 12 ");
}
}
}
};
好吧,三節課下來,我終於在上海和深圳完成了雪球的征服。先看看用完的效果。
完整的代碼如下:
[javascript]查看純文本
變量配置= {
域名:["xueqiu.com"],
scan URLs:["/stock/cata/stock list . JSON?page=1。size = 30 & amp訂單= desc & amp;百分比& amptype = 11% 2c 12 "],
contentUrlRegexes:["/stock/cata/stock list \ \。json\\?page = \ \ d+& amp;size = 30 & amp訂單= desc & amp;百分比& amptype = 11% 2c 12 "],
helperUrlRegexes:["/stock/cata/stock list \ \。json\\?page = \ \ d+& amp;size = 30 & amp訂單= desc & amp;百分比& amptype = 11% 2c 12 "],
字段:[
{
名稱:“股票”,
選擇器:“$。股票”,
selectorType:SelectorType。JsonPath,
重復:真的,
兒童:[
{
名稱:“代碼”,
別名:“代碼”,
選擇器:“$。代碼”,
selectorType:SelectorType。JsonPath,
},
{
姓名:“姓名”,
別名:“姓名”,
選擇器:“$。姓名”,
selectorType:SelectorType。JsonPath,
},
{
名稱:“當前”,
別名:“現價”,
選擇器:“$。當前”,
selectorType:SelectorType。JsonPath,
},
{
名稱:“高”,
別名:“最高價”,
選擇器:“$。高”,
selectorType:SelectorType。JsonPath,
},
{
名稱:“低”,
別名:“最低價”,
選擇器:“$。低",
selectorType:SelectorType。JsonPath,
}
]
}
]
};
configs . onprocesshelperpage = function(頁面、內容、網站){
if(page . URL . index of(" page = 1 & amp;size=30 ")!== -1){
//如果是第壹頁
var result = JSON . parse(page . raw);
var計數= result . count . count;
var page _ num = math . ceil(count/30);
if(page _ num & gt;1){
for(var I = 2;我& lt=頁面編號;i++){
site . addurl("/stock/cata/stock list . JSON?page = "+I+" & amp;size = 30 & amp訂單= desc & amp;百分比& amptype = 11% 2c 12 ");
}
}
}
};
configs . before crawl = function(site){
site . request URL(" ");
};
var crawler =新爬蟲(配置);
crawler . start();