有很多朋友都需要把天貓的商品遷移到微店上去。可在天貓上的商品數據非常復雜,淘寶開放接口禁止向外提供數據,一般的采集器對ajax數據采集的支持又不太好。
還有現在有了火蜘蛛采集器,經過一定的配置,終於把天貓商品的數據都采集下來了(SKU信息,運費信息,庫存信息,圖片,商品描述等)。天貓商品網頁的確是很復雜,比如商品描述,還有商品描述中的圖片,使用的都是懶加載,只有當用戶滾動到那里了,才會去加載描述和圖片。還好這些都難不倒火蜘蛛采集器。當然了,采集回來的信息也是很復雜的,需要我們清楚了解淘寶的商品數據結構,並轉換成微店的商品數據結構,然后調用微店接口進行添加。
火蜘蛛采集器下載地址:
http://firespider.duapp.com/FireSpiderWeb/index.html
如何在安裝包里就已經說明了。不過現在安裝包只支持win7系統。如果是win8,安裝客戶端時要把安裝包下的components目錄手工復制覆蓋C:\Program Files (x86)\Mozilla Firefox\browser\components。
下面說說采集的過程
- 網頁分析
要采集網頁的數據,首先要做的當然是對目標網頁進行分析,目標是找出我們要采集的數據到底在哪里。這可以說是采集過程中最重要的一步。這里我們使用firebug進行分析。使用火狐瀏覽器打開一個天貓商品,比如:
http://detail.tmall.com/item.htm?spm=a1z10.1002.w4948-8875692881.4.4bX5Dj&id=40660880252
使用firebug分析網頁結構,主要是通過幾個方面進行了解:頁面源代碼,處理完成后的HTML,腳本,網絡加載。
頁面源代碼:在網頁右擊,選擇查看網頁源代碼可以看到。通過查看網頁源代碼,可以大致推測到網頁使用什么樣的方式加載顯示,以及了解部分網頁的加載邏輯。
處理完成后的HTML:通過firebug的“html”tab頁可查看到完整的處理完成后的HTML樹。通過查看處理完成后的HTML,與頁面源代碼進行對比,也可以推測網頁的加載方式。
腳本:通過firebug的”script”tab頁可查看到當前網頁加載了哪些腳本。
網絡加載:通過firebug的”net”tab頁可查看到打開當前網頁后一共加載了多少網絡請求,以及各個網絡請求的返回內容。
通過對天貓商品頁的分析,我們發現:
1) 商品圖像,通過HTML就可以取到
2) 商品SKU信息,如尺碼和顏色,通過HTML也能取到
3) 產品參數,通過HTML也可以取到
4) 商品的一部分信息,如SKU價格等,頁面源代碼的一個script中,可以取到這個script的text再進行截取,得到一個json字符串
5) 商品的運費信息,在
http://mdskip.taobao.com/core/initItemDetail.htm?。。。鏈接返回的數據中,通過截取,得到一個json字符串
6) 商品的描述信息,通過HTML也可以取到。但是必須要慢慢滾動下去,觸發懶加載后,待圖片加載完成,才能取到。
- 定制采集任務
知道了我們要采集數據在哪里之后,我們就可以開始定制采集了:定義執行器,提取器,采集模塊,采集任務等。鑒於一些網頁的復雜性(例如淘寶),有時我們會需要反復進行嘗試,直到找到合適的方法為止。下面介紹一下我們定制的天貓采集任務:
2.1 商品頁采集模塊
這里定義了四個處理器鏈:
第一個鏈:在網頁加載完成后,依次執行“加入JQ支持”,“采集天貓商品圖像”,“采集天貓SKU”,“天貓產品參數”,“采集天貓產品主信息”。
第二個鏈:在某個網絡鏈接加載完成后,執行“采集天貓產品主信息2”。
第三個鏈:在某個網絡鏈接加載完成后,執行“采集天貓產品描述”。
第四個鏈:在網頁加載完成后,執行“scrollTo”。
下面我們對這些處理器逐個進行介紹:
加入JQ支持
加入JQ支持本來應該定義為執行器,這里把它定義為提取器。不過這也無妨,執行器跟JS提取器本質上是一樣的,只是有無參數有無返回值的區別而已。加入JQ支持的目的只是為了在后面的處理器中寫JS腳本方便一些,可以直接使用JQ腳本。當然,天貓商品頁面本來就已經使用了$這個函數名,所以不要忘記了調用一下jQuery.noConflict();
此處理器的實現,就只是把jquery.mini.js源碼考到function里面了,再調用一下jQuery.noConflict();
function(){
//把jquery.mini.js源碼考到這里
//…
//把$還給原始頁面
jQuery.noConflict();
}
采集天貓商品圖像
商品圖像都在頁面上的J_UIThumb這個UL下面,我們通過jquery取到它。注意,這里取到的圖像鏈接是小圖的圖像鏈接。對小圖鏈接經過截取得到大圖鏈接。
小圖鏈接:http://gi1.md.alicdn.com/bao/uploaded/i1/TB128CJGpXXXXa0XXXXXXXXXXXX_!!0-item_pic.jpg_60x60q90.jpg
大圖鏈接:http://gi1.md.alicdn.com/bao/uploaded/i1/TB128CJGpXXXXa0XXXXXXXXXXXX_!!0-item_pic.jpg
還有一點要注意,就是要對這個提取器配置添加“鏈接下載過濾器”,這樣采集器會把這些圖像都保存到本地,方便后續處理。
腳本:
function(){
var img = [];
jQuery('#J_UlThumb').find('img').each(function(){
var s = jQuery(this).attr('src');
// 對小圖鏈接進行截取得到大圖鏈接
var postfix = s.substring(s.lastIndexOf('.'));
s = s.substring(0, s.lastIndexOf('.'));
s = s.substring(0, s.lastIndexOf('.'));
s = s + postfix;
img.push(s);
});
return {
mainImgs:{
type:'list',
value:img,
useFor:'save',
tag:''
}
}
}
采集天貓SKU,天貓產品參數
這兩個不用多說,只是從HTML中取出SKU信息。跟平時我們用JQ操作DOM是一樣一樣的。
采集天貓產品主信息
天貓商品主信息都放在一個script標簽中,取得這個script的內容,並進行截取,就可以得到天貓商品主信息。
function(){
//取得script標簽中的內容
var str = document.getElementById('J_FrmBid').nextSibling.nextSibling.innerHTML;
//對內容進行截取
str = str.substring(str.indexOf('TShop.Setup(') + 12);
str = str.substring(0, str.lastIndexOf(');'));
str = str.substring(0, str.lastIndexOf(');'));
//解析成json
var result = JSON.parse(str);
return {
mainInfo:{
type:'data',
value:result,
useFor:'save',
tag:''
}
};
}
采集天貓產品主信息2
通過網頁分析我們知道天貓商品的一部分信息是通 http://mdskip.taobao.com/core/initItemDetail.htm 這個鏈接進行加載的,所以我們定義了一個提取器,提取時機為網絡加載之后,用於采集這部分的內容。
注意“提取腳本”中的resp參數,“網絡連接加載之后”的處理器處理腳本都會接收這個參數,可通過resp.responseText取得網絡加載的內容。
采集天貓產品描述,scrollTo
這兩個處理器是組合使用的。在網頁分析時我們知道產品描述是懶加載的。如果在網頁加載完成后就通過$(‘#description’).html()來提取產品描述,只能提取到“描述加載中”幾個字。我們要模擬用戶慢慢拖動滾動條滾動網頁,scrollTo處理器就是用於模擬這個過程,以觸發產品描述的懶加載。
//scrollTo的執行腳本
function(){
//定義一個全局變量,用於記錄當前滾動高度
window.myScrollHeight = 0;
//定義一個全局函數,
window.doScrollTo = function(){
//滾動高度增加100
window.myScrollHeight += 100;
window.scrollTo(0, window.myScrollHeight);
var nHeight = document.documentElement.scrollTop + window.screen.availHeight;
//如果已經滾動到底了,調用跨域加載,用於觸發提取器“采集天貓產品描述”
if(nHeight >= document.body.scrollHeight){
//注意這里要加上r=Math.random(),防止因網頁緩存而不加載
jQuery.ajax({url:"http://localhost:8090/FireSpider/html/index.html?r=" + Math.random(),crossDomain:true});
} else {
//如果還沒有滾動到底,200毫秒后再次調用doScrollTo
window.setTimeout("doScrollTo()", 200);
}
}
//200毫秒后調用doScrollTo
window.setTimeout("doScrollTo()", 200);
}
“采集天貓產品描述”定義為在http://localhost:8090/FireSpider/*加載完成后執行。而此網絡連接正是由scrollTo觸發加載的。
2.2 列表頁采集模塊
天貓商品列表下一頁鏈接
商品列表頁是分頁顯示的,列表頁都要采集。在采集每一頁列表頁的時候,都看看是否有“下一頁”鏈接,把鏈接加入采集URL中。
腳本
function(){
// 如果有”下一頁”鏈接
var len = jQuery('.next').length;
if(len > 0){
var url = jQuery('.next').attr('href');
return {
nextPage:{
type : 'data',
value : url,
useFor : 'url',
tag : 'TmallProductList'
}
};
}
}
采集列表頁商品鏈接
用於采集列表頁的商品鏈接,這是個xpath提取器,通過firebug可看到xpath是 .//dd[@class='detail']/a[@class='item-name']
3. 過濾器
需要配置過濾器的有:“天貓商品圖像”,“采集天貓產品描述”,目的是要把圖片保存到本地。
天貓商品圖像
采集天貓產品描述
4. 采集任務
4.1 單個商品采集任務(測試用)
這個任務只是采集一個商品,主要是用來測試看商品頁的采集是否能成功運行。
4.2 正式采集任務
這個是正式的采集任務,入口是商品列表頁的第一頁。