Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > пропарсить полученный результат....


Автор: satankos 5.4.2008, 09:40
Столкнулся со следующей проблемой: 
Есть сайт www.carfax.com , на котором есть бесплатная возможность получить краткую информацию по авто (поле для ввода VIN автомобиля и кнопка "найти"). 
Есть сайт www.carfax.ru , на котором те же самые возможности, но сам сайт никак не относится к *.com... После некоторого серфа в инете, выяснилось, что очень много сайтов используют ту же фишку. 
Так вот, хотелось бы выяснить, каким образом у них это реализовано... причем нет никаких следов от первоисточника www.carfax.com !!! 

Есть подозрение, что тут попахивает парсингом (отсылается запрос и вставляется в поле ввода VIN на www.carfax.com(незаметно), потом полученный результат расчленяется (парсится)... и в виде xml возвращается нам....), но как именно его использовать - не знаю...  
Выручите!! 

З.Ы.: самое непонятное, - как послать определенный VIN-номер, введенный на нашем сайте, в поле VIN-номера www.carfax.com..., да при этом ещё и нажать каким-то образом на кнопку "найти".... а потом ещё определить, что страница открылась с результатом поиска... и пропарсить результатт.... вот блин... не пойму, помогите, пожалуйста!

Автор: Fortop 5.4.2008, 11:37
Договорись с админами сайта

Автор: _AXE_ 5.4.2008, 22:15
Цитата(satankos @ 5.4.2008,  09:40)
Столкнулся со следующей проблемой: 
Есть сайт www.carfax.com , на котором есть бесплатная возможность получить краткую информацию по авто (поле для ввода VIN автомобиля и кнопка "найти"). 
Есть сайт www.carfax.ru , на котором те же самые возможности, но сам сайт никак не относится к *.com... После некоторого серфа в инете, выяснилось, что очень много сайтов используют ту же фишку. 
Так вот, хотелось бы выяснить, каким образом у них это реализовано... причем нет никаких следов от первоисточника www.carfax.com !!! 

Есть подозрение, что тут попахивает парсингом (отсылается запрос и вставляется в поле ввода VIN на www.carfax.com(незаметно), потом полученный результат расчленяется (парсится)... и в виде xml возвращается нам....), но как именно его использовать - не знаю...  
Выручите!! 

З.Ы.: самое непонятное, - как послать определенный VIN-номер, введенный на нашем сайте, в поле VIN-номера www.carfax.com..., да при этом ещё и нажать каким-то образом на кнопку "найти".... а потом ещё определить, что страница открылась с результатом поиска... и пропарсить результатт.... вот блин... не пойму, помогите, пожалуйста!

Незаметно поможет нажать на кнопочку отправить функция: 
Код

<?php
fopen("http://site.ru?name=Auto&...", "r");
?>

Автор: satankos 6.4.2008, 11:29
_AXE_, 
Цитата
Незаметно поможет нажать на кнопочку отправить функция: 

спасибо, попробую!

Автор: capitan 10.4.2008, 12:15
В тему. Вчера решил скачать книгу с сайта http://bookz.ru. Люблю почитать их на КПК. Но не тут-то было. Они предлагают купить у них текстовый файл или почитать только у них на сайте. Повесили защиту от копирования, выводят текст во фрейм, все на JS. Причем ещё и разбавляют текст рандомными символами в скрытых span.
Просмотрев скрипты написал быстренько парсер:
Код

<?
    // запускаем  цикл с 1 страницы по 15-ю
    for($i=1; $i<=15; $i++){       
        $url='http://bookz.ru/book.php?id=54405&n=1&p_count=15&g=detect&f=specnaz-_971&b_name=%D1%EF%E5%F6%ED%E0%E7%20%ED%E5%20%F1%E4%E0%E5%F2%F1%FF&a_name=%CC%E8%F5%E0%E8%EB%20%CD%E5%F1%F2%E5%F0%EE%E2&a_id=mihail-nesterov'; // url 1 страницы, копипастим с адресной строки
        $contents = connectsiteGET($url); // читаем контент страницы через CURL
        $url = 'http://bookz.ru/func/getpage.php'.getTextBetween('http://bookz.ru/func/getpage.php', '"', $contents); // Выдираем ссылку на страницу с фреймом

        $contents = connectsiteGET($url); // конектимся к ней

        $url = 'http://bookz.ru/func/getpage.php'.getTextBetween('http://bookz.ru/func/getpage.php', "'", $contents);  // Выдираем ссылку на страницу с текстом
        $contents = connectsiteGET($url); // конектимся
        // чистим текст, т.к. там много лишнего
        $contents = preg_replace('/<span(.*?)<\/span>/is', '', $contents);  // убираем скрытые span
        $contents = preg_replace('/&(.*?)p;/is', ' ', $contents); // заменяем &nbsp; на обычный пробел
       
        $contents = str_ireplace("s += '", "", $contents); // тоже лишнее
        $contents = str_ireplace("';", "", $contents); // тоже лишнее   
        $contents = str_ireplace("var s='", "", $contents); // тоже лишнее   
        $contents = preg_replace('/var(.*?)show(.*?)}/is', '', $contents); // Убиваем JS
        $contents = strip_tags($contents, '<br>'); // Убиваем все теги, кроме <BR/>  
        
        echo $contents;  // Выводим текст книги в браузер
    }

    // Функция для подключения к сайту методом GET через CURL
    function connectsiteGET($url, $followlocation = false, $cookie = null){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_MUTE, true);
        curl_setopt($ch, CURLOPT_URL, $url);         
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)');
        curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT']."/temp/cookiefile");
        curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT']."/temp/cookiefile");
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $followlocation); 
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        $result = curl_exec($ch);
        curl_close($ch);         
        return $result;
    }

    // Функция ищет всё что находится между  $starttag и $endtag
    function getTextBetween($starttag, $endtag, $text) {
        if (strlen($starttag) == 0 || strlen($endtag) == 0) return false;

        $spos = strpos($text, $starttag);
        if ($spos === false) return false;
        $offset = $spos + strlen($starttag);
        if ($offset >= strlen($text)) return false;
        $epos = strpos($text, $endtag, $offset);
        
        if ($epos === false) return false;

        $spos += strlen($starttag); 
        return substr($text, $spos, $epos - $spos);
    }
?>


Писал на скорую руку. Можно и усовершенствовать, главное смысл.  Пользуйтесь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)