За последние 24 часа нас посетили 61953 программиста и 1677 роботов. Сейчас ищут 865 программистов ...

Парсинг ems с taobao.com

Тема в разделе "Прочие вопросы по PHP", создана пользователем hugi, 27 июл 2010.

  1. hugi

    hugi Активный пользователь

    С нами с:
    24 авг 2007
    Сообщения:
    30
    Симпатии:
    0
    Необходимо вытащить поле ems(стоимость доставки почтой).

    Примеры страниц.
    http://item.taobao.com/item.htm?id=2707659755
    http://item.taobao.com/item.htm?id=5247635387
    http://item.taobao.com/item.htm?id=5248514025

    Вот собственно как это выглядит в html коде.
    <em id="J_PostageList">快递: 12.0元 EMS: 50.0元</em>

    Проблема в том что данная информация вставляется javascriptoм после прогрузки страницы, т.е. когда я пытаюсь вытащить html код с помощью curl или file_get_contents, то там нет нужной строки.

    У кого какие есть идеи.
    Либо как-то попытаться вывести формулу. EMS рассчитывается за счет веса, но для товаров нет веса на страничке.
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Ну дак разбери, как именно подставляется.
    Плагины по отладке тебе в помощь. Когда разберешься, то из скрипта напрямую обращайся.
    Я не буду разбираться с тем, как и что там происходит, мне просто в лом, и так японский уже видеть не могу.
    Так что дерзай.
    Ватари маста ка?
     
  3. hugi

    hugi Активный пользователь

    С нами с:
    24 авг 2007
    Сообщения:
    30
    Симпатии:
    0
    Бог в помощь, я уже этот код анализировал. Это только часть отвечающая за нужный элемент, могу выдать весь код.

    Это проблема сложная, для тех кому интересно подумать, а не отвечать на вопросы нубов.

    [js]TB.Detail.PostageFee = function () {
    var ORDINARY = "1",
    FAST = "2",
    EMS = "7",
    CORPFAST = "4",
    POSTFAST = "5";
    var MODE_ARRAY = [ORDINARY, EMS, CORPFAST, POSTFAST];
    var MODENAME_MAP = {};
    MODENAME_MAP[ORDINARY] = "\u5e73\u90ae";
    MODENAME_MAP[CORPFAST] = "\u5feb\u9012\u516c\u53f8";
    MODENAME_MAP[POSTFAST] = "\u90ae\u653f\u5feb\u9012";
    MODENAME_MAP[EMS] = "EMS";
    var NATIONWIDE_CODE = "1";
    var DEST_MAP = {
    "1": "\u5168\u56fd",
    "110000": "\u5317\u4eac",
    "120000": "\u5929\u6d25",
    "130000": "\u6cb3\u5317",
    "140000": "\u5c71\u897f",
    "150000": "\u5185\u8499\u53e4",
    "210000": "\u8fbd\u5b81",
    "220000": "\u5409\u6797",
    "230000": "\u9ed1\u9f99\u6c5f",
    "310000": "\u4e0a\u6d77",
    "320000": "\u6c5f\u82cf",
    "330000": "\u6d59\u6c5f",
    "340000": "\u5b89\u5fbd",
    "350000": "\u798f\u5efa",
    "360000": "\u6c5f\u897f",
    "370000": "\u5c71\u4e1c",
    "410000": "\u6cb3\u5357",
    "420000": "\u6e56\u5317",
    "430000": "\u6e56\u5357",
    "440000": "\u5e7f\u4e1c",
    "450000": "\u5e7f\u897f",
    "460000": "\u6d77\u5357",
    "500000": "\u91cd\u5e86",
    "510000": "\u56db\u5ddd",
    "520000": "\u8d35\u5dde",
    "530000": "\u4e91\u5357",
    "540000": "\u897f\u85cf",
    "610000": "\u9655\u897f",
    "620000": "\u7518\u8083",
    "630000": "\u9752\u6d77",
    "640000": "\u5b81\u590f",
    "650000": "\u65b0\u7586",
    "710000": "\u53f0\u6e7e",
    "810000": "\u9999\u6e2f",
    "820000": "\u6fb3\u95e8",
    "990000": "\u6d77\u5916"
    };
    var DEST_MAP_UTF8 = {
    "1": "\u5168\u570b",
    "110000": "\u5317\u4eac",
    "120000": "\u5929\u6d25",
    "130000": "\u6cb3\u5317",
    "140000": "\u5c71\u897f",
    "150000": "\u5167\u8499\u53e4",
    "210000": "\u907c\u5be7",
    "220000": "\u5409\u6797",
    "230000": "\u9ed1\u9f8d\u6c5f",
    "310000": "\u4e0a\u6d77",
    "320000": "\u6c5f\u8607",
    "330000": "\u6d59\u6c5f",
    "340000": "\u5b89\u5fbd",
    "350000": "\u798f\u5efa",
    "360000": "\u6c5f\u897f",
    "370000": "\u5c71\u6771",
    "410000": "\u6cb3\u5357",
    "420000": "\u6e56\u5317",
    "430000": "\u6e56\u5357",
    "440000": "\u5ee3\u6771",
    "450000": "\u5ee3\u897f",
    "460000": "\u6d77\u5357",
    "500000": "\u91cd\u6176",
    "510000": "\u56db\u5ddd",
    "520000": "\u8cb4\u5dde",
    "530000": "\u96f2\u5357",
    "540000": "\u897f\u85cf",
    "610000": "\u965d\u897f",
    "620000": "\u7518\u8085",
    "630000": "\u9752\u6d77",
    "640000": "\u5be7\u590f",
    "650000": "\u65b0\u7586",
    "710000": "\u53f0\u7063",
    "810000": "\u9999\u6e2f",
    "820000": "\u6fb3\u9580",
    "990000": "\u6d77\u5916"
    };
    var postageContId = "J_PostageCont";
    var postageToggleID = "J_PostageToggle";
    var postageListID = "J_PostageList";
    var postageTableContID = "J_PostageTableCont";
    var destPanelID = "J_DestPanel";
    var isUTF8 = (document.charset || document.characterSet).toLowerCase().indexOf("utf-8") != -1;
    var getDestNameByCode = (function () {
    if (isUTF8) {
    return function (destCode) {
    return DEST_MAP_UTF8[destCode] || ""
    }
    } else {
    return function (destCode) {
    return DEST_MAP[destCode] || ""
    }
    }
    })();
    var itemSorter = function (i, i2) {
    if (i.mode == i2.mode) {
    return (i.dest == NATIONWIDE_CODE) ? 1 : -1
    } else {
    return i.mode - i2.mode
    }
    };
    return {
    _items: [],
    _itemMap: {},
    _memo: "",
    _addItem: function (arr) {
    var item = {
    id: arr[0],
    mode: arr[1],
    dest: arr[2],
    fee: arr[3],
    addon: arr[4]
    };
    this._items.push(item);
    if (!this._itemMap[item.mode]) {
    this._itemMap[item.mode] = [item]
    } else {
    this._itemMap[item.mode].push(item)
    }
    },
    _getItemsByDestCode: function (destCode) {
    var items = [];
    for (mode in this._itemMap) {
    if (this._itemMap[mode].length === 1) {
    items.push(this._itemMap[mode][0])
    } else {
    if (this._itemMap[mode].length > 1) {
    var matchItem, tmpItem;
    for (var i = 0, n = this._itemMap[mode].length; i < n; ++i) {
    tmpItem = this._itemMap[mode];
    if (tmpItem.dest.indexOf(destCode) != -1) {
    matchItem = tmpItem;
    break
    } else {
    if (tmpItem.dest == NATIONWIDE_CODE) {
    matchItem = tmpItem
    }
    }
    }
    if (matchItem) {
    items.push(matchItem)
    }
    }
    }
    }
    return items
    },
    _getDestNameByCode: function (destCodes) {
    if (!destCodes) {
    return ""
    }
    var destCodes = destCodes.split(",");
    var destNames = Array.map(destCodes, function (code) {
    return getDestNameByCode(code)
    }).join(",");
    return destNames
    },
    _getFeesByDestCode: function (destCode) {
    var matchItems = this._getItemsByDestCode(destCode);
    var fees = {};
    Array.forEach(matchItems, function (item) {
    Array.forEach(MODE_ARRAY, function (mode) {
    if (mode == item.mode) {
    fees[mode] = item.fee
    }
    })
    });
    if (fees[CORPFAST] && fees[POSTFAST]) {
    fees[FAST] = Math.min(fees[CORPFAST], fees[POSTFAST])
    } else {
    fees[FAST] = fees[CORPFAST]
    }
    return fees
    },
    _updatePostfeesByDest: function (destCode, destName) {
    YUD.get(postageToggleID).innerHTML = destName;
    var fees = this._getFeesByDestCode(destCode);
    var feesHtml = fees[ORDINARY] ? "\u5e73\u90ae: " + fees[ORDINARY] + "\u5143\u3000" : "";feesHtml += fees[FAST] ? "\u5feb\u9012: " + fees[FAST] + "\u5143\u3000" : "";feesHtml += fees[EMS] ? "EMS: " + fees[EMS] + "\u5143" : "";YUD.get(postageListID).innerHTML = feesHtml;YUE.onAvailable(postageTableContID, function () {
    this._updatePostfeesTableByDestCode(destCode)
    }, this, true)
    },
    _updatePostfeesTableByDestCode: function (destCode) {
    var rowTemplate = '<tr><td>{modeName}</td><td>{fee}\u5143</td><td>{addon}\u5143</td><td class="cell-express-region">{destName}</td></tr>';
    var matchItems, getDestName;
    var that = this;
    if (NATIONWIDE_CODE == destCode) {
    matchItems = Array.copy(this._items).sort(itemSorter);
    getDestName = function (destCode, item) {
    if (item.dest == NATIONWIDE_CODE) {
    return that._itemMap[item.mode].length > 1 ? "\u5176\u4ed6\u5730\u533a" : "\u5168\u56fd"
    } else {
    return that._getDestNameByCode(item.dest)
    }
    }
    } else {
    matchItems = this._getItemsByDestCode(destCode).sort(itemSorter);
    getDestName = function (destCode) {
    return that._getDestNameByCode(destCode)
    }
    }
    var rowHtmlArr = Array.map(matchItems, function (item) {
    item = YL.merge(item, {
    modeName: MODENAME_MAP[item.mode],
    fee: Number(item.fee).toFixed(1),
    destName: getDestName(destCode, item)
    });
    return YL.substitute(rowTemplate, item)
    });
    var tmpNode = document.createElement("div");
    tmpNode.innerHTML = '<table border="0" cellspacing="1" cellpadding="0"><colgroup><col class="col-express-trans"/><col class="col-express-agency"/><col class="col-express-agency"/><col class="col-express-region"/></colgroup><thead><tr><th>\u8fd0\u9001\u65b9\u5f0f</th><th>\u9996\u4ef6\u8fd0\u8d39</th><th>\u52a0\u4ef6\u8fd0\u8d39</th><th class="cell-express-region">\u8fd0\u9001\u5230</th></tr></thead><tbody>' + rowHtmlArr.join("") + "</tbody></table>";
    var table = YUD.get(postageTableContID).getElementsByTagName("table")[0];
    if (table) {
    table.parentNode.replaceChild(tmpNode.firstChild, table)
    } else {
    YUD.get(postageTableContID).appendChild(tmpNode.firstChild)
    }
    },
    _initDestPanel: function () {
    var panelEl = document.createElement("div");
    panelEl.id = destPanelID;
    panelEl.className = "lst-express-region shadow";
    var destMap = isUTF8 ? DEST_MAP_UTF8 : DEST_MAP;
    var destUlEl = document.createElement("ul"),
    liEl;
    for (var code in destMap) {
    var destName = (code == NATIONWIDE_CODE) ? "<strong>\u5168\u90e8</strong>" : destMap
    Код (Text):
    1. ;destUlEl.appendChild(document.createElement("li")).innerHTML = '<a href="#' + (code == NATIONWIDE_CODE ? postageTableContID : "") + '" data-code="' + code + '">' + destName + "</a>"
    2.                 }
    3.                 panelEl.appendChild(destUlEl);YUD.insertBefore(panelEl, document.body.firstChild);YUE.on(destUlEl, "click", function (ev) {
    4.                     YUE.stopEvent(ev);
    5.                     var target = YUE.getTarget(ev);
    6.                     while (target.tagName.toLowerCase() != "a" && target.tagName.toLowerCase() != "li") {
    7.                         target = target.parentNode
    8.                     }
    9.                     if ("a" != target.tagName.toLowerCase()) {
    10.                         return
    11.                     }
    12.                     var code = target.getAttribute("data-code");
    13.                     if (code) {
    14.                         var destName = (code == NATIONWIDE_CODE) ? destMap[code] : target.innerHTML;this._updatePostfeesByDest(code, destName)
    15.                     }
    16.                     YUD.get(destPanelID).style.display = "none";
    17.                     if (code == NATIONWIDE_CODE && YUD.get(postageTableContID)) {
    18.                         YUD.get(postageTableContID).parentNode.scrollIntoView(true)
    19.                     }
    20.                 }, this, true);
    21.                 return panelEl
    22.             },
    23.             init: function () {
    24.                 var cfg = TB.Detail.Setup.getConfig();
    25.                 if ("undefined" === typeof cfg) {
    26.                     return false
    27.                 }
    28.                 var config = cfg.valPostFee;
    29.                 if (!config || !config.currDest) {
    30.                     return false
    31.                 }
    32.                 if (YL.isArray(config.items)) {
    33.                     Array.forEach(config.items, function (item) {
    34.                         this._addItem(item)
    35.                     }, this)
    36.                 }
    37.                 var destName = this._getDestNameByCode(config.currDest);
    38.                 var contHtml = '<span>\u81f3<a href="#" class="postage-toggle" id="' + postageToggleID + '"></a>\uff1a</span>';
    39.                 contHtml += '<em id="' + postageListID + '"></em>';
    40.                 YUD.get(postageContId).innerHTML = contHtml;
    41.                 this._updatePostfeesByDest(config.currDest, destName);
    42.                 var toggle = YUD.get(postageToggleID);
    43.                 var panel = this._initDestPanel();
    44.                 TB.widget.SimplePopup.decorate(toggle, panel, {
    45.                     width: panel.scrollWidth,
    46.                     height: panel.scrollHeight,
    47.                     offset: [-36, 16],
    48.                     position: "right",
    49.                     disableClick: true
    50.                 });
    51.                 YUE.onAvailable(postageTableContID, function () {
    52.                     var tableContEl = YUD.get(postageTableContID);
    53.                     var toggle2Cont = document.createElement("ins");
    54.                     toggle2Cont.innerHTML = '<a href="#" class="postage-toggle">\u9009\u62e9\u5730\u533a</a>';
    55.                     tableContEl.appendChild(toggle2Cont);
    56.                     TB.widget.SimplePopup.decorate(toggle2Cont.getElementsByTagName("a")[0], panel, {
    57.                         width: panel.scrollWidth,
    58.                         height: panel.scrollHeight,
    59.                         offset: [-60, 16],
    60.                         position: "right",
    61.                         disableClick: true
    62.                     });
    63.                     if (config.memo) {
    64.                         var memoEl = document.createElement("p");
    65.                         memoEl.innerHTML = "\u8fd0\u8d39\u8bf4\u660e\uff1a" + config.memo;
    66.                         YUD.addClass(memoEl, "postage-memo");
    67.                         tableContEl.appendChild(memoEl)
    68.                     }
    69.                 })
    70.             }
    71.         }
    72.     }();[/js]
     
  4. begunok

    begunok Активный пользователь

    С нами с:
    19 ноя 2012
    Сообщения:
    9
    Симпатии:
    0
    И сейчас работает? что такое TB.Detail.PostageFee?