Янв 12
2009Парсинг! Закрытые авторизацией сайты. vkontakte.ru … как много дыр я слышу в этом слове ..
Рубрики: (phpdude Curl, Парсинг, Регулярные выражения) Автор: phpdude 12-01-2009
Теги : curl, curl_exec, curl_init, phpdude Curl, phpdude Curl beta, Парсинг, парсинг php, парсинг пхп
вечер добрый. поперло писать записки в этот угоблог.
такс, я так понимаю что если есть нюбы, которые меня читают/читали/слушали/неслушали/ненавидели и все еще ненеавидят, то это может быть им очень полезным
поехали.
цель – спарсить данные с сайта, который требует авториации. про http auth basic я промолчу. почитайте на википедии или подобном ресурсе.
беру тупо сайт вконтакте.сру.
допустим я хочу своровать список пользователей.
начну прямо с кода. может даже им и закончу. на этот раз я попытался его откомментировать хорошенько
сразу скажу, что писать дедовским методом – curl_init + curl_fuck я не стал, мне этот метод не интересен, вам может и интересен, но мне нет. мне более интересно чтобы моим curl.php классом пользовались, иначе на кой хер я его выложил
как я и раньше говорил, curl.php делает НУ ОЧЕНЬ МНОГО работы программиста над курлом.
вот код.
http://phpdude.ru/code/LdYObs (опять продвигаю свой сервис;)
<?
require_once ‘Curl.php’;
/** [! Авторизация **/
$curl = new Curl();
$curl->init("http://vkontakte.ru/login.php")->serverfriendly()->setopt("post",array("email"=>"uralit2006@gmail.com","pass"=>"qwerty"))->exec(); // авторизуемся. далее будем использовать этот объект.
/** Авторизация !] **/
header(«Content-type: text/html; charset=utf-8″); // ебаный контакт использует cp-1251, поэтому перекрываем <meta с помощью заголовка сервера
echo «<base href=\»http://vkontakte.ru\» />»; // устаналиваем базу для всяких ссылок и картинок.
/** [! Парсинг данных **/
$html = $curl->init("http://vkontakte.ru/people.php")->serverfriendly()->exec();
preg_match_all("#<dl class=\"clearFix\">.*?</dl>#ism",$html,$people);
$people = $people[0];
foreach($people as $k=>$p)
{
preg_match_all(«#<dt>(.*?):</dt>\\s*<dd>(.*?)</dd>#ism»,$p,$info);
$people[$k] = array_combine($info[1],array_map(«strip_tags»,$info[2]));
}
/** Парсинг данных !] **/
echo «<pre>»;
print_r($people);
рассказать бы немного об этом коде.
в первой строке поключаю свой любимый класс.
дальше создаю объект с которым буду работать. курл класс написан так, что его можно «настраивать» не мусоря в коде, то есть он написсан по паттерну (если не ошибаюсь, читал в каком то «блоге – от новичка до профессионала» … блог еще на уровне новичка) «цепочка». то есть большинство миетодов объекта возвращают сам объект.
третья строка – собственно авторизация на сайт. вконтакт использует POST при авторизации, ну так что, накормим его постом
$curl->init(«http://vkontakte.ru/login.php»)->serverfriendly()->setopt(«post»,array(«email»=>«uralit2006@gmail.com»,«pass»=>«qwerty»))->exec();
метод exec по умолчанию возвращает строку – html код полученной страницы. мне она не нужна ну никак. поэтому просто вызвал метод и забыл.
теперь у меня есть curl объект который знает про кукисы авторизации на сайте. далее поработаем над ним
переинициализируем его и получим html код интересуещей нас страницы (http://vkontakte.ru/people.php)
$html = $curl->init(«http://vkontakte.ru/people.php»)->serverfriendly()->exec();
тра лялял! всего 2 строки и мы АВТОРИЗОВАЛИСЬ + Скачали нужный нам html код.
далее я известным по прошлой статье методом собираю инетерсующие меня данные и вывожу принтром. все
с комментариями и прочей поебенью у меня все заняло 29 строк
код всего лишь прототип, но сюда можно легко добавить поиск нужного пользователя сортировки контакта и тп … что душе угодно
в общем, надеюсь эта херня кому нить поможет
кстати для неверующих
http://94.31.169.103/vkontakte/people.php
тут рабочая копия.
Всея ПЫХА
adw0rd
Мавр
ГО
Irinax
http://userapi.com
так это не то. к томуже я просто показывал пример как работать. а юзер апи = уг ебаное
Какие требования к хостингу у скрипта и класса?
На локалхосте на денвере работало, перенес на сервак (vds от isperver.com) – не работает, долго грузится и в результате булая страница.
Curl.so включено
iconv. еще требует, если я не ошибаюсь. сейчас нет возможности рповерить, ближе к моему вечеру могу проверить только
iconv тоже включен.
Ок, как разберетесь – отпишитесь здесь
Только что пробывал включить абсолютна все расширения, которые возможно. Всё равно не заработало
Скорее всего, что-то выключено или включено в php.ini
А вот что именнно, пока не понятно
Включил отображение ошибок и вот что получилось:
Fatal error: Uncaught exception ‘Exception’ with message ‘CURL ERROR: connect() timed out!’ in /home/***/data/www/***.ru/Curl.php:338 Stack trace: #0 /home/**/data/www/***.ru/Curl.php(260): Curl->mr_after_exec(false) #1 /home/***/data/www/***.ru/goroskopid.php(69): Curl->exec() #2 {main} thrown in /home/***/data/www/***.ru/Curl.php on line 338
Что посоветуете?
напиши хостеру, ибо они скорее всего запретили исходящие соединения через файрволл. либо херово курл установлен.
А как правильно работать через прокси?
$proxy_host=»83.69.***.215:3128″;
$proxy_user=»user_name:password»;
$curl = new Curl();
$curl->setopt(«proxy»,$proxy_host);
$curl->setopt(«proxyuserpwd», $proxy_user)
$curl->init(«http://vkontakte.ru/login.php»)->serverfriendly()->setopt(«post»,array(«email»=>$vkontaktelogin,»pass»=>$vkontaktepassw))->exec();
так верно?
$proxy_host=”http://83.69.***.215:3128″;
вот так если я не ошибаюсь
Скажите а где взять Curl.php ?
в предыдущей теме
Автору огромное спасибо, все работает, правда тексты ссылок в иерогрифах…покопаюсь с кодировкой.
еще раз спасибо
курл класс автоматически декодирует в ютф если видит что кодировка отличается от ютф
Кому надо действительно хороший и качественный парсер, пишите на емейл: zeos.ua@gmail.com
Цена 5WMZ
Покажу скрипт на примере.
Очень качественно, грамотно, каждая строчка прокомментирована.
посмотрел бы на сие чудо. а чо слабо беслпатно то расшарить?
а как установит в парсере язык интерфейса контакта?
в передаваемых от браузера заголовках думаю стоит поковырять снифером. а именно например это
Accept-Languageru,en-us;q=0.7,en;q=0.3
У контакта есть кука remixlang (0-руссикй,1-укр,3-…), отвечающая за язык интерфеса.
Но как эту куку установить вашим классом?
$curl->setopt(«cookie»,array(«remixlang»=>»0″) – не работает
там чуток неразбериха конечно, так как в большой паблик не собирался класс. ну чтоже
$curl->addCookie("remixlang",array("value"=>"0"));вот так надоСупер!!!
Красно дякую
все получилось?
да
норм))
vkontakte.ru поставил капчу на авторизацию)
чо за ложь?)))
заметил))) жесть! )
Здарова. Слушай, вопрос к тебе есть. Как в этом скрипте поставить условие, если авторизация удачная, то echo ‘good’; если же нет – echo ‘bad’; ? То есть какое условие для if ставить?
if($curl->getHeader(«location»)) die(‘good’);
думаю нечто такое ибо сайты после авторизации в 99% случаев перекидывают на другую страницу
Чё-то не хочет у меня этот скрипт на серве пахать… На денвере всё отлично, заливаю на серв, а там такая же проблема, как и у Сергея! Белый экран и всё на этом..
может там курл не поддерживается ? или чтото не стоит? или .. хостинг не фиствдс?)) а то они контакт забанили видимо за абузы с контакта
Как заставить его работать через прокси? Вырианты обозначенные выше не подхоодят
Дело в том, что курл стоит. Именно чё-то он не хочет с твоим классом работать.. Хост не от фиствдс)))
$curl->setopt(«proxy»,»http://ip:port»);
так должно работать с хттп прокси
ооочень странно)))) не сталкивался, всегда все четко было … подебажить то нет возможности?