как спарсить жж-юзеров?

Тема в разделе "Регулярные выражения", создана пользователем bertolai, 24 мар 2011.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. bertolai

    bertolai

    Регистр.:
    21 янв 2008
    Сообщения:
    158
    Симпатии:
    56
    как можно силами php с блога на ЖЖ спарсить ники ЖЖ-юзеров из комментов?
    из html кода страницы вытащил вариатн для поиска регулярками:
    PHP:
    lj:user='userlj' тут_куча_разного_текста_на_ру_и_en "comment-text">Тут текст везде одинаковый.<br />
    нужно 'userlj' , которые, естественно, везде разные, переложить в .txt файл.

    можно спарсить и не с сайта, а, в крайнем случае, из кучи сохранённых html-страниц, или из одной html или txt-файла, но это не есть хорошо.
     
  2. citrus

    citrus Постоялец

    Регистр.:
    5 ноя 2006
    Сообщения:
    58
    Симпатии:
    8
    getljusernames.php:

    <?php
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'http://drugoi.livejournal.com/3520675.html');
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6');
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $data = curl_exec($ch);
    if (curl_errno($ch) != 0) {
    print_r(curl_getinfo($ch));
    echo "\n\ncURL error number:" .curl_errno($ch);
    echo "\n\ncURL error:" . curl_error($ch);
    }
    curl_close($ch);
    $dom = new domDocument;
    $dom->loadHTML($data);
    $dom->preserveWhiteSpace = false;
    $spans = $dom->getElementsByTagName('span');
    $k = 0;
    foreach ($spans as $span)
    {
    $ljuser = $spans->item($k)->getAttribute('lj:user');
    if ($ljuser != "") echo "username: ".$ljuser."\n";
    $k++;
    }
    ?>
     
  3. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    с curl
    PHP:
    <?php
    ini_set
    ('max_execution_time',0);
    function 
    get_web_page$url )
    {
      
    $uagent "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8";

      
    $ch curl_init$url );

      
    curl_setopt($chCURLOPT_RETURNTRANSFER1);  // возвращает веб-страницу
      
    curl_setopt($chCURLOPT_REFERER,"http://google.com");
      
    curl_setopt($chCURLOPT_HEADER0);           // не возвращает заголовки
      
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);   // переходит по редиректам
      
    curl_setopt($chCURLOPT_ENCODING"");        // обрабатывает все кодировки
      
    curl_setopt($chCURLOPT_USERAGENT$uagent);  // useragent
      
    curl_setopt($chCURLOPT_CONNECTTIMEOUT20); // таймаут соединения
      
    curl_setopt($chCURLOPT_TIMEOUT20);        // таймаут ответа
      
    curl_setopt($chCURLOPT_MAXREDIRS10);       // останавливаться после 10-ого редиректа

      
    $content curl_exec$ch );
      
    $err     curl_errno$ch );
      
    $errmsg  curl_error$ch );
      
    $header  curl_getinfo$ch );
      
    curl_close$ch );

      
    $header['errno']   = $err;
      
    $header['errmsg']  = $errmsg;
      
    $header['content'] = $content;
      return 
    $header;
    }
    $url="http://drugoi.livejournal.com/3520675.html";
    $fp=fopen("users.txt","a+");
    $result=get_web_page$url );
    $content $result['content'];
    preg_match_all('/lj:user=\'(.*?)\'/',$content,$users);
    $count_users=count($users[1]);
    for (
    $i=0;$i<$count_users;$i++){
    $user $users[1][$i];
    fwrite($fp,$user."\n"); 
    echo 
    $user.'<br>';flush();ob_flush();flush();
     }
    fclose($fp);
    ?>
    без curl
    PHP:
    <?php
    ini_set
    ('max_execution_time',0);
    $url="http://drugoi.livejournal.com/3520675.html";
    $fp=fopen("users.txt","a+");
    $content=file_get_contents$url );
    preg_match_all('/lj:user=\'(.*?)\'/',$content,$users);
    $count_users=count($users[1]);
    for (
    $i=0;$i<$count_users;$i++){
    $user $users[1][$i];
    fwrite($fp,$user."\n"); 
    echo 
    $user.'<br>';flush();ob_flush();flush();
     }
    fclose($fp);
    ?>
     
  4. bertolai

    bertolai

    Регистр.:
    21 янв 2008
    Сообщения:
    158
    Симпатии:
    56
    но ведь в обоих случаях спарсятся ники всех юзеров, так? а нужно не всех, а только тех, у которых в тексте комментария присутствует определённый, один и тот же спам-текст, как было в моём первом посте:
    PHP:
    "comment-text">Тут текст везде одинаковый.<br />
    , чтоб разом всех ботов можно было забанить.

    я правильно понял, что в приведённых примеров сбор ников будет идти со странички /3520675.html, т.е. с определённого поста в ЖЖ? и потом надо будет вставлять урл другого поста?
     
  5. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    какой вопрос такой и ответ хотя пример урла дай откуда ты парсить собираешься ато ты пишешь
    , а я в исходном коде вижу
     
  6. bertolai

    bertolai

    Регистр.:
    21 янв 2008
    Сообщения:
    158
    Симпатии:
    56
    где такое нашли?
    ааа, так это наверное от оформления ЖЖ зависит, так ЖЖ drugoi не я в пример привёл.

    если контретнее, то вот оттуда надо собрать ники ботов, постящих в комментах один и тот же текст, не затронув ники остальных комментаторов: http://navalny.livejournal.com/568252.html?page=56#comments
    там я вижу именно это
     
  7. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    держи вроде работает
    PHP:
    <?php 
    ini_set
    ('max_execution_time',0); 
    $url="http://navalny.livejournal.com/568252.html?page=56"// урл страницы
    $spam="Aкция РАЗOБЛАЧИМ ПИДОPКОВ"// текст коментария
    $fp=fopen("users.txt","a+"); 
    $content=file_get_contents$url ); 
    preg_match_all('/lj:user=\'(.*?)\'.*?comment-text\">'.$spam.'.*?[^<]*/si',$content,$users); 
    $count_users=count($users[1]); 
    for (
    $i=0;$i<$count_users;$i++){ 
    $user $users[1][$i]; 
    fwrite($fp,$user."\n");  
    echo 
    $user.'<br>';flush();ob_flush();flush(); 
     } 
    fclose($fp); 
    ?>
     
    bertolai нравится это.
  8. bertolai

    bertolai

    Регистр.:
    21 янв 2008
    Сообщения:
    158
    Симпатии:
    56
    работать то работает, но всё равно (по крайней мере у меня) тянет ВСЕХ юзеров, включая и автора блога. придётся чистить выходной файл руками... :(

    upd.
    ан не, далеко не ВСЕХ, но некоторые ненужные всё же проскакивают... может скрипт слишком быстро или слишком медленно... не успевает, короче.
     
  9. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.037
    Симпатии:
    702
    после каждого прохода удаляй или очищай файл иначе он будет в конец дописывать новых юзверей поэтому у тебя наверное и попал админ потому как остались записи от старого прохода скрипта когда коментарии не учитывались можно конечно сделать чтобы он при каждом проходе создавал новый файл и в него записывал замени
    PHP:
    $fp=fopen("users.txt","a+");
    на
    PHP:
    $fp=fopen("users.txt","w");
     
  10. bertolai

    bertolai

    Регистр.:
    21 янв 2008
    Сообщения:
    158
    Симпатии:
    56
    да, конечно я очищал. скрипт как то при работе "задумывается" сначало сильно, потом начинает парсить. но не всех, опять же юзеров. ощущения такие (чисто человеческие), что когда он задумывается, он чего то пропускает мимо себя...

    ладно, дочищу руками.
     
    FastPay.By нравится это.
Статус темы:
Закрыта.