2011-09-22 19 views
9

Czy możesz użyć Jsoup do przesłania zapytania do Google, ale zamiast wysyłać prośbę za pomocą "Wyszukiwarki Google", użyj "Czuję się dobrze"? Chciałbym uchwycić nazwę strony, która zostanie zwrócona.Czy Jsoup może symulować naciśnięcie przycisku?

Widzę wiele przykładów przesyłania formularzy, ale nigdy nie można określić konkretnego przycisku do wyszukiwania lub przesyłania formularzy.

Jeśli Jsoup nie będzie działać, co by było?

+0

Masz na myśli JSONP? Interfejs API wyszukiwarki Google to http://code.google.com/apis/customsearch/v1/overview.html – ceejayoz

+0

@ Ceejayoz: umieść mysz nad znacznikiem '[jsoup]' pod pytaniem, aż wyświetli się popbox, a następnie kliknij terminarz * info * link, aby się o tym dowiedzieć. – BalusC

+0

@BalusC Powiedziałbym, że był to wystarczająco sprawiedliwy wniosek o wyjaśnienia, biorąc pod uwagę treść pytania i all-caps, jednoliterowy JSOUP. – ceejayoz

Odpowiedz

11

Według źródła HTML http://google.com przycisk „Czuję szczęście” ma nazwę btnI:

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

Tak, tylko dodanie parametru do łańcucha zapytania btnI powinien zrobić (wartość nie ma znaczenia):

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

Tak, to Jsoup powinien zrobić:

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

Jednak ta dała błąd 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) 

Być może Google wąchał agenta użytkownika i odkrył, że jest to Java. Tak, zmieniłem go:

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()); 

Daje to (zgodnie z oczekiwaniami):

Kodeksu BalusC

403 jest jednak wskazanie, że Google nie zawsze jest zadowolony z botami tak. Możesz uzyskać (tymczasowo) IP-banned, gdy robisz to zbyt często.

+0

Dzięki BalusC. To doskonale odpowiedziała na pytanie. Widzę, że to żądanie adresu URL jest unikalne dla witryny Google.Próbowałem dowiedzieć się, czy możesz dosłownie zaprogramować Jsoup, aby kliknął konkretny przycisk, używając Google jako przykładu. Lepiej wyjaśnię, co próbuję zrobić w innym moim pytaniu na tej stronie. Na to pytanie nie odpowiedziano w ciągu miesiąca i sfrustrowano, więc zadałem inne pytanie w nadziei, że pomoże mi ono w pierwszej. Niestety, mój plan się popsuł i przepraszam, że poświęciłem czas na odpowiedź na pytanie, które nie rozwiązuje mojego problemu. – Brian

0

Tak, może, jeśli jesteś w stanie dowiedzieć się, w jaki sposób są wyszukiwane zapytania Google. Ale Google nie zezwala na to, nawet jeśli odniosłoby to sukces. Powinieneś używać oficjalnego API do automatycznego wyszukiwania zapytań.

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

+0

Dzięki za odpowiedź. Korzystałem jednak z google jako przykładu. Mam stronę, do której próbuję użyć JSOUP, aby się zalogować i odzyskać trochę informacji. Nie sądzę, abym się logował. Próbuję dowiedzieć się, jak symulować, naciskając przycisk "Zaloguj się" lub "Prześlij", aby upewnić się, że faktycznie loguję się na stronie. Przepraszam za zamieszanie. – Brian

2

Chciałbym wypróbować HtmlUnit do nawigacji po stronie i JSOUP do skrobania

+0

, więc w jaki sposób można używać kombinacji htmlUnit i jSoup? edit: got it ... jSoup.parse potrafi parsować ciąg html podany przez htmlUnit – tObi

Powiązane problemy