ФорумПрограммированиеPHP для идиотов → Хуево. Парсинг сайта.

Хуево. Парсинг сайта.

  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 12 июля 2010 г. 3:08

    возникла необходимость ограбить сайт http://kinomob.info по контенту. Я думал что сложное для меня скачка и написал довнлоадер. Оказалось что самое сложное для меня парсинг ссылок и названия с описаниями. Вот например категория http://kinomob.info/cheats,1,1.htm. мне нужно выудить весь список урлов в таблице, и потом перейти по ссылке и выудить название, описание и ссылку. пытался работать со страничкой как с xml, но код пиздец не валидный. Использовал Tidy, вроде ничего, но ресурсы кушает по страшному. Я решил использовать регулярки, но в них я деревянный, простое могу, а вот страничку не придумаю как. Ткните кто знает пожалуйста.
    С возвращением, Пiха!
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 12 июля 2010 г. 4:34, спустя 1 час 25 минут 49 секунд

    phpQuery тоже загинается на невалидном документе?
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 12 июля 2010 г. 4:56, спустя 22 минуты 16 секунд

    Абырвалг, че то первый раз слышу про такое, уже читаю.
    С возвращением, Пiха!
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 12 июля 2010 г. 5:03, спустя 6 минут 32 секунды

    довай. Не забудь о резалтах написать, так как мне самому интересно
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 12 июля 2010 г. 6:23, спустя 1 час 20 минут 55 секунд

    phpQuery использует XML разборщик и довольно требователен к памяти на больших документах (от 6 метров)
    правда работать с селекторами очень удобно после jQuery
    по теме - регулярки в путь.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 12 июля 2010 г. 7:20, спустя 56 минут 52 секунды

    Хочешь удобства присущее jQuery - phpQuery. Хочешь простоты, гибкости, головной боли после небольшой смены (типа кавычек) верстки - юзай регулярки.
    Но второе еще хорошо тем, что наконец выучишь регулярки хорошо
    adw/0
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 12 июля 2010 г. 7:25, спустя 5 минут 3 секунды

    Наверно для быстроты разработки буду использовать phpQuery. будет время буду с регулярками мучаться. говорят легко, а я на них как баран на новые ворота
    С возвращением, Пiха!
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 12 июля 2010 г. 12:40, спустя 5 часов 14 минут 32 секунды

    adw0rd, если тидить документ, то головной боли этой уже не стает :)

    другое дело, есть ли у заказчиков тиди, но это уже дело третье)
    Сапожник без сапог
  • 888eug

    Сообщения: 13 Репутация: N Группа: Кто попало

    Spritz 13 июля 2010 г. 0:22, спустя 11 часов 42 минуты 16 секунд

    Можно сделать так:
    <?php
    error_reporting(0);

    $dom = new DOMDocument();

    $file = 'http://kinomob.info/cheats,1,1.htm';
    $dom->loadHTMLFile($file);
    $table = $dom -> getElementsByTagName('table');
    tr = $table -> item(9) -> getElementsByTagName('tr');
    $td = $tr -> item(3) -> getElementsByTagName('td');
    $a = $td -> item(0) -> getElementsByTagName('a');
    $hre= $a ->item(0) -> getAttribute("href") ;

    $links[$link]='http://kinomob.info/'.$hre;
    echo '<br/>',$links[$link];
    ?>

    Для получения всех ссылок просто поставить цикл со смещением $td = $tr -> item(3) на 1, т.е. 4,5, и т.д.
    Спустя 121 сек.
    <?php
    error_reporting(0);

    $dom = new DOMDocument();

    $file = 'http://kinomob.info/cheats,1,1.htm';
    $dom->loadHTMLFile($file);
    $table = $dom -> getElementsByTagName('table');
    $tr = $table -> item(9) -> getElementsByTagName('tr');
    $td = $tr -> item(3) -> getElementsByTagName('td');
    $a = $td -> item(0) -> getElementsByTagName('a');
    $hre= $a ->item(0) -> getAttribute("href") ;

    $links[$link]='http://kinomob.info/'.$hre;
    echo '<br/>',$links[$link];
    ?>

    Здесь правильно.
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 13 июля 2010 г. 6:53, спустя 6 часов 31 минуту 3 секунды

    ога, верстку изменили и песта, лишний элемент вывелся и песта, если уж юзаешь dom пхпшный, для поиска элементов пользуй xpath, куда более гибкие решения позволяет делать
    Work, buy, consume, die
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 13 июля 2010 г. 7:22, спустя 28 минут 52 секунды

    да dom говорят жрет много, в книге видел даже. сам не знаю.но этот вариант пробовал.
    С возвращением, Пiха!
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 15 июля 2010 г. 18:24, спустя 2 дня 11 часов 2 минуты

    я тут curl'ом попробовал…

    <?php

    function getPage ($url, $regx) {
    $uagent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)";
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_USERAGENT, $uagent);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

    $r = curl_exec($ch);
    preg_match_all($regx, $r, $a);
    curl_close($ch);

    return $a;
    }

    $url = 'http://kinomob.info/';
    $link = $url.'cheats,1,1.htm';
    $find = '|(cheat,1,1,)(\d+)(.htm)|sei';
    $ftitle = '|<h1>(.+?)</h1>.+(uploads/[^"]+).+|sei';

    $mas = getPage($link, $find);

    for ($i=0;$i<count($mas[0]);$i++) {
    echo $url.$mas[0][$i].'<br />';
    $newlink = $url.$mas[0][$i];
    $info = getPage($newlink,$ftitle);
    echo $info[1][0].'<br />';
    echo $url.$info[2][0].'<br /><hr />';

    }

    ?>[/php]

    только я не силен в регулярках, вытащил заголовок и картинку… нуна еще описание и форму с кнопкой "скачать"…

    вот что мне выводит:

    [img]http://j.imagehost.org/0743/000.jpg[/img]
    Высокоуровневое абстрактное говно
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 15 июля 2010 г. 21:34, спустя 3 часа 9 минут 34 секунды

    Stasovsky, for на foreach поменяй , смысл этого
    $url = 'http://kinomob.info/';
    $link = $url.'cheats,1,1.htm';
    я вобще не понимаю, почему не в одну строку ?
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 16 июля 2010 г. 2:10, спустя 4 часа 35 минут 55 секунд

    потому что $url дальше использовалась))
    Высокоуровневое абстрактное говно
  • ivanscm

    Сообщения: 1251 Репутация: N Группа: Джедаи

    Spritz 20 августа 2010 г. 3:57, спустя 35 дней 1 час 47 минут

    Stasovsky, выручай. нужно зайти на страницу и выудить описание с ссылкой на закачку.
    С возвращением, Пiха!

Пожалуйста, авторизуйтесь, чтобы написать комментарий!