[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: curl + json
ilma55
Всем привет.
у меня задача распарсить один магазин.
ничего незаконного нет.
магазин оборяет реселлеров.
и дает файл с ценами и кодами.
а другую инфу мне придется самому вытаскивать.

вот тут вот и загвоздка

но все по порядку.

1. сперва я авторизируюсь.
2. далее захожу на определенную страницу, как авторизированный и в переменную $result я получаю код запрашиваемой страницы ( $result = curl_exec($ch); )
3. теперь мне нужно вытащить ту часть инфы, которая передается динамически.

я посмотрел код, который принимает $result
там я нахожу jquery код

$.ajax({ type: "GET"
, cache: false
, contentTypeString: "application/json"
, url: 'https://www.site.com/etilizeServices/EtilDataService.svc//ProductAccessories?$format=json &$filter=productid eq 10180 and localeid eq 1& $orderby=categoryid'
, success: cbRenderOptionsAccessories
, dataType: "json"
, error: cbFailedOptionsAccessories
});

вопрос: как мне получить данные, которые возврящаются на страницу json'ом ???

https://www.site.com/etilizeServices/EtilDataService.svc//ProductAccessories?$format=json& amp;$filter=productid eq 10180 and localeid eq 1& $orderby=categoryid




Спустя 6 часов, 58 минут, 13 секунд (20.04.2012 - 21:06) walerus написал(а):
Цитата
я посмотрел код, который принимает $result
там я нахожу jquery код
смутно верится что там только аякс запрос.
И непонятно, что нужно вытащить?

Спустя 18 часов, 30 минут, 37 секунд (21.04.2012 - 15:37) amqpuTamuH4uk написал(а):
как вариант, попробуй file_get_contents($ajax_url)
посмотри что возвращает, если и есть json пробуй json_decode (правда он с win-1251 ооочень не дружит, если там 1251 то iconv() тебе в помощь) если что то иное парсь сам

Спустя 2 дня, 19 часов, 44 минуты, 34 секунды (24.04.2012 - 11:21) ilma55 написал(а):
Цитата (walerus @ 20.04.2012 - 19:06)
Цитата
я посмотрел код, который принимает $result
там я нахожу jquery код
смутно верится что там только аякс запрос.
И непонятно, что нужно вытащить?

вот нужно вытащить json


просто мне возвращается, как ошибка, а не данные.

я так понял, что мне надо как-то получить эту json-строку/
а как мне ее вытащить от сюда?

$.ajax({ type: "GET"
, cache: false
, contentTypeString: "application/json"
, url: 'https://www.site.com/etilizeServices/EtilDataService.svc//ProductAccessories?$format=json &$filter=productid eq 10180 and localeid eq 1& $orderby=categoryid'
, success: cbRenderOptionsAccessories
, dataType: "json"
, error: cbFailedOptionsAccessories
});

Спустя 3 минуты, 12 секунд (24.04.2012 - 11:25) ilma55 написал(а):
Цитата (amqpuTamuH4uk @ 21.04.2012 - 13:37)
как вариант, попробуй file_get_contents($ajax_url)
посмотри что возвращает, если и есть json пробуй json_decode (правда он с win-1251 ооочень не дружит, если там 1251 то iconv() тебе в помощь) если что то иное парсь сам

file_get_contents($ajax_url), я так понял что $ajax_url - это и есть эта ссылка?!

я подставлял $ajax_url в json_decode и он мне выводил весь это непонятный текст.

загвоздка в том, как мне получтть эту строку-url отдельно?
и как узнать количество объектов, которое возвращает json&?

Спустя 12 часов, 43 минуты, 41 секунда (25.04.2012 - 00:08) walerus написал(а):
preg_match( '~url:\s?\'(.*)\'~', $result, $url_match );
print_r($url_match); // Покажет что нашлось
$url = trim($url_match[1]); // твой урл
echo 'Find URL - ' . $url;

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

Спустя 10 часов, 44 минуты, 56 секунд (25.04.2012 - 10:53) ilma55 написал(а):
Цитата (walerus @ 24.04.2012 - 22:08)
preg_match( '~url:\s?\'(.*)\'~', $result, $url_match );
print_r($url_match); // Покажет что нашлось
$url = trim($url_match[1]); // твой урл
echo 'Find URL - ' . $url;

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

привет.

я открыл и посмотрел полученный html код.

в самом конце файл идет javascript код

$.ajax({ type: "GET"
, cache: false
, contentTypeString: "application/json"
, url: 'https://www.site.com/etilizeServices/EtilDataService.svc//ProductAccessories?$format=json &$filter=productid eq 10180 and localeid eq 1& $orderby=categoryid'
, success: cbRenderOptionsAccessories
, dataType: "json"
, error: cbFailedOptionsAccessories
});


через firebug я так же заметил, что посылается эта ссылка.

попробовал пройти по ней (вставив ее в браузере) и она мне возвращает файл( то есть мне предлагается сохранить его)

сохранив и открыв его я вижу ооооооочень не понятный код (json)


я пошел дальше исследовать html код и обнаружил тот js , который обрабатывает json код




function cbRenderOptionsAccessories(result) {
var current_cat_id = -1;
var array = [];
array.push("<table>");

if (result.d.results.length > 0) {
$.each(result.d.results, function (i, item) {
if (item["categoryid"] != current_cat_id) {
if (0 != current_cat_id) {
array.push("<tr><td colspan='2'>");
array.push("<b><u>");
array.push(item["CategoryName"]);
array.push("</u></b>");
array.push("</td>");

current_cat_id = item["categoryid"];
}
}


array.push("<tr>");
array.push("<td><a href='product.aspx?partno=");
array.push(jQuery.trim(item["suppartno"]));
array.push("' target='parent'>");
array.push("<img border='0' src='https://site.com/images/30/30/");
array.push(item["accessoryproductid"]);
array.push(".jpg' /></a>");
array.push("</td>");
array.push("<td>");
array.push(item["description"]);
array.push("...");
array.push("</td>");
array.push("</tr>");
});

array.push("<tr>");
array.push("<td colspan='2'>");
array.push("<a id='nextResult'> more </a>");
array.push("</td>");
array.push("</tr>");
array.push("</table>");
$('#ctl00_ctl00_cph1_cph1_ctl00_ctrlProductInfo_optionAccessoriesView').html(array.join(""));
}
else
$("#ctl00_ctl00_cph1_cph1_ctl00_ctrlProductInfo_optionAccessoriesView").html("No options and accessories were found for this product.");

var moreResultsUrl = result.d.__next;
if (moreResultsUrl) {
$("#nextResult").click(function () {
$.ajax({ type: "GET"
, cache: false
, contentTypeString: "application/json"
, url: moreResultsUrl
, success: cbRenderOptionsAccessories
, dataType: "json"
, error: cbFailedOptionsAccessories
});
});
}
else
$("#nextResult").html("");
}

function cbFailedOptionsAccessories(error, context, entitySet) {
$("#ctl00_ctl00_cph1_cph1_ctl00_ctrlProductInfo_optionAccessoriesView").html("Error occurred while retrieving options and accessories.");
}

function cbRenderSpecifications(result, context, operation, userContext) {
var current_header_id = 0;
var array = [];
if (result.d.results.length > 0) {
$.each(result.d.results, function (i, item) {
if (item["headerid"] != current_header_id) {
if (0 != current_header_id)
array.push("</ul>");

array.push("<b>");
array.push(item["header_name"]);
array.push("</b>");
array.push("<hr />");
current_header_id = item["headerid"];
array.push("<ul>");
}

array.push("<ul>");
array.push(item["attribute_name"]);
array.push(" : ");
array.push(item["displayvalue"]);
array.push("</ul>");

});
array.push("</table>");
$("#ctl00_ctl00_cph1_cph1_ctl00_ctrlProductInfo_specsView").html(array.join(""));
}
else {
$("#ctl00_ctl00_cph1_cph1_ctl00_ctrlProductInfo_specsView").html("No specs found for this product");
}
}


function cbFailedSpecifications(error, context, entitySet) {
$("#ctl00_ctl00_cph1_cph1_ctl00_ctrlProductInfo_specsView").html("Error occurred while retrieving product specifications. You may need to refresh this page.");
}


и главное то что - он выводит мне строки с ошибкой.
то есть мне отображается Error occurred while retrieving product specifications. You may need to refresh this page
а вот описание нет

Спустя 2 часа, 28 минут, 43 секунды (25.04.2012 - 13:22) walerus написал(а):
Цитата
https://www.site.com/etilizeServices/EtilDataService.svc//ProductAccessories?$format=json  &$filter=productid eq 10180 and localeid eq 1& $orderby=categoryid

1) Протокол https - просто так от туда не вытащишь информацию, нужно быть залогиненым и скорее всего будет кука повешена, так что file_get_content() - не катит.
2) Ты ссылку редактируешь специально что бы хост не палить? Я про (www.site.com) или она такая там и есть?
3) Ты пробелы видишь ( $format=json & ) ? между json и амперсандом ?
4) $format - это по моему переменная и она должна чему то равняться (мб ошибаюсь)

Цитата
сохранив и открыв его я вижу ооооооочень не понятный код (json)
какой код? где его содержание, я думаю там будет выборка данных из базы скорее всего (объект/массив).

Очень много непонятного, ты как то все рассказываешь кусками, не понятно ничего.

Спустя 16 минут, 37 секунд (25.04.2012 - 13:39) ilma55 написал(а):
здравствуй.
спасибо за отзыв.
спрошу сперва: а что нужно тебе знать, чтоб смог помочь мне?

хост: www.supercom.ca

**********
вставив в браузере

https://www.site.com/etilizeServices/EtilDataService.svc//ProductAccessories?$format=json  &$filter=productid eq 10180 and localeid eq 1& $orderby=categoryid


мне возвращается код в json формате. потом я его уже могу обработать.

но фишка в том, что я не знаю как мне получить этот код в скрипте, когда я логинюсь и захожу на страницу продукта методом CURL ??

спасибо так же за регулярное выражение.
а как его подстроить, если у меня встречается несколько раз такой URL ???


то есть


$(document).ready(function GetSimilarProductsInfo() {

$.ajax({ type: "GET"
, cache: true
, contentTypeString: "application/json"
, url: 'https://www.site.com/etilizeServices/EtilizeDataService.svc//SimilarProducts?$format=json &$filter=productid eq 1018066539 and localeid eq 1'
, success: cbRenderSimilarProducts
, dataType: "json"
, error: cbFailedSimilarProducts
});

$.ajax({ type: "GET"
, cache: false
, contentTypeString: "application/json"
, url: 'https://www.site.com/etilizeServices/EtilizeDataService.svc//ProductAccessories?$format=j son&$filter=productid eq 1018066539 and localeid eq 1& $orderby=categoryid'
, success: cbRenderOptionsAccessories
, dataType: "json"
, error: cbFailedOptionsAccessories
});


$.ajax({ type: "GET"
, cache: true
, contentTypeString: "application/json"
, url: 'https://www.site.com/etilizeServices/EtilizeDataService.svc//ProductSpecifications?$forma t=json&$filter=productid eq 1018066539 and localeid eq 1 & $orderby=headerid'
, success: cbRenderSpecifications
, dataType: "json"
, error: cbFailedSpecifications
});
});


Спустя 2 часа, 3 минуты, 9 секунд (25.04.2012 - 15:42) ilma55 написал(а):
вытащил эти ссылки так

preg_match_all( '~url:\s?\'(.*)\'~', $result, $url_match );
$urlAccessories = trim($url_match[0][1]); // твой урл
$urlProdSpec = trim($url_match[0][2]); // твой урл


спасибо за регулярку

Спустя 5 часов, 9 минут, 42 секунды (25.04.2012 - 20:51) walerus написал(а):
ilma55 - я не понял, ты решил проблему или нет ? ))

Спустя 12 часов, 33 минуты, 6 секунд (26.04.2012 - 09:25) ilma55 написал(а):
проблему не решил.
но по кусочкам все есть.

теперь все во едино осталось собрать.

и в БД записывать.

вот чтоб меня не забанили как злостного бота, как мне лучше поступить?

sleep(30) нормально будет?

Спустя 1 час, 45 минут, 27 секунд (26.04.2012 - 11:10) ancient mariner написал(а):
Цитата (ilma55 @ 26.04.2012 - 07:25)
sleep(30) нормально будет?

Зависит от конкретного сайта, но 30 всё-таки многовато, поставьте 3. Ну и max_execution_time тогда лучше увеличить.

Спустя 4 часа, 24 минуты, 13 секунд (26.04.2012 - 15:34) walerus написал(а):
+ ко всему - меняй броузеры, подставляй разные IP( если это возможно ), разные рефералы подставляй тоже, все меньше палева будет )

Спустя 20 минут, 57 секунд (26.04.2012 - 15:55) ilma55 написал(а):
а что делать в слечае если страница не найдена?

то есть я начал перебор страниц, но одна страница отсутствует.
как мне пропустить ее и парсить следующую страницу?

Спустя 3 часа, 23 минуты, 18 секунд (26.04.2012 - 19:18) walerus написал(а):
ilma55 - оно же как то сообщает что страница не найдена? - вот и определяй, если страница не найдена то пропускай и продолжай дальше. Как это сделать - смотря какой цикл у тебя? while, foreach или еще что...

Спустя 22 минуты, 8 секунд (26.04.2012 - 19:41) ilma55 написал(а):
да не.
реально сглупил я.

просто 2 недели мудахаюсь с этим парсингом.

я просто проверку сделал
if result > 200 то все ок =)
иначе next


_____________
Программист – это не деятельность, это иной образ жизни!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.