2011-12-24 6 views
11

Sto cercando di:Cercando di accedere in Google al fine di scaricare i dati di Google Trends

  1. Accesso a Google
  2. Download dati CSV da Google Trends

ci sto riuscendo a (1) ma non in (2). Vengo tornato un'autorizzazione-token da parte di Google, e mando con la conseguente richiesta di tendenze, ma tuttavia Google poi restituisce un errore: "È necessario connettersi per esportare i dati da Google Trends":

// http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html 
$data = array(
    'accountType' => 'GOOGLE', 
    'Email'  => '[email protected]', 
    'Passwd'  => 'my.password', 
    'service'  => 'trendspro', 
    'source'  => 'company-application-1.0' 
); 

$ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin"); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    curl_setopt($ch, CURLOPT_HTTPAUTH, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $response = curl_exec($ch); 

    preg_match("/Auth=([a-z0-9_\-]+)/i", $response, $matches); 

    // We now have an authorization-token 
    $headers = array(
    "Authorization: GoogleLogin auth=" . $matches[1], 
    "GData-Version: 3.0" 
); 

    curl_setopt($ch, CURLOPT_URL, "http://www.google.com/trends/viz?q=MSFT&date=2011-2&geo=all&graph=all_csv&sort=0&sa=N"); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_POST, false); 
    $csv = curl_exec($ch); 
curl_close($ch); 

// Returns : "You must be signed in to export data from Google Trends" 
// Expected: CSV data stream 
print_r($csv); 

Per qualche motivo, i token di autenticazione che invii a Google Trends non vengono accettati o ignorati. Non so esattamente cosa succede, poiché non vengono fornite ulteriori informazioni di errore.

Qualcuno vede cosa sto facendo male? Se si riesce a farlo funzionare, il che significa che Google sta tornando i dati CSV, quindi la bontà è tuo e che entrambi hanno un ritardo presente :-) Natale


Così ho capito il problema non ha nulla a che fare con cURL. Quello che ho fatto è stato:

SID=DQAAAMUAAADMqt...aYPaYniC_iW 
LSID=DQAAAMcAAACI5...YDTBDt_xZC9 
Auth=DQAAAMgAAABm8...trXgqNv-g0H 
GData-Version: 3.0  
Authorization: GoogleLogin auth=DQAAAMgAAABm8...trXgqNv-g0H 
  • vengo tornato:

intestazioni:

Date: Tue, 27 Dec 2011 00:17:20 GMT 
Content-Encoding: gzip 
Content-Disposition: filename=trends.csv 
Content-Length: 97 
X-XSS-Protection: 1; mode=block 
Server: Google Trends 
X-Frame-Options: SAMEORIGIN 
Content-Type: text/csv; charset=UTF-8 
Cache-Control: private 

dati:

You must be signed in to export data from Google Trends 

In altre parole, sto inviando intestazioni come definito da Google su http://code.google.com/apis/accounts/docs/AuthForInstalledApps.html ma senza fortuna di ottenere un ritorno adeguato. C'è circa * nessuna * informazione sull'Interwebs a riguardo. Chissà qual è il problema qui?

+0

Avete controllato qui http://stackoverflow.com/questions/4986758/oauth-google-trends-download-csv-file – Pateman

+0

Grazie per il suggerimento. Il tuo link mi ha indirizzato a http://stackoverflow.com/questions/1656446/download-csv-from-google-insight-for-search, ma anche questo non risolve il problema. Sto facendo esattamente come spiegato lì, ma senza fortuna, e non riesco a vedere cosa sto facendo male ... – Pr0no

+0

Non sono sicuro che questo aiuti, ma un ragazzo ha avuto un problema con l'accesso ai siti web HTTPS usando cURL e il suo problema è stato risolto qui: http://stackoverflow.com/questions/316099/cant-connect-to-https-site-using-curl-returns-0-length-content-instead-what-c ​​ – Pateman

risposta

4

Dopo aver controllato il tuo codice, il problema è che Google Trends ha bisogno della chiave SID e non di Auth. Ecco il codice che ho scritto per scaricare del

<?php 

header('content-type: text/plain'); 

// Set account login info 
$data['post'] = array(
    'accountType' => 'HOSTED_OR_GOOGLE', // indicates a Google account 
    'Email'  => '', // full email address 
    'Passwd'  => '', 
    'service'  => 'trendspro', // Name of the Google service 
    'source'  => 'codecri.me-example-1.0' // Application's name, e.g. companyName-applicationName-versionID 
); 

$response = xhttp::fetch('https://www.google.com/accounts/ClientLogin', $data); 

// Test if unsuccessful 
if(!$response['successful']) { 
    echo 'response: '; print_r($response); 
    die(); 
} 

// Extract SID 
preg_match('/SID=(.+)/', $response['body'], $matches); 
$sid = $matches[1]; 

// Erase POST variables used on the previous xhttp call 
$data = array(); 

// Set the SID in cookies 
$data['cookies'] = array(
    'SID' => $sid 
); 

Questo usa il mio xhttp class, un involucro cURL csv.

+0

Il tuo collegamento alla classe xhttp reindirizza a una pagina di annunci casuali – Jones03

0

Hmm, non ho ancora lavorato con le API di Google, ma volevo entrare nell'API di Google Apps per un progetto imminente, quindi ho iniziato a scavare. La mia ipotesi è che poiché Trends non è in the list of services that implement the Google Data Protocol anche se si sta autenticando correttamente/con successo (verificato dalla sezione Auth della risposta) Google non onorerà il token di autenticazione per Trends (anche in questo caso è una buona ipotesi!).

Il mio pensiero è che è necessario utilizzare un metodo tradizionale per accedere a Google Trends e scaricare il CSV, vale a dire, agire come un browser dal client piuttosto che da un'app. Non sono sicuro su questo, ma ho trovato an older python client on github che afferma di essere in grado di scaricare CSV da Google Trends. C'è anche a blog post on the client. Potresti essere in grado di decodificarlo in un equivalente PHP, buona fortuna!

0

Sembra che Google non condona ufficialmente alcun utilizzo delle tendenze basato su script. Questo spiegherebbe il motivo per cui l'autenticazione fallisce poiché non accetta le connessioni API. Prova a utilizzare una libreria webclient per acquisire un cookie e utilizzarlo per raccogliere i dati. Questa era la soluzione utilizzata da quello collegato in precedenza python client on git.

Su una nota potenzialmente non correlata, si utilizza il servizio trendspro ma questo è il nome del servizio per le informazioni su google. Prova solo servizio => 'trends'

2

Strumento giusto per il lavoro corretto, avete considerato PhantomJS?

Potrebbe essere ancora più leggibile.

Problemi correlati