2013-06-04 15 views
11

Sto utilizzando l'API di ricerca personalizzata di Google in Java per ottenere risultati di Google in risposta a una query. Ho scritto questo codice con l'aiuto di altri posti, il codice è il seguente:Ottenere più di 10 risultati dall'API di ricerca personalizzata di Google V1 in Java

url = new URL("https://www.googleapis.com/customsearch/v1?key="+key+ "&cx="+ cx +"&q="+ searchText+"&alt=json"+"&start="+0+"&num="+30); 
    HttpURLConnection conn2 = (HttpURLConnection) url.openConnection(); 
    System.out.println("Connection opened!"); 
    conn2.setRequestMethod("GET"); 
    conn2.setRequestProperty("Accept", "application/json"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(
    (conn2.getInputStream()))); 

Il problema è che ogni volta che sto usando il codice di cui sopra, senza num e Parametri di avvio è in esecuzione correttamente, ma dando solo top 10 risultati. Quindi ho usato num e parametri di avvio. Ma stanno creando problemi. Qui non riesco a capire dove mettere il num e start parametri nell'URL. Fornisce sempre HTTP 400, ad es. Bad Request. Ho letto la pagina della documentazione, inoltre non sono fornite istruzioni chiare su dove mettere questi due parametri in Url.

Quindi se qualcuno mi aiuta a risolvere questo problema, sarò davvero grato. Grazie.

risposta

16

Non puoi farlo in questo modo. num può essere solo un massimo di 10. Vedere

https://developers.google.com/custom-search/v1/using_rest#query-params

num Numero di risultati di ricerca per tornare
È possibile specificare i quanti risultati di tornare per la ricerca corrente. I valori validi sono numeri interi compresi tra 1 e 10 inclusi. Se num non viene utilizzato, il valore 10 è assunto.

per mostrare più risultati, Google suggerisce effettuare più chiamate, incrementando il parametro start in base alle esigenze:

http://support.google.com/customsearch/bin/answer.py?hl=en&answer=1361951

Google Custom Search e Google Site Search ritorno fino a 10 risultati per query . Se si desidera visualizzare più di 10 risultati all'utente, è possibile emettere più richieste (utilizzando i parametri start = 0, start = 11 ... ) e visualizzare i risultati su una singola pagina. In questo caso, Google considererà ogni richiesta come una query separata e, se si è utilizzando Google Site Search, ogni query verrà conteggiata al proprio limite.

+0

Sì, ma non riesco a capire dove dovrei inserire il parametro di avvio nell'URL, perché quando aggiungo start = 0 o start = 11 alla fine dell'URL come questo: https://www.googleapis.com/customsearch/v1? key = "+ key +" & cx = "+ cx +" & q = "+ searchText +" & alt = json "+" & start = "+ 0, sta dando lo stato HTTP 400 ie Bad Request. Quindi potresti dirmi esattamente come inquadrare questo url usando il parametro start – Joy

+0

Nel tuo codice, stampa l'URL che stai usando, ad esempio System.out.println (url.toString()), quindi copia e incolla nel browser. l'errore completo nel formato JSON, qualcosa del genere (Un esempio: ho appena omesso il parametro "q" per ottenere questo). Se non riesci a risolvere il problema, pubblica i risultati che ottieni qui. { "error": { "errori": [ { , "Messaggio" "necessaria" :: "dominio":, "ragione" "globale" "parametro richiesto: q", "LocationType": "parametro", "location": "q" } ] , "codice": 400, "messaggio": "Parametro richiesto: q" } } –

+5

Progettato in modo intelligente da Google. Facci fare più richieste, invece di restituire più risultati ... -.- – simon

-1

Prima di tutto, Google afferma: "I parametri di query che è possibile utilizzare con l'API di ricerca personalizzata JSON/Atom sono riepilogati in questa sezione. Tutti i valori dei parametri devono essere codificati in URL." https://developers.google.com/custom-search/v1/using_rest#query-params Significato che tutto dopo il "?" dovrebbe essere codificato con un equivalente dell'encoder php che stabilisce lo standard per l'urlencoding. Il fatto è che la classe URLEncoder di Java non ha proprio ragione, devi fare un paio di replaceAll. Hai bisogno di fare questo ai tuoi input:

String queryArguments = "key="+key+ "&cx="+ cx +"&q="+ searchText+"&alt=json"+"&start="+"0"+"&num="+"30"; 

Nota come ci sono quotazioni intorno ai numeri. Se si ottiene questi dalle variabili utilizzare il seguente:

String thenum = Integer.toString(theinteger); 

E poi la codifica corretta

String addition = URLEncoder.encode(queryArguments, "UTF-8") 
.replaceAll("\\%28", "(") 
.replaceAll("\\%29", ")") 
.replaceAll("\\+", "%20") 
.replaceAll("\\%27", "'") 
.replaceAll("\\%21", "!") 
.replaceAll("\\%7E", "~"); 

Poi si aggiunge che l'URL in chiaro originale:

String url = "https://www.googleapis.com/customsearch/v1?" 
String total = url + addition; 

In conclusione la vostra il codice sarà simile a questo:

String query = URLEncoder.encode("key="+key+ "&cx="+ cx +"&q="+ searchText+"&alt=json"+"&start="+"0"+"&num="+"30"), "UTF-8").replaceAll("\\%28", "(") 
.replaceAll("\\%29", ")") 
.replaceAll("\\+", "%20") 
.replaceAll("\\%27", "'") 
.replaceAll("\\%21", "!") 
.replaceAll("\\%7E", "~"); 
URL url = new URL("https://www.googleapis.com/customsearch/v1?" + query); 
HttpURLConnection conn2 = (HttpURLConnection) url.openConnection(); 
System.out.println("Connection opened!"); 
conn2.setRequestMethod("GET"); 
conn2.setRequestProperty("Accept", "application/json"); 
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn2.getInputStream()))); 

Spero che questo funzioni per voi. Ho fatto qualcosa di molto simile con la vecchia api immagine deprecata, ma il concetto è lo stesso e ho esaminato i nuovi documenti. :)

MODIFICA: Assicurarsi che il parametro num sia compreso tra 0 e 10 inclusi.

+0

Sì Signore, ho provato con il tuo primo metodo suggerito cioè ho messo le virgolette intorno ai numeri nell'URL . Ma ancora adesso sta dando lo stesso codice di errore 400, ad esempio una richiesta errata. Hai provato tu stesso? – Joy

+1

Ho già utilizzato l'API di ricerca immagini di Google, che è esattamente la stessa quando si usa, oltre alla necessità di una chiave API e dell'URL di base. Ho dimenticato di menzionare che è necessario che il parametro num sia di dieci o meno, come ha detto l'altro. Dovrebbe funzionare anche se si omette il parametro num, purché sia ​​compreso tra 0 e 10 inclusi. Vorrei chiarire che la codifica dell'URL è necessaria solo per le query che contengono degli spazi (cambiano in "% 20") e alcuni altri casi speciali. Anche l'ordine dei parametri non ha importanza in questo caso. In bocca al lupo! –

+3

errato: 'num' non può essere maggiore di 10 (incluso); i valori validi sono 1 ~ 10. 'start' non può essere' 0' valori validi sono numeri interi maggiori di 0. – Raptor

Problemi correlati