помогите написать парсер

Тема в разделе "PHP", создана пользователем flat73, 18 мар 2011.

Модераторы: latteo
  1. flat73

    flat73 Постоялец

    Регистр.:
    15 авг 2008
    Сообщения:
    55
    Симпатии:
    2
    Добрый день. Нужно вытаскивать информацию со страниц и сохранять в определеном виде в текстовом документе.
    Ссылки по которым должен пройтись парсер будуд лежать в xls в таком виде:
    Таблица А
    ссылка
    Таблица Б
    номер товара
    Таблица С
    определенное число
    к примеру вот ссылка на товар http://ru.def-shop.com/Cipo-Baxx/му...ipo-Baxx-Feel-The-Energy-Hoody-Antracite.html
    Парсить прийдется только с одного сайта http://ru.def-shop.com
    С этой странички надо вытащить инфу:
    S (+ 4 в наличии)
    M (+ 4 в наличии)
    L (+ 4 в наличии)
    XL (+ 4 в наличии)
    XXL (+ 4 в наличии)
    далее он удаляет не нужное т.е. удаляет (+ 4 в наличии), на некоторых страницах надпись в скобках разная.
    Остается:
    S
    M
    L
    XL
    XXL
    Где то в начале должны быть определены значения размерам
    допустим
    S = 1
    M = 2
    L = 3
    XL = 4
    XXL = 5
    После чего в документ записывается в такм виде:
    (номер товара, определенное число, 1(т.е. значение размера, записывается не S а "1"), 0),
    т.е.
    (686, 16, 1, 0),
    (686, 16, 2, 0),
    (686, 16, 3, 0),
    (686, 16, 4, 0),
    (686, 16, 5, 0),
    если есть другой товар
    (687, 16, 1, 0),
    (687, 16, 2, 0),
    (687, 16, 3, 0),
    (687, 16, 4, 0),
    (687, 16, 5, 0),
    к примеру у другого товара только есть размеры S, M тогда запишется вот так вот
    (687, 16, 1, 0),
    (687, 16, 2, 0),
    Кто нибудь напишите как это реализовать. Готов заплатить денежку. за полностью готовый парсер
     
  2. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    200
    Симпатии:
    55
    За денежку на фрилансе быстро напишут. Если договоритесь.Сам бы мог взяться, да некогда.
     
  3. bork75

    bork75 Д☼брая собака )

    Регистр.:
    21 июн 2008
    Сообщения:
    1.449
    Симпатии:
    716
    Не думаю, что на фрилансе напишут такой парсер за 1000р.
    но за эти деньги можно купить готовый Content Downloader

    Если в твоём описанном примере, на странице каждый элемент размещён
    с индивидуальным признаком, ну т.е.
    То проблем не будет, задашь для каждого элемента свою границу.
    Формат вывода любой.
     
  4. Maza

    Maza

    Регистр.:
    3 июл 2007
    Сообщения:
    255
    Симпатии:
    116
    Тут самым сложным будет сбор всех нужных ссылок, на нужные товары.Хех на этом сайте ссылочки то русские ) Стукани в ЛС могу попробовать на JAVA написать,если устроит цену обговорим или на php, но боюсь будут проблемы со временем работы скрипта.
     
  5. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    да с русскими урлами косяк будет, но в принципе есть еще и такие урлы
    если номер товара совпадает с products_id то можно так реализовать
    PHP:
    <?php
    //$url = "http://en.def-shop.com/Cipo-Baxx/Men/Overwear/Sweatshirts/Hoodies/Cipo-Baxx-Feel-The-Energy-Hoody-Antracite.html";  //ссылка
    $nomer_tovara=39766//номер товара
    $cislo=16//определенное число
    $url="http://en.def-shop.com/product_info.php?products_id=".$nomer_tovara;
    //S = 1 
    //M = 2 
    //L = 3
    //XL = 4
    //XXL = 5 

    $content file_get_contents($url);
    preg_match_all('/<noscript>(.*?)<\/noscript>/si',$content,$options);
    //print_r($options);
    preg_match_all('/<option value=\"\d{1}\">(.*?)\s+\(/si',$options[1][0],$size);
    //print_r($size);
    $c=count($size[0]);
    for(
    $i=0;$i<$c;$i++)
    {
    $size1=$size[1][$i];
    if(
    $size1=="S"$s 1;
    if(
    $size1=="M"$s 2;
    if(
    $size1=="L"$s 3;
    if(
    $size1=="XL"$s 4;
    if(
    $size1=="XXL"$s 5;
    echo 
    "(".$nomer_tovara.", ".$cislo.", ".$s.", 0)<br>";
    }
    ?>
    на выходе получаем
     
  6. VandJ

    VandJ

    Регистр.:
    8 апр 2008
    Сообщения:
    318
    Симпатии:
    113
    Осталось точнее выставить $id_tovara, и вперед…
    В один поток долго придется качать...
    PHP:
    <?  
    set_time_limit (0);
    $start 33000;
    $finish 34000;
    for(
    $id_tovara $start;$id_tovara <= $finish$id_tovara++) {         
    $text file_get_contents("http://en.def-shop.com/product_info.php?products_id=$id_tovara"); 
    preg_match ('#<select class=\"product_info_size\"(.*?)</select>#s',$text,$text);
    preg_match_all ('#<option value="\d">(.*?)\s#',$text[1],$matches); 
    $file fopen("kod.txt","a"); 
    for(
    $i 0$i count($matches[1]); $i++){ 
        
    $razmer = array ( 'S'=>'1' 'M'=>'2''L'=>'3' 'XL'=>'4'  'XXL'=>'5' 'XXXL'=>'6');
        
    $matches[1][$i] = strtr($matches[1][$i],$razmer);
        
    fwrite($file,"(".$id_tovara.", 16, ".$matches[1][$i].", 0)\n");
    }
    fclose($file);
    }
    ?>
    PS. Идею с ссылкой взял у zzallexx
     
  7. Maza

    Maza

    Регистр.:
    3 июл 2007
    Сообщения:
    255
    Симпатии:
    116
    На некоторые не проходит Вот к примеру http://ru.def-shop.com/product_info.php?products_id=29920.
    Карту сайта сграбить или скачать, на диск и потом уже регулярочкой пройтись собрать ссылочки
    http://ru.def-shop.com/sitemaps/sitemap_ru-products-0.xml
    http://ru.def-shop.com/sitemaps/sitemap_ru-products-1.xml
    http://ru.def-shop.com/sitemaps/sitemap_ru-categories.xml
    http://ru.def-shop.com/sitemaps/sitemap_ru-manufacturer.xml

    Первые две ссылки, то что нам нужно, и по ним уже ходить curl.

    Набросал малёк, остально это код, то что сбросил VandJ и zzallexx, тока нужно будет модифицировать.
    Тут косяк какой то в моём коде, разбираться лень, будет интерес посмотришь.


    PHP:
    <html>
    <body> 
    <link href="st.css" rel="stylesheet" type="text/css">
                <?php
                    set_time_limit
    (0); 
                    function 
    curl_get_file_contents($URL)
                    {
                        
    $c curl_init();
                        
    curl_setopt($cCURLOPT_RETURNTRANSFER1);
                        
    curl_setopt($cCURLOPT_URL$URL);
                        
    $contents curl_exec($c);
                        
    curl_close($c);

                        if (
    $contents) return $contents;
                        else return 
    FALSE;
                    }
                    function 
    workfile ($filename,$foutput){

                        
    $fp fopen($foutput"a") or die("Файл - $output не может записать данные!");
                        
    $xdomens explode("\n"str_replace("\r"''$filename));
                        
                        foreach (
    $xdomens as $xad) {
                                
                        echo 
    "Читаю файл -- $xad <br>";
                        
    $ft fopen($xad"r") or die("Файл - $text не может открыться на чтение!");                    
                        
    $filetext file($xad);
                        
                            foreach (
    $filetext as $a) {
                                
    $a trim ($a);
                                echo 
    $a;
                                
    preg_match_all("#\s?<loc>\s?(.*)\s?</loc>\s?#i"$a,$val);
                                
    print_r($val);                            
                                break;
                                
    fwrite($fp$val[0]."\n");        
                                
                                
    $content curl_get_file_contents ('http://'.$pieces[0]);
                                if (
    $content != FALSE)
                                {
                                
    //..Тут обработка ссылок
                                
    }
                                
                            }
                            
    fclose($ft); 
                        }
                        echo 
    '<a href="./def-shop.php">Назад</a>';
                        
    fclose($fp);
                    }

                    switch (
    $_POST['button']) {
                    case 
    "Поехали":
                        
    $filename htmlspecialchars($_POST['filename']);                    
                        
    $finput trim(htmlspecialchars($_POST['finput']));
                        
                        echo 
    '<table align="center" width=100% border="0" cellpadding="5" cellspacing="5">
                              <tr>                              
                                  <td align="center">
                                  <strong> Конфигурация: </strong> '
    ."Файл для записи: <font color=\"#33CC00\">$finput</font>".
                                  
    '</td>
                              </tr>
                              <tr>
                              <td align="center">
                        '
    ;
                        if (!empty(
    $finput) || !empty($filename)){
                              
    workfile ($filename,$finput);
                              echo 
    '</td></tr>';                        
                        }
                        else
                            echo 
    'Нет файлов для парсинга!</td></tr>';
                        echo 
    '</table>';
                        
                    break;
                    default:
                        echo 
    '
                        <form method="post" action="">  
                        <table align="center" width="483" border="0" cellpadding="5" cellspacing="5">
                                        
                        <tr>
                            <td colspan="3" align="center">                        
                            <span class="red">*</span>Файл для записи:    <input name="finput" type="text" value="output.txt" size="40" maxlength="25" />
                            </td>
                        </tr>
                        
                        <tr>
                            <td colspan="3" align="center">
                            
                            <span class="red"> *</span> <p align="center">Список файлов для обработки : </p>                        
                            <textarea rows="20" cols="60" name="filename">sitemap_ru-products-0.xml
    sitemap_ru-products-1.xml
    sitemap_ru-manufacturer.xml</textarea>
                            </td>
                        </tr>
                        
                        
                        <tr>
                            <td colspan="3" align="center">
                            <label> <input type="submit" name="button" id="button" value="Поехали" class="buts"></label>
                            </td>
                        </tr>
                        </table>
                        </form>'
    ;
                    break;
                    }

                    
    ?>
            
    </body> 
    </html>