2011-09-22 4 views
9

Puoi utilizzare Jsoup per inviare una ricerca a Google, ma invece di inviare la tua richiesta tramite "Ricerca Google" utilizza "Mi sento fortunato"? Vorrei catturare il nome del sito che verrebbe restituito.Jsoup può simulare la pressione di un pulsante?

Vedo molti esempi di invio di moduli, ma mai un modo per specificare un pulsante specifico per eseguire la ricerca o l'invio di moduli.

Se Jsoup non funziona, quale sarebbe?

+0

Intendi JSONP? L'API di ricerca di Google è http://code.google.com/apis/customsearch/v1/overview.html – ceejayoz

+0

@Ceejayoz: posiziona il mouse sopra il tag '[jsoup]' sotto la domanda fino a quando non viene visualizzata una popbox, quindi fai clic su di essa * info * link per saperne di più. – BalusC

+0

@BalusC Direi che è stata una richiesta abbastanza equa di chiarimenti, considerando il contenuto della domanda e il JSOUP a una lettera maiuscola. – ceejayoz

risposta

11

Secondo la fonte HTML del http://google.com il pulsante "Mi sento fortunato" ha un nome di btnI:

<input value="I'm Feeling Lucky" name="btnI" type="submit" onclick="..." /> 

Così, semplicemente aggiungendo il parametro btnI alla stringa di query dovrebbe fare (il valore non ha importanza):

http://www.google.com/search?hl=en&btnI=1&q=your+search+term

Quindi, questa Jsoup dovrebbe fare:

String url = "http://www.google.com/search?hl=en&btnI=1&q=balusc"; 
Document document = Jsoup.connect(url).get(); 
System.out.println(document.title()); 

Tuttavia, questo ha dato un errore di 403 (Forbidden).

Exception in thread "main" java.io.IOException: 403 error loading URL http://www.google.com/search?hl=en&btnI=1&q=balusc 
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:387) 
    at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:364) 
    at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:143) 
    at org.jsoup.helper.HttpConnection.get(HttpConnection.java:132) 
    at test.Test.main(Test.java:17) 

Forse Google stava annusando l'agente utente e scoprendo che si trattava di Java. Così, ho cambiato:

String url = "http://www.google.com/search?hl=en&btnI=1&q=balusc"; 
Document document = Jsoup.connect(url).userAgent("Mozilla").get(); 
System.out.println(document.title()); 

Questo produce (come previsto):

Il Codice BalusC

Il 403 è comunque un'indicazione che Google non è necessariamente felice con i bot come quello. È possibile ottenere (temporaneamente) l'IP-banned quando lo fai troppo spesso.

+0

Grazie BalusC. Questo ha risposto alla domanda perfettamente. Vedo come tale richiesta di URL sia univoca per il sito di Google.Stavo cercando di capire se puoi letteralmente programmare Jsoup per fare clic su un pulsante specifico usando Google come esempio. Meglio chiarire cosa sto cercando di fare nella mia altra domanda su questo sito. Quella domanda non è stata risolta in un mese e si è frustrata quindi ha fatto una domanda diversa nella speranza che mi sarebbe stata d'aiuto con la prima. Sfortunatamente il mio piano è fallito e mi scuso per aver dedicato del tempo a rispondere a una domanda che non risolve il mio problema. – Brian

0

Sì, è possibile, se si è in grado di capire come vengono eseguite le query di ricerca di Google. Ma questo non è permesso da Google, anche se avresti successo con quello. Dovresti utilizzare la loro API ufficiale per effettuare query di ricerca automatizzate.

http://code.google.com/intl/en-US/apis/customsearch/v1/overview.html

+0

Grazie per la risposta. Tuttavia, stavo solo usando Google come esempio. Ho un sito che sto cercando di utilizzare JSOUP con per accedere e ottenere alcune informazioni indietro. Non credo di aver effettuato l'accesso. Sto cercando di scoprire come simulare premendo il pulsante "login" o "invia" in modo generico per assicurarmi che stia effettuando l'accesso al sito. Dispiace per la confusione. – Brian

2

Vorrei provare HtmlUnit per la navigazione attraverso un sito e JSOUP per scraping

+0

quindi come si possono usare htmlUnit e jSoup in combinazione? edit: get it .. jSoup.parse può analizzare la stringa html fornita da htmlUnit – tObi