Никита К.
1594 сообщения
#15 лет назад
Блин, сейчас столкнулся со следующей проблемой.

Парсер объявлений с сайта.
Парсер (даже не парсер, а только curl-запрос) возвращает ВСЮ страницу КРОМЕ... объявлений...

Как это понимать?!
Владимир М.
327 сообщений
#15 лет назад
Вероятно объявления формируются как-то особо. AJAX-ом или в iframe подгружаются или ещё что.
Владимир М.
578 сообщений
#15 лет назад
Да уж, так часто бывает )).. в этом то и специфика задач импорта внешнего неподготовленного контента.. адресок сайта скажите.
Никита К.
1594 сообщения
#15 лет назад
Никита К.
1594 сообщения
#15 лет назад
Не iframe точно =)

Самое интересное, что с аналогичного сайта (irr.ru) спарсилось без проблем
Станислав Малкин
1410 сообщений
#15 лет назад
Цитата ("Anexroid"):
Не iframe точно =)

Самое интересное, что с аналогичного сайта (irr.ru) спарсилось без проблем

Если не выбрать регион, то там ничего и нету Скрипт же тоже не передает наверняка данные.
Никита К.
1594 сообщения
#15 лет назад
Передаёт. В cookie.
Станислав Малкин
1410 сообщений
#15 лет назад
Цитата ("Anexroid"):
Передаёт. В cookie.

Видимо не передает, или неправильно передает, если возвращается страница без объявлений.
Владимир М.
578 сообщений
#15 лет назад
Все оч просто )). и дело и вправду в куках.
в броузере выберите очистку всех куков. далее прямо перейдите по искомому урлу .
всплывет затенение с выбором региона. нажмите на клаве ESC - затенение пропадет а на странице вы как раз увидете все так, как и парсится курлом.
--
вывод: идите курлом на заглавную. и далее по всем ссылочкам до искомой, как буд-то человек. все куки сохраняйте в процессе.
Никита К.
1594 сообщения
#15 лет назад
vladmax, спс, но нашел выход проще =) Просто пошел по следующему адресу:

Владимир М.
578 сообщений
#15 лет назад
И помогло?
Никита К.
1594 сообщения
#15 лет назад
vladmax, Да. Сохраняются cookie и редиректит на следующую (ту, которую передашь в параметре) страницу...

Просто когда я просто зашел curl'ом на страницу с регионами, он (скрипт) мне выдал:
Redirecting to:

Я решил попробовать в параметре что нибудь другое передать и...
Владимир М.
578 сообщений
#15 лет назад
Класс
Никита К.
1594 сообщения
#15 лет назад
Блин, я с этим AJAX уже всю голову сломал.

В index.html:
<script>
var xmlHttp = false;

function start(){
//"включаем" картинку загрузки
document.getElementById('progressbar').innerHTML = '<img src="./images/ajax-loader.gif" border="0" alt="Loading, please wait..." />';
//инициализация ajax
try{
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}catch (e){
try{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}catch (e2) {
xmlHttp = false;
}
}
if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {
xmlHttp = new XMLHttpRequest();
}
//открываем страницу parser.php
xmlHttp.open("POST", 'parser.php', true);
//Устанавливаем заголовок - говорим, что это форма
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//задаём функцию-обработчик результата
xmlHttp.onreadystatechange = parseResult;
//отправляем запрос
}

function parseResult(){
xmlHttp.onreadystatechange = function(){
if (xmlHttp.readyState==4){
document.getElementById('progressbar').innerHTML = 'Завершено.<br />'+xmlHttp.responseText;
}
}
}

</script>

.......

<div id="progressbar"></div>
<input type="button" value="Начать" onclick="start()" />


parser.php - собственно сам парсер.
После каждой страницы он сохраняет в файл текущий номер страницы и при повторном запуске продолжает с той страницы, которая записана. +Просто текстом выдаёт "Parsing page complete" и ошибки (в случае возникновения)

Вопрос: Как сделать, чтобы Вот эти "Parsing page..." и ошибки в index.html выдавались "по мере поступления", а не после полного выполнения скрипта?
Никита К.
1594 сообщения
#15 лет назад
И, плюс, допустим в настройках стоит - 10 страниц спарсить надо за один запуск.
Как мне автоматически, через тот же АЯКС, запускать и запускать скрипт пока не спарсится всё?
(exec() в php не предлагать, не работает он =))

Подойдёт ли такой вариант?
function parseResult(){
xmlHttp.onreadystatechange = function(){
if (xmlHttp.readyState==4){
document.getElementById('progressbar'.innerHTML = 'Завершено.<br />'+xmlHttp.responseText;
start; //Я не знаю как правильно запустить функцию start
}
}
}

Оффтопик
Хорошее дело - парсеры. В принципе, ничего сложного, а спросом пользуется =)
Владимир М.
578 сообщений
#15 лет назад
Цитата ("Anexroid"):
: Как сделать, чтобы Вот эти "Parsing page..." и ошибки в index.html выдавались "по мере поступления", а не после полного выполнения скрипта?

хмм... ну во первых сам parser.php должен выдавать по завершении сеанса фразу "Parsing page complete", а во вторых в 32й строке оставьте такое
document.getElementById('progressbar').innerHTML   =   xmlHttp.responseText;


----------------------------------

Цитата ("Anexroid"):
Как мне автоматически, через тот же АЯКС
после 32й строки добавьте запуск функи start() по таймеру..
кстати, когда оно запустится, ваше сообщение о том что мол спарсена такая-то страница будет затерто картинкой. чтобы этого не происходило закоментируйте в коде строку 6.
Владимир М.
578 сообщений
#15 лет назад
Цитата ("Anexroid"):
В принципе, ничего сложного, а спросом пользуется =)
глубоко ошибаетесь.. бывают сложные варианты, особенно в биллинговых системах, в соц сетях. бывает например что никаких GET запросов, даже обычные ссылки <a href''> ссылаются на '#', а нажатие на них обрабатывается каким нибудь doPostBack() (как неапример в кабинете пользователя билайн).. а магазины иногда грешат неоднородностью структуры и вообще специально зашумляют вывод чтоб затруднить составление regexp..
--------------
но по стоимости килограмм кода грабера, простого парсера и например модуля цмски соотностятся думаю как 2.5 : 1.5 : 1
--------------
если вы решили всерьез влиться в нашу маленькую подотрасль главное не демпингуйте сильно.. измеряйте цену примерно как (30 * D) + (15 * N) + (20|40) + (20|40) $, где D - глубина основного цикла в котором происходит внешний запрос (то есть если надо пробежать по ссылкам с 1й страницы некоего ресурса - это D=1 и цена 30, а если нужно перебрать 10 страниц и на каждой по 10 ссылок, и по ним прробежать - то это D=2 и цена 60), N - количество шагов, ведущих к основному циклу (то есть например запрос1 - авторизовались, запрос2 - открыли форму поиска, запрос3 - произвели поиск, запрос4 - отсортировали резалты и перешли к перебору линок и грабу их - соотв N = 4), (20|40) - это доплата за сохранение в файлы и в СУБД соответственно, (20|40) - вторая доплата - соответсвтенно за сохраннеие в формате типа csv и сохраннеие в специфическом формате - напр. шопскрипт)..
-------------- естественно это справделивая цена, конечно приджется и ниже опускать планку - ну главное хотя бы не на порядок, а то некоторые за 10 готовы делать - срывают наш (с группой еще нескольких активистов) картельный сговор )))
Никита К.
1594 сообщения
#15 лет назад
Ок, формулу записал на листочек и приклеил к монитору =)

Пока на WebLancer'е заказы не беру, набиваю портфолио по теме у оффлайновых заказчиков =)
Владимир М.
578 сообщений
#15 лет назад
Цитата ("Anexroid"):
формулу записал на листочек и приклеил к монитору
наизусть, наизусть надо знать, чтоб ночью, в кровати разбудят с фонарем - и спросят - "сколько за грабер категории 4x6 возьмешь" - а вы им не моргнув - "а вот 237$ и коробку хенесси".... )))
Максим Ф.
3195 сообщений
#15 лет назад
А коробка хенесси зачем? Складировать награбленное?