Python爬蟲——實戰二:爬取天貓產品價格(逆向工程方法)

Vic時代發表於2017-08-17

天貓上的產品價格請求URL的分析過程和爬京東價格的時候是類似的。
通過分析,得到天貓商品價格的請求URL:’https://mdskip.taobao.com/core/initItemDetail.htm?itemId=556708482118(這個是簡化之後的,可用)。但是這個網頁開啟之後出現403 Forbidden 錯誤。這是因為在傳送請求的時候需要新增Referer引數,其格式為“https://detail.tmall.com/item.htm?id=556708482118”。

程式碼

#-*-coding:utf-8 -*-
import urllib2
import json

def tmall_price(url):
    id = url.split("=")[-1]
    headers = {"Referer": "https://detail.tmall.com/item.htm?id={}".format(id)}
    request = urllib2.Request(url, headers=headers)
    response = urllib2.urlopen(request)
    html = response.read().decode("gbk")
    result = json.loads(html)
    price_info = result["defaultModel"]["itemPriceResultDO"]["priceInfo"]
    print price_info[price_info.keys()[0]]["promotionList"][0]["price"]

if __name__=="__main__":
    url = 'https://mdskip.taobao.com/core/initItemDetail.htm?itemId=556708482118'
    tmall_price(url)

得到的資料有如下形式:

{u'isSuccess': True, 
u'defaultModel': 
    {u'deliveryDO': 
        {u'deliverySkuMap': 
            {u'default': 
                [{u'postage': u'\u5feb\u9012: 0.00 EMS: 0.00 ', u'postageFree': False, u'skuDeliveryAddress': u'\u5e7f\u4e1c\u5e7f\u5dde', u'arrivalNextDay': False, u'type': 0, u'arrivalThisDay': False}]
            }, 
        u'areaId': 330100, 
        u'destination': u'\u676d\u5dde\u5e02', 
        u'success': True, 
        u'deliveryAddress': u'\u5e7f\u4e1c\u5e7f\u5dde'}, 
    u'doubleEleven2014': 
        {u'showRightRecommendedArea': False, u'halfOffItem': False, u'showAtmosphere': False, u'success': True, u'step': 0, u'doubleElevenItem': False}, 
    u'itemPriceResultDO': 
        {u'areaId': 330100, 
        u'extraPromShowRealPrice': False, 
        u'success': True, 
        u'priceInfo': 
            {u'3446150153619': 
                {u'areaSold': True, 
                u'price': u'399.00', 
                u'promotionList': 
                    [{u'status': 2, 
                    u'postageFree': False, 
                    u'canBuyCouponNum': 0, 
                    u'extraPromType': 0, 
                    u'price': u'299.00', 
                    u'tfCartSupport': False, 
                    u'unLogBrandMember': False, 
                    u'promType': u'normal', 
                    u'amountRestriction': u'', 
                    u'amountPromLimit': 0, 
                    u'start': False, 
                    u'unLogTbvip': False, 
                    u'basePriceType': u'IcPrice', 
                    u'extraPromTextType': 0, 
                    u'startTime': 1497959518000L, 
                    u'tmallCartSupport': False, 
                    u'endTime': 1530028740000L, 
                    u'type': u'\u79cb\u88c5\u4e0a\u65b0', 
                    u'unLogShopVip': False, 
                    u'limitProm': False}], 
                u'onlyShowOnePrice': False, 
                u'sortOrder': 0}, 
            u'3446150153611': ...,              
            u'3446150153612': ...,          
            u'3446150153613': ..., 
            ...
        u'tmallShopProm': ...

這裡關注的只有價格資訊,其結構為defaultModel–>itemPriceResultDO–>priceInfo–>3446150153619–>promotionList–>0–>price。

在實際爬取多個產品價格時,還發現另外一種價格資訊結構:
defaultModel–>itemPriceResultDO–>priceInfo–>3446150153619–>price。

但是為什麼有這麼多個價格,3446150153619之類的字串表示什麼??

相關文章