Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Скрипт парсинга adwords.google.com


Автор: Elfer 19.3.2009, 18:14
Пишу скрипт, который по ключевому слову залезет в google и проверит кол-во запросов.
Обычно мы делаем так: Открываем https://adwords.google.com/select/KeywordToolExternal .
Вводим ключевое слово и подтверждаем капчу. Открывается страничка https://adwords.google.com/select/KeywordToolExternal?defaultView=2 и тут же Ajax'ом подгружается таблица по данному запросу.
Например, я смотрю слово "вода". Получается "Приблизительное среднее количество запросов" - 165 000

Открываю консоль Firebug'а и вижу адрес, по которому грузится эта инфа:
_https://adwords.google.com/select/VariationsTool?adgroupid=0&campaignid=0&adgroupIntegrated=false&skipLogin=true&currencyCode=USD&maxCpcOverride=&targetLanguages=ru&targetCountries=*&synonyms=true&captchaAnswer=qmwfyau&suggest=true&excludedWords=&allowExisting=true&showAdult=false&showTrademark=null&keywords=%D0%B2%D0%BE%D0%B4%D0%B0

Пробую загрузить эту страничку через скрипт, мне возвращает:
Время вашей сессии истекло. Вернитесь на главную страницу AdWords  и снова войдите в систему. 

Но, если я вышеописанную ссылку открываю в браузере - все нормально, загружается нужная мне информация. Есть предположение, что google, как-то определяет, через браузер я открываю страничку или через скрипт. Но и этот момент я предусмотрел и в CURLOPT_USERAGENT пихаю инфу браузера.

Код

$url = 'https://adwords.google.com/select/VariationsTool?adgroupid=0&campaignid=0&adgroupIntegrated=false&skipLogin=true&currencyCode=USD&maxCpcOverride=&targetLanguages=ru&targetCountries=*&synonyms=true&captchaAnswer=qmwfyau&suggest=true&excludedWords=&allowExisting=true&showAdult=false&showTrademark=null&keywords=%D0%B2%D0%BE%D0%B4%D0%B0';
function get_content($url) {
    $ua = $_SERVER['HTTP_USER_AGENT'] ? $_SERVER['HTTP_USER_AGENT'] : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
    $ch = curl_init( );
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_USERAGENT, $ua );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array( "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3", "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7" ) );
    curl_setopt( $ch, CURLOPT_ENCODING, "gzip, deflate" );
    
    // Для https страничек отключаем сертификаты
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt( $ch, CURLOPT_TIMEOUT, 20 );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    $result = curl_exec( $ch );
    curl_close( $ch );
    return $result;
}


Даже https://adwords.google.com/select/KeywordToolExternal пытаюсь загрузить через скрипт, грузится все, кроме капчи, т.е. даже капчу не введешь.

У кого какие идеи?

Автор: enof 19.3.2009, 18:17
Сначала пройти авторизацию и сохранить все куки, а потом олучать страницы.

Автор: Elfer 19.3.2009, 18:21
Там нет авторизации. Единственное что там надо, так это ввести капчу. Скрипт загружает эту страничку, а вместо капчи написано "false"

Автор: enof 19.3.2009, 18:41
Elfer, сохраните куки.

Автор: Elfer 19.3.2009, 18:53
Подскажите, please, как их программно сохранить? Что-то нашел в Инете, но, наверное не то. Так как файл куков, после загрузки все равно остается пустым. Код куков:
Код

    $cfile = "./cookies/google.txt";
    if ( !file_exists( $cfile ) )
    {
        $cf = @fopen( $cfile, "w+" );
        if ( $cf )
        {
            @fclose( $cf );
        }
    }
    curl_setopt( $ch, CURLOPT_COOKIEJAR, $cfile );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, $cfile );


Соответственно вставил его в тело функции:
Код

function get_content( $url ) {
    $ua = $_SERVER['HTTP_USER_AGENT'] ? $_SERVER['HTTP_USER_AGENT'] : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
    $ch = curl_init( );
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_USERAGENT, $ua );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array( "Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3", "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7" ) );
    curl_setopt( $ch, CURLOPT_ENCODING, "gzip, deflate" );
    
    // Для https страничек отключаем сертификаты
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt( $ch, CURLOPT_TIMEOUT, 20 );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    
    $cfile = "./cookies/google.txt";
    if ( !file_exists( $cfile ) )
    {
        $cf = @fopen( $cfile, "w+" );
        if ( $cf )
        {
            @fclose( $cf );
        }
    }
    curl_setopt( $ch, CURLOPT_COOKIEJAR, $cfile );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, $cfile );
    
    $result = curl_exec( $ch );
    curl_close( $ch );
    return $result;
}

Автор: enof 19.3.2009, 20:01
Смотрите какие заголовки отправляются, че js делает и т.д. сразу так не сказать что именно надо сделать.
ff+firebug+livehttpheaders вам в помощь.

Автор: SureGOOD 25.3.2009, 16:37
я делал такой скрипт, но я делал с авторизацией, но учитывая политику гугла, уверен, что и без авторизации там камней много, могу сказать, что js скрипты там ничего важного не устанавливают, смотришь отправляемые заголовки и принимаемые(перед этим советую почистить куки)

Автор: Elfer 25.3.2009, 16:45
Вообщем, не получается у меня ничерта, ввожу капчу, отправляю запрос с капчей-ответом, принимаю и отправляю куки, все равно не прокатывает.
SureGOOD, может что подскажете?

Автор: SureGOOD 25.3.2009, 20:29
ну обычным COOKIEJAR,COOKIEFILE тут не обойтись, там вручную желательно формировать куки(не ручаюсь, но я делал так), а отправлять можно тем же курлом, тем более, что это удобно, внимательно (!!!) посмотрите заголовки при отправке, до отправки и вообще все это нужно досконально проанализировать, гугл парсерам устраивает большие сложности, каждый инструмент имеет свои сложности, но с куками работа идет примерно одна и та же, а вообще для вашей цели советовал бы использовать инструмент "Оценщик траффика" все в том же адвордсе, мне кажется там данные более достоверные, хотя проблемы вашей это не решит)

Автор: SureGOOD 30.3.2009, 15:55
Ну как у вас дела?)получилось?)

Автор: Elfer 30.3.2009, 15:59
Слишком много время отнимает. Бросил это дело - ничего не получается. На первое время сделал ручное заполнение статистики запросов. Позже буду опять добивать этот вопрос

Автор: SamDark 2.7.2009, 01:44
Elfer,
API вроде у них не так дорог. Вот для AdSense подобное дело оправдано: не дают небольшим проектам API.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)