Про парсеры подробнее...

Статус
В этой теме нельзя размещать новые ответы.

GROB

Гуру форума
Регистрация
28 Мар 2006
Сообщения
177
Реакции
76
С парсингом особых дел не имел, но тут решил автоматизировать работу.. поэтому хочу написать скрипт на PHP копирования(сдирания) новостей.
На сайте как обычно краткая новость на фэйсе и ссылка на подробную.
Алгоритм, на сколько я понимаю такой:
1. Через курл берем страницу.
2. Выдираем все ссылки на новости, заголовок ее и краткий текст.
3. Закачиваем каждую страницу, и выдираем только сам текст новости.

Допустим с 1 - все просто, но пункт 2, это все можно написать на регулярных выражениях, даже если двиг самописный?

Кто нибудь может пояснить хотя бы как это вообще?

А с rss так же через регулярные выражения? Если я хочу не только краткую но и полну новость себе на сайт.
 
Кто нибудь может пояснить хотя бы как это вообще?
Я смотрю в дриме, как устроена страница. Потом в коде пропускаю ненужные теги, чтоб добраться до нужного блока - например, в 3-ем диве по счету вложено еще 2, а там инфа. И парсю потом до закрытия этого дива. Универсальных решений не знаю.
А с rss так же через регулярные выражения? Если я хочу не только краткую но и полну новость себе на сайт.
RSS - это XML. Есть готовые решения для парсинга XML
 
В целом логика рассуждений у тебя правильная, но хочу дать рекомендацию. Нужно парсер делать таким образом, чтобы по какомуто критерию, скорее всего домену, вызывались разные парсеры. так как написать даже универсальную выдиралку урлов не так просто, а уж универсальное выдиранее новостей - тем более.
В качестве примера привожу код наипростейшего парсера уролов, но во многих случаях он будет достаточен. Предупреждаю сразу применимость его к конкретному сайту нужно проверять, так например на этой сайте он найдет
PHP:
$fh = fopen('store.htm','r');
while ($string = fgets($fh,8192))
{
    if (preg_match("/(http:\/\/(:?[^\"]*))/i",$string,$match))
    {
        var_dump($match[1]);
    }
}
fclose($fh);
Про вытаскивание линков с RSS можно почитать здесь

p.s. Более корректный regexp для парсинга урлов можно посмотреть в любой CMSке.
p.p.s. Могу порекомендовать хорошую книгу по RegExp Mastering Regular Expressions
 
Есть отличная инфа на русском
Для просмотра ссылки Войди или Зарегистрируйся- впринципе там вроде перевод раздела регулярках английского мана по PHP + там и примерчики есть =)
Рсс тоже можно парсить регулярками. работает достаточно быстро.


А от самописности двига 2 и 3 пункт не зависят особо - просто немножко может зависеть сама реализация алгоритма - классы или функции ... но это друг на друга легко переклаывается.
свое всегда можно впихнуть. а без регулярок никуда не деться в парсинге =)
 
Ссылки можно брать из RSS. А вот что делать с изображениями? Хотелось бы скачать, именить. Может у кого есть куски рабочего кода?
Не хочется изобретать велосипед.
 
Регулярки в парсинге - лучше использовать совсем по минимуму. Ибо напрягают они проц/память конкретнейшим образом... Недавно оптимизировал свой парсер форм, и, получилось его ускорить в среднем в 10 раз(!!) сведя использование регулярок к минимуму... было 0.9с на парсинг конкретно огромной формы, стало 0.09с.. так что - регулярки совсем не панацея.
ПС. вот регулярка, отлично вытаскивающая все урлы и анкоры на странице:
Код:
/A[\s\r\n\t][^>]*HREF[\s]?\=[\s'\"]?([^\"'>#\s]+).*?\>(.*?)\<\/A\>/is
 
Регулярки в парсинге - лучше использовать совсем по минимуму.
Очень спорное утверждение. При разборе больших текстов использование strpos, substr с применением кучи условий может оказаться гораздо медленнее регулярки. Идеальный выход сделать две реализации и их сравнить, но такое возможно не всегда.
 
Вот именно путем сравнения и всевозможных замеров времени и сьедаемой памяти я и пришел к такому выводу. Последний парсер, разбирающий хтмл и формы - был написан в 4 реализациях.. одна - исключительно на стрпос/сабстр, вторая - посимвольный однократный проход, третяя - исключительно на регулярках, четвертая - комбинация стрпос/сабстр+простейшие минимальные регулярки. по всем параметрам выйграла последняя реализация. :) я бы даже сказал топ выглядит так:
1. стрпос/сабстр+минимум простейших регулярок.
2. стрпос/сабстр
3. регулярки
4. посимвольный проход (вообще дикие тормоза)..

2 и 3 места - небольшая разница. 1 - отрыв просто дикий, от 2/3 места. 4 - отрыв такой же дикий от 2/3 места, только в сторону тормозов. :)

а вообще, регулярки - очень удобная штука.. только, как ни крути, но в том же пхп - ой как осторожно их использовать стоит.. ибо, то что работает скажем в пхп 4.4 - может нифига не работать в пхп5.. %) разные версии pcre, и каждая глючит по своему.. да и памяти жрут совсем некисло...
 
Классно, что ты провел такое исследование. Хотелось бы еще тебя попросить протестировать регулярки на Perl - мне что то кажется, что регулярки перловые должны быстрее работать, не скажу почему - но кажется ;)

Предлагаю провести подробное тестирование.
Для этого прошу выложить код твоих тестов сюда, на какой-нибудь файло-обменник или мне в личку. Я со своей стороны перепишу версию регексповую на перл и проверим скорость работы в комплексе.

Думаю эта тема будет интересна всем.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху