Скупаем цены с сайта 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'><Platzhalter></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
и извлекает цену для каждого результата.