使用火蜘蛛採集器Firespider採集天貓商品資料並上傳到微店

rezy發表於2014-11-06

 

有很多朋友都需要把天貓的商品遷移到微店上去。可在天貓上的商品資料非常複雜,淘寶開放介面禁止向外提供資料,一般的採集器對ajax資料採集的支援又不太好。

 

還有現在有了火蜘蛛採集器,經過一定的配置,終於把天貓商品的資料都採集下來了(SKU資訊,運費資訊,庫存資訊,圖片,商品描述等)。天貓商品網頁的確是很複雜,比如商品描述,還有商品描述中的圖片,使用的都是懶載入,只有當使用者滾動到那裡了,才會去載入描述和圖片。還好這些都難不倒火蜘蛛採集器。當然了,採集回來的資訊也是很複雜的,需要我們清楚瞭解淘寶的商品資料結構,並轉換成微店的商品資料結構,然後呼叫微店介面進行新增。

 

火蜘蛛採集器下載地址:

http://firespider.duapp.com/FireSpiderWeb/index.html

如何在安裝包裡就已經說明了。不過現在安裝包只支援win7系統。如果是win8,安裝客戶端時要把安裝包下的components目錄手工複製覆蓋C:\Program Files (x86)\Mozilla Firefox\browser\components。

 

 

下面說說採集的過程

 

  1. 網頁分析

要採集網頁的資料,首先要做的當然是對目標網頁進行分析,目標是找出我們要採集的資料到底在哪裡。這可以說是採集過程中最重要的一步。這裡我們使用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也可以取到。但是必須要慢慢滾動下去,觸發懶載入後,待圖片載入完成,才能取到。

 

  1. 定製採集任務

知道了我們要採集資料在哪裡之後,我們就可以開始定製採集了:定義執行器,提取器,採集模組,採集任務等。鑑於一些網頁的複雜性(例如淘寶),有時我們會需要反覆進行嘗試,直到找到合適的方法為止。下面介紹一下我們定製的天貓採集任務:

 

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   正式採集任務

這個是正式的採集任務,入口是商品列表頁的第一頁。

相關文章