1. PHP / Говнокод #9485

    +154

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    <?php
    iconv_set_encoding("input_encoding", "UTF-8");
    iconv_set_encoding("internal_encoding", "UTF-8");
    iconv_set_encoding("output_encoding", "UTF-8");
    
    $curl = curl_init();
    $curl_set = array(
            CURLOPT_COOKIESESSION => 0,
            CURLOPT_VERBOSE => 1,
            CURLOPT_USERAGENT => 'Opera/9.60 (J2ME/MIDP; Opera Mini/4.2.14912/812; U; ru) Presto/2.4.15',
            CURLOPT_RETURNTRANSFER => 1
        );
    
    curl_setopt_array($curl, $curl_set);
    
    for($i=1;$i<50;$i++){
        $url = 'http://utemplate.ru/load/19-1-0-'.$i;
        curl_setopt($curl, CURLOPT_URL ,$url);
        $data = curl_exec($curl);
        preg_match_all('#<div class="entrytitle">(.*)</div>(.*)<hr>#isU', $data, $matches);
        $content[title] = $matches[1][0];
        $content[desc] = $matches[2][0];
        unset($matches);
        preg_match_all('#<img src\="http://utemplate.ru/_ld/0/(.*)"/>#isU', $data, $matches);
        $content[img] = $matches[1][0];
        if($content[title] AND $content[desc] AND $content[img]){
            unset($matches);
            mkdir($content[title], 0777);
            curl_setopt($curl, CURLOPT_URL ,'http://utemplate.ru/_ld/0/'.$content[img]);
            $image = curl_exec($curl);
            curl_setopt($curl, CURLOPT_URL ,'http://utemplate.ru/load/0-0-0-'.$i.'-20');
            $file_inf = curl_exec($curl);
            preg_match_all('#<A HREF="(.*)"#isU', $file_inf, $matches);
            $ext_file = substr($matches[1][0], -4);
            $ext_img = substr($content[img], -4);
            curl_setopt($curl, CURLOPT_URL , $matches[1][0]);
            $file = curl_exec($curl);
            file_put_contents($content[title].'/'.$content[title].$ext_file, $file);
            file_put_contents($content[title].'/'.$content[title].$ext_img, $image);
            file_put_contents($content[title].'/'.$content[title].'.txt', $content[title]."\n".$content[desc]);
        }
    
    };

    Злобный самописный, рабочий граббер uCoz сайта

    Запостил: __construct, 19 Февраля 2012

    Комментарии (12) RSS

    • Одно только наличие курла в 2012 году делает этот код говнистым.
      Ответить
      • А можешь предложить на замену cURL'у? Сокеты что ли?
        Ответить
        • file_get_contents со stream_context.
          Ответить
          • Разве file_get_contents позволяет так гибко имитировать работу браузера конечного клиента как cURL? Я считаю что любые задачи связанные с получением контента и имитацией браузера, cURL подходит как никак лучше, хотя бы в гибкости настроек с помощью curl_setopt().

            Ну а раз вы так предлагаете другое решение, продемонстрируйте пожалуйста, я буду вам очень благодарен...
            Ответить
            • Имитировать что? Отправку заголовков?
              Вместо каких-то директив я могу прописать в массиве заголовки с нуля.

              >продемонстрируйте пожалуйста
              Скопировать пример из мануала? Продемонстрировать что? У меня в продакшене все грабберы лезут даже без лишних заголовков и стрим_контекстов, просто f_g_c($url). А граббить тех, кто рьяно отыскивает ботов - не приходилось.
              Ответить
          • Специально для этого холивара оставили cURL context wrappers :)
            Кроме того, file_get_contents надежен, как крепость из говна. Придет неполный или сжатый файл - он подавится.
            Ответить
            • Вот вот, я тоже сначала без курла всё делал, но когда file_get_contents давилась 404 и получал вместо файла бэд рекьюсты, то не было выхода.
              Ответить
              • Я обычно проверяю заголовки get_headers(), перед тем как лезть, чтобы удостовериться, что там 200 ОК, если сервер часто падает или еще что-то.
                Кроме того, что мешает вам написать if ($content = @f_g_c($url))? Вы сможете самостоятельно обработать ошибку f_g_c, которая в 95% случаев либо таймаут, либо 404. Или в try-catch засунуть ее можно. Вариантов масса.
                Ответить
                • А для обрывов ещё и Content-Length сравнить с количеством полученных байт.
                  Ответить
            • >Придет неполный или сжатый файл - он подавится.
              Никогда такого не было. Расшифровает из коробки. Куски файлов тоже ест.
              Ответить
              • У меня было с сервером, который отправлял gzip-нутые страницы, когда его об этом не просили. Лечилось так: curl_setopt($cl, CURLOPT_ENCODING, 'gzip');
                Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий