Скупаем цены с сайта willhaben.at с помощью xpath в функции importxml в google-листов

С помощью функции importxml в Google-листах я пытаюсь определить цены на автомобили на этом веб-сайте: https://www.willhaben.at/iad/gebrauchtwagen/auto/gebrauchtwagenboerse?CAR_MODEL%2FMODEL=1230&CAR_MODEL%2FMAKE=1018&sort=3 пробовал например, много вариантов:

1)

// DIV [@ класс ='Информация']/ SPAN [@ класс ='тянуть-право']

Но я никогда не могу получить цены на мой Google-лист. Либо я получаю ошибку или пустой результат. Я начинаю предполагать, что веб-сайт имеет некоторую защиту от снижения цен. Это возможно?

Спасибо за помощь,

1 ответ

Не знаю, стоит ли называть это защитой. Но цены, которые вы хотите извлечь, являются динамическим контентом. Таким образом, вы не можете легко получить к нему доступ с XPath.

Например, цена на первый автомобиль "Honda Jazz 1,3i-VTEC Trend" генерируется по сценарию:

<div id='e4b79dff-ede1-496a-8460-ca22374cf998'>&lt;Platzhalter&gt;</div>
<script>
    var f053143d96c794669bf0a23f42f5486ac = function(value){return base64UTF8Codec.decode(arguments[0])};
    replaceWith(document.getElementById('e4b79dff-ede1-496a-8460-ca22374cf998'), f053143d96c794669bf0a23f42f5486ac('DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InB1bGwtcmlnaHQiPiAxOS45OTAsLSA8L3NwYW4+DQogICAgICAgICAgICA='));
</script>

В скрипте вы можете увидеть значение:

 DQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InB1bGwtcmlnaHQiPiAxOS45OTAsLSA8L3NwYW4+DQogICAgICAgICAgICA=

, которая является строкой в ​​кодировке base64. Если вы расшифруете его, вы получите:

<span class="pull-right"> 19.990,- </span>

, который содержит цену.

Поэтому, если вы хотите узнать цены на автомобили с этого веб-сайта, вам, вероятно, нужно написать скрипт Google Apps.


Пример такого скрипта приложений:

function decodeElement(encoded) {
  var bytes = Utilities.base64Decode(encoded);
  var blob = Utilities.newBlob(bytes);
  return blob.getDataAsString();
}

function extractEncodedElement(scriptStr) {
  var rgx = new RegExp(".*'([^']+)'\\)\\);");
  return rgx.exec(scriptStr)[1];
}

function extractPrice(scriptStr) {
  var encoded = extractEncodedElement(scriptStr);
  var decoded = decodeElement(encoded);
  var xml = XmlService.parse(decoded);
  return xml.getRootElement().getText();
}

function extractPrices(strs) {
  var result = [];
  for (i = 0; i < strs.length; i++) {
    result.push(extractPrice(strs[i]));
  }
  return result;
}

Поэтому после сохранения этого сценария вы можете использовать его в таблице в ячейке:

=extractPrices(IMPORTXML("your_link_here", "//div[@class='info']/script"))

Он вернет вам массив цен. extractPrices перебирает результаты из IMPORTXML и извлекает цену для каждого результата.

Другие вопросы по тегам