Двойной парсинг

Обсуждение серверного программирования.

Модераторы: Duncon, Yurich

viboxjuwin
Сообщения: 34
Зарегистрирован: 29 сен 2013, 22:18

25 дек 2013, 16:50

Я пользуюсь таким кодом для парсинга видимой части контента:
[ATTACH]1896[/ATTACH]
Но он не может вытянуть и контент ссылки "ОТВЕТЫ" на сайт..
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

25 дек 2013, 17:59

Сначала берете весь код страницы, находите ссылки вида [страница].ru/questions/q[тут цифры], потом открываете каждую страницу тем же file_get_contents и оттуда уже выдергиваете отдельно вопрос (начинается на <div id="qcontent" class="question-content__small">, кончается на
</div>) и отдельно ответы (начинаются на <p class="answer__text">, кончаются на </p>).
Кстати, если уж вы взялись за парсинг - рекомендую вам освоить регулярные выражения. Сильно упростите себе жизнь, хотя на первых порах может показаться тяжко.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
viboxjuwin
Сообщения: 34
Зарегистрирован: 29 сен 2013, 22:18

25 дек 2013, 18:03

Спасибо за ответ)
Но мне бы хотелось, чтобы вопросы и ответы автоматически обновлялись на моем сайте..
подскажите, научите. А я уже в обиде не оставлю)
viboxjuwin
Сообщения: 34
Зарегистрирован: 29 сен 2013, 22:18

25 дек 2013, 18:05

Я дергаю код со страницы таким образом..

<?php

//откуда будем парсить информацию
$content = iconv("windows-1251", "UTF-8", file_get_contents('http://www.9111.ru/answers/daily/2013_12_24/'));

// Определяем позицию строки, до которой нужно все отрезать
$pos = strpos($content, '<td class="td_q1 my-questions__cells my-questions__cells-left">');

//Отрезаем все, что идет до нужной нам позиции
$content = substr($content, $pos);

// Точно таким же образом находим позицию конечной строки
$pos = strpos($content, '<form action="http://www.9111.ru/questions/add/?utm_s ... rm#f_q_add" method="post">');

// Отрезаем нужное количество символов от нулевого
$content = substr($content, 0, $pos);

//если в тексте встречается текст, который нам не нужен, вырезаем его
$content = str_replace('','', $content);

// выводим спарсенный текст.
echo ($content);

//echo "вставляем сюда завершающий код";
?>
viboxjuwin
Сообщения: 34
Зарегистрирован: 29 сен 2013, 22:18

25 дек 2013, 18:06

Я дергаю код со страницы таким образом...

//откуда будем парсить информацию
$content = iconv("windows-1251", "UTF-8", file_get_contents('http://www.9111.ru/answers/daily/2013_12_24/'));

// Определяем позицию строки, до которой нужно все отрезать
$pos = strpos($content, '<td class="td_q1 my-questions__cells my-questions__cells-left">');

//Отрезаем все, что идет до нужной нам позиции
$content = substr($content, $pos);

// Точно таким же образом находим позицию конечной строки
$pos = strpos($content, '<form action="http://www.9111.ru/questions/add/?utm_s ... rm#f_q_add" method="post">');

// Отрезаем нужное количество символов от нулевого
$content = substr($content, 0, $pos);

//если в тексте встречается текст, который нам не нужен, вырезаем его
$content = str_replace('','', $content);

// выводим спарсенный текст.
echo ($content);

//echo "вставляем сюда завершающий код";
viboxjuwin
Сообщения: 34
Зарегистрирован: 29 сен 2013, 22:18

25 дек 2013, 18:45

Я попробовал проработать ситуацию таким образом:

//откуда будем парсить информацию
$content = iconv("windows-1251", "UTF-8", file_get_contents('http://www.9111.ru/questions/q3121782-i ... redit.html'));

// Определяем позицию строки, до которой нужно все отрезать
$pos = strpos($content, '<div id="qcontent" class="question-content__small">');

//Отрезаем все, что идет до нужной нам позиции
$content = substr($content, $pos);

// Точно таким же образом находим позицию конечной строки
$pos = strpos($content, '
</div>');

// Отрезаем нужное количество символов от нулевого
$content = substr($content, 0, $pos);

//если в тексте встречается текст, который нам не нужен, вырезаем его
$content = str_replace('','', $content);

// выводим спарсенный текст.
echo ($content);

//echo "вставляем сюда завершающий код";



//откуда будем парсить информацию
$content = iconv("windows-1251", "UTF-8", file_get_contents('http://www.9111.ru/questions/q3121782-i ... redit.html'));

// Определяем позицию строки, до которой нужно все отрезать
$pos = strpos($content, '<p class="answer__text">');

//Отрезаем все, что идет до нужной нам позиции
$content = substr($content, $pos);

// Точно таким же образом находим позицию конечной строки
$pos = strpos($content, '</p>');

// Отрезаем нужное количество символов от нулевого
$content = substr($content, 0, $pos);

//если в тексте встречается текст, который нам не нужен, вырезаем его
$content = str_replace('','', $content);

// выводим спарсенный текст.
echo ($content);

//echo "вставляем сюда завершающий код";



Где красным - вопрос, синим - ответ. Все отображается, конечно, на моем сайте. Но как мне автоматизировать обновление этого самого контента?
Как-то уникализировать ссылки? Качать блоком?
Ссылка на тот самый сайт: http://www.9111.ru/answers/daily/2013_12_24/
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

26 дек 2013, 13:02

Автоматически обновлялись - это тот еще квест. Предложенный мной способ не дает сбоев, но медленный. При каждом обновлении страницы лезть на чужой сайт и там 100500 страниц парсить - это умереть можно (а еще вполне возможно, что там вас просто забанят). Поэтому вы одним скриптом делаете парсинг данных с чужого сайта, а другим этот скрипт запускаете. Например, по крону раз в час. Не думаю, что там собраны такие важно-срочные вопросы, что отставание на час будет играть какую-то роль.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
viboxjuwin
Сообщения: 34
Зарегистрирован: 29 сен 2013, 22:18

26 дек 2013, 16:44

Можете приложить пример такого скрипта. А я отдам взамен, что попросите..
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

30 дек 2013, 11:52

Да все просто, в вашем коде вместо echo $content поставьте, например, file_put_contents('content.txt', $content), а на странице, куда надо выводить эти вопросы с ответами поставьте echo file_get_contents('content.txt'). Это в случае, если вы контент храните в файле, тогда еще надо поставить права 0666 на этот файл,чтобы PHP мог записывать в него.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Ответить