За последние 24 часа нас посетили 19828 программистов и 1657 роботов. Сейчас ищут 1323 программиста ...

Парсинг HTML

Тема в разделе "PHP для новичков", создана пользователем tymon, 29 фев 2012.

  1. tymon

    tymon Активный пользователь

    С нами с:
    17 фев 2010
    Сообщения:
    10
    Симпатии:
    0
    Господа гуру!
    Возникла одна проблема, помогите с решением.
    Есть веб-морда принтера. На ней ведется статистика печати.
    Задача стоит слать эту статистику по времени на почту.
    При входе на веб-интерфейс необходимо авторизоваться. протокол https.
    Пробовал авторизацию через форму
    Код (Text):
    1. <form id="form" method="post" target="websas" action="https://192.168.110.193/websas/nccs.php?menuitem=6&menu=ServicesMenu&header=Accounting+system" name="login" >
    2.         <input name="password" type="hidden"  value="пароль"/>
    3.         <input type="hidden" value="GB" name="language">
    4.  
    5. </form>
    так проходит. Но дальше встал вопрос как спарсить содержимое страницы.
    Думал в сторону POST-запрос с паролем через cURL и потом попробовать сграбить страницу, что-то не получилось.
    Вообще это возможно сделать?
    За ранее спасибо.

    UPD.
    Вот так лихо хотел спарсить, но форму авторизации не проходит. И парсит ее.
    Код (Text):
    1. include_once('simplehtmldom\simple_html_dom.php');
    2.  
    3. $ch = curl_init();
    4. curl_setopt($ch, CURLOPT_POST, 1);
    5. curl_setopt($ch, CURLOPT_URL, "https://192.168.110.193/websas/login/login.php"); //куда шлем
    6. curl_setopt($ch, CURLOPT_POSTFIELDS, "password=пароль&language=GB"); //что шлем
    7. curl_setopt($ch, CURLOPT_REFERER, "https://192.168.110.193/");
    8. curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; MyIE2; .NET CLR 1.1.4322)");
    9. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    10. curl_setopt($ch, CURLOPT_HEADER, 1);
    11. curl_setopt($ch, CURLOPT_NOBODY, 0);
    12. // не проверять SSL сертификат
    13. curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    14. // не проверять Host SSL сертификата
    15. curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
    16.  
    17.  
    18. if(curl_exec($ch) === false)
    19. {
    20.     echo 'Ошибка curl: ' . curl_error($ch);
    21. }
    22. else
    23. {
    24.     echo 'Операция завершена без каких-либо ошибок';
    25. }
    26.  
    27. $html = file_get_html('https://192.168.110.193/websas/nccs.php?menuitem=6&menu=ServicesMenu&header=Accounting+system');
    28. echo $html;
    29. curl_close ($ch);
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    пост в curl не так формируется
    Код (PHP):
    1. $p=array();
    2. $p['login']=$UTM_USER;
    3. $p['password']=$UTM_PASS;
    4. curl_setopt($ch, CURLOPT_POSTFIELDS, $p); 
     
  3. AndreJM

    AndreJM Активный пользователь

    С нами с:
    25 янв 2012
    Сообщения:
    522
    Симпатии:
    0
    CURLOPT_POSTFIELDS Все данные, передаваемые в HTTP POST-запросе. Для передачи файла, укажите перед именем файла @, а также используйте полный путь к файлу. Тип файла также может быть указан с помощью формата ';type=mimetype', следующим за именем файла. Этот параметр может быть передан как в качестве url-закодированной строки, наподобие 'para1=val1&para2=val2&...', так и в виде массива, ключами которого будут имена полей, а значениями - их содержимое. Если value является массивом, заголовок Content-Type будет установлен в значение multipart/form-data. Начиная с версии PHP 5.2.0, при передаче файлов с префиксом @, value должен быть массивом.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    нифига себе. а у меня и так работает. ман даже не читал))) спасибо)))
     
  5. tymon

    tymon Активный пользователь

    С нами с:
    17 фев 2010
    Сообщения:
    10
    Симпатии:
    0
    cURL отрабатывает без ошибок только не понятно, как дальше действовать.
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы сначала проходите авторизацию а потом загружаете другую страницу и ее уже хотите парсить?
     
  7. tymon

    tymon Активный пользователь

    С нами с:
    17 фев 2010
    Сообщения:
    10
    Симпатии:
    0
    Ну вообще лучше сразу спарсить ее в файл а потом уже отсылать по почте.
    Просто не совсем понятно прохожу я авторизацию или нет.
    После отправки пароля, этот код
    Код (Text):
    1. $html = file_get_html('https://192.168.110.193/websas/nccs.php?menuitem=6&menu=ServicesMenu&header=Accounting+system');
    2. echo $html;
    выдает всю туже страницу авторизации. Я може чего-то не догоняю просто.
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    значит не проходите. сделайте возврат страницы в curl-процедуре авторизации и будет вам видно с каким успехом вы прошли авторизацию.
    приведенный мною выше код - часть скрипта получения статистики у провайдера. для соблюдения всех требований биллинговой системы я сначала получаю стартовую страницу, потом авторизуюсь, потом перехожу к странице статистики. все делается через curl с разбором ответов. относительно вашей задачи - попробуйте получать нужную страницу то же через curl - возможно file_get_html не знает о том что вы прошли авторизацию через curl
     
  9. tymon

    tymon Активный пользователь

    С нами с:
    17 фев 2010
    Сообщения:
    10
    Симпатии:
    0
    оооо! ваша задача идентична моей.
    спасибо за совет.
    с cURL начал только работать, буду благодарен если подскажите как получать страницу через curl
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    старая версия - биллинг не по секурному соединению (секурное не сложнее, но вот скрипт я куда-то потерял)
    Код (PHP):
    1. <?php
    2. // стартовая
    3. $ch = curl_init();
    4. curl_setopt($ch, CURLOPT_URL, "http://172.16.4.13/cgi-bin/utm/aaa");
    5. curl_setopt($ch, CURLOPT_HEADER, 0);
    6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    7. $start=curl_exec($ch);
    8.  
    9. // авторизация
    10. $ch = curl_init();
    11. curl_setopt($ch, CURLOPT_URL, "http://172.16.4.13/cgi-bin/utm/aaa");
    12. curl_setopt($ch, CURLOPT_HEADER, 0);
    13. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    14. $p=array();
    15. $p['login']=$UTM_USER;
    16. $p['password']=$UTM_PASS;
    17. $p['cmd']='user_verify';
    18. curl_setopt($ch, CURLOPT_POSTFIELDS, $p);
    19. $login=curl_exec($ch);
    20. $dataArr=preg_match('/sid=(.{28})"/', $login,$pat);
    21. $MySID = $pat[1];
    22.  
    23. // репорт
    24. $ch = curl_init();
    25. curl_setopt($ch, CURLOPT_URL, "http://172.16.4.13/cgi-bin/utm/utm_stat?cmd=user_report&sid=".$MySID);
    26. curl_setopt($ch, CURLOPT_HEADER, 0);
    27. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    28. $stat=curl_exec($ch);
    29.  
    30. // парсинг репорта
    31. // *** //
    32.  
    33. // выход
    34. $ch = curl_init();
    35. curl_setopt($ch, CURLOPT_URL, "http://172.16.4.13/cgi-bin/utm/utm_stat?cmd=user_bye&sid=".$MySID);
    36. curl_setopt($ch, CURLOPT_HEADER, 0);
    37. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    38. $stat=curl_exec($ch);
    39. ?>
     
  11. tymon

    tymon Активный пользователь

    С нами с:
    17 фев 2010
    Сообщения:
    10
    Симпатии:
    0
    Что-то не получается.
    вот заголовок передаваемый когда коннектишься через форму и авторизацию проходит:
    Код (Text):
    1. POST /websas/login/login.php HTTP/1.1
    2. Host: 192.168.110.193
    3. User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
    4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    5. Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
    6. Accept-Encoding: gzip, deflate
    7. Connection: keep-alive
    8. Referer: http://localhost/test.html
    9. Cookie: PHPSESSID=96b7ea6fdbbc541ad19a2963235f0798
    10. Content-Type: application/x-www-form-urlencoded
    11. Content-Length: 26
    12. password=логин&language=GB
    а вот с помощью cURL
    Код (Text):
    1. HTTP/1.1 100 Continue
    2.  
    3. HTTP/1.1 200 OK
    4. Date: Wed, 29 Feb 2012 10:08:46 GMT
    5. Server: Apache
    6. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    7. Expires: Thu, 19 Nov 1981 08:52:00 GMT
    8. X-Powered-By: PHP/4.3.9
    9. Pragma: no-cache
    10. Set-Cookie: PHPSESSID=797b23fb6bc73b67e2d0cc21203cc950; path=/
    11. Transfer-Encoding: chunked
    12. Content-Type: text/html; Charset=UTF-8
    Может в этом дело быть?
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
  13. tymon

    tymon Активный пользователь

    С нами с:
    17 фев 2010
    Сообщения:
    10
    Симпатии:
    0
    что куки?
     
  14. tymon

    tymon Активный пользователь

    С нами с:
    17 фев 2010
    Сообщения:
    10
    Симпатии:
    0
    Так ну более менее разобрался.
    Если подставлять куку
    Код (Text):
    1. curl_setopt($ch, CURLOPT_COOKIE, "PHPSESSID=1e7101a3fed3a09f78abcb0cd69a74c5");
    то начинает все работать, но проблема в том, что работает только на определенном браузере.
    нашел как брать куки с заголовка:
    Код (Text):
    1. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    2. curl_setopt($ch, CURLOPT_HEADER, 1);
    3. preg_match('/^Cookie: (.*?);/m', curl_exec($ch), $m);
    но при каждом обращении к url куки разные, и при подстановке в PHPSESSID авторизоваться не получается ((.
    Если в ручную копировать из кук браузера PHPSESSID и вставлять в скрипт все ок.
    Не получается универсальности.