Авторизация Curl на конкретном примере

Работает!!! Завтра буду разбирать код, на первый взгляд ошибка была в том, что выводили через curl_exec страницу с формой авторизации, она редиректилась и авторизация слетала. Но куки в файл по-прежнему не выгружаются, поэтому как я понимаю нужно будет проводить авторизацию через curl перед открытием каждой парсингуемой страницы.
вы уверены что не пишет?) или вы не там ищите файл с куками. у меня все пишет. на путь обратите внимание у меня он от корневой директории прописан тут я уже заменил

код ужасен но демонстрирует работу (после вывода просто листайте страницу там видна последовательность)
PHP:
<?php
header( 'Content-type: text/html; charset=utf-8' );
$useragent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36';
$login_url='http://xamillion.com/login/';
$headers=array(
'Host: xamillion.com',
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language:     ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
//'Accept-Encoding: gzip, deflate',
'Connection: keep-alive',
//'Content-Type: application/x-www-form-urlencoded'
);
if (ob_get_level() == 0) ob_start();
function curl_login($login_url,$post,$headers,$useragent,$referer='http://www.google.com'){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $login_url);//закомментить чтоб не логинилось повторно для теста
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
    curl_setopt($ch, CURLOPT_REFERER, $referer);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
    // curl_setopt($ch, CURLOPT_COOKIESESSION, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, '/somepath/cook.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, '/somepath/cook.txt');
    //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $data = curl_exec($ch);
    return $ch;
}

$post = array(
'login' => 'buhelp@mail.ru',
'password' => 'qwerty',
'log' => ''
);




function curl_get($url,$headers,$ch,$referer='http://www.google.com') {
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, false);
//curl_setopt($ch, CURLOPT_COOKIESESSION, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
$answer = curl_exec($ch);

    //print $_COOKIE['PHPSESSID'];//не будет работать что логично))

print $answer;
    flush();
    ob_flush();
    sleep(3);
    //ob_end_clean();
//curl_close($ch);
}

$ch2=curl_login($login_url,$post,$headers,$useragent);


curl_get('http://xamillion.com/catalog/?razdel=3',$headers,$ch2);
curl_get('http://xamillion.com/catalog/',$headers,$ch2);
curl_get('http://xamillion.com/',$headers,$ch2);
curl_get('http://xamillion.com/logout/',$headers,$ch2);
curl_get('http://xamillion.com/catalog/?razdel=3',$headers,$ch2); // а тут уже разлогинены

ob_end_flush();
exit;
 
вы уверены что не пишет?) или вы не там ищите файл с куками. у меня все пишет. на путь обратите внимание у меня он от корневой директории прописан тут я уже заменил

Сам файл с куки создается, но содержание его меня смущает:
xamillion.com FALSE / FALSE 0 PHPSESSID g244r7t5j8b0aiefbe6m9epq85.
Так и должно быть? Как я понимаю он содержит информацию только о сессии. В других случаях он содержал информацию о e-mail и пароле, используя его я могла авторизовываться без ввода логина и пароля. Здесь так не получится?

Код работает спасибо !!!!

Еще вопрос знатокам по теме парсинга. На сайте sliza парсинг открытой пользователем страницы уже с авторизованными данными осуществляется при нажатии интерактивной закладки в браузере. Что делает парсинг более качественным, так как парсится чистый html, т.е. что видишь на экране то и парсишь. В случае же с curl можно натыкаться на данные формируемые javascript, необходимость авторизоваться самим курлом, что в некоторых случаях не так просто. В связи с этим вопрос: как реализовать метод парсинга подобный сервису sliza, т.е. парсить открытую в браузере страницу. Я понимаю, что это делается на javascript, jquery. Но хотелось бы узнать конспективно алгоритм действий, куда копать...
 
Последнее редактирование модератором:
Но хотелось бы узнать конспективно алгоритм действий, куда копать...
node.js вероятно не буду утверждать, там это возможно. не искал готовых библиотек посмотрите тему Для просмотра ссылки Войди или Зарегистрируйся

по поводу авторизоваться итп, вы уже авторизованы используйте эту куку и эти хедеры пока не кончится авторизация.
К примеру при разборе кажды страницы проверяйте, что залогинены(например наверху справа там выводится email),
if авторизован{ну там парсим дальше } else {запустить функцию авторизации
if не удалось авторизоваться{эксепшн меня забанили?! или сайт лежит надо проверить или нет}
}

P.S. попробуйте для парсинга питон и библиотеку scrapy, после этого парсить курлом вам не понравится я вас уверяю)))
Код:
код взят с офф сайта библиотеки 
import scrapy

class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = [
        'http://www.example.com/1.html',
        'http://www.example.com/2.html',
        'http://www.example.com/3.html',
    ]

    def parse(self, response):
        for h3 in response.xpath('//h3').extract():
            yield {"title": h3}

        for url in response.xpath('//a/@href').extract():
            yield scrapy.Request(url, callback=self.parse)
и да важный нюанс
есть одна бага встречающаяся нульбайт на странице, пере парсингом если будет вдруг ругаться, но это редко где встретишь
Код:
sel = Selector(text=response.text.replace('\x00', ''))
 
Последнее редактирование:
Назад
Сверху