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

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

  • ivanscm

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    $dom = new DOMDocument();

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

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

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

    $dom = new DOMDocument();

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

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

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

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

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

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

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

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

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

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

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

    я тут curl&#39;ом попробовал…

    <?php

    function getPage ($url, $regx) {
    $uagent = &quot;Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)&quot;;
    $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, &quot;&quot;);
    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 = &#39;http://kinomob.info/&#39;;
    $link = $url.&#39;cheats,1,1.htm&#39;;
    $find = &#39;|(cheat,1,1,)(\d+)(.htm)|sei&#39;;
    $ftitle = &#39;|<h1>(.+?)</h1>.+(uploads/[^&quot;]+).+|sei&#39;;

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

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

    }

    ?>


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

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

    Высокоуровневое абстрактное говно
  • Troy

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

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

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

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

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

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

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

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

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

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