Alguem me consegue explicar porque é que não me retorna nada? penas diz que foi corrido com sucesso, mas sem qualquer retorno! Não vejo nada errado.
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */packagegooglesearchdemo;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavax.swing.text.Document;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;/** * * @author filip */publicclassGoogleSearchDemo{// pattern for extracting the link such as www.codeforeach.com/java/ ( domain// name + path )privatestaticfinalPatternp=Pattern.compile("([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/[^&]*)*");publicstaticvoidmain(String[]args)throwsIOException{StringsearchQuery="animais";List<String>links=searchGoogle(searchQuery);for(Stringlink:links){System.out.println(link);}}publicstaticList<String>searchGoogle(StringsearchQuery)throwsIOException{List<String>result=newArrayList<>();// lets get the top results counting to nearly 15Stringrequest="https://www.google.com/search?q="+searchQuery+"&num=15";org.jsoup.nodes.Documentdoc=Jsoup.connect(request).userAgent("Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)").get();// get the required content from response . Here ( h3 a ) is the selector// pattern for selecting all heading linksElementslinks=doc.select("h3 a[href]");for(Elementlink:links){StringhrefValue=link.attr("href");if(hrefValue.startsWith("/url?q="))result.add(extractLink(hrefValue));}returnresult;}// extract required link from href valueprivatestaticStringextractLink(Stringhref){Stringresult=null;Matcherm=p.matcher(href);if(m.find()){result=m.group();}returnresult;
Debuguei e deu o seguinte erro: Not able to submit breakpoint MethodBreakpoint [teste_email.Teste_email$1].getPasswordAuthentication '()Ljava/net/PasswordAuthentication;', reason: Breakpoint belongs to disabled source root 'C:\Users\filip\Documents\NetBeansProjects\teste_email\src'. See Window/Debugging/Sources.
Sabe como resolver?
J
j-menezes
Qual IDE vc está usando ?
A
ASHAMM
Uso o NetBeans
J
j-menezes
qual versão o NetBeans e qual a versão Java está sendo compilado seu projeto ?
A
ASHAMM
Utilizo no netbeans 8.2 e a versão do java é 1.8.0_191
Obrigado pela ajuda!
J
j-menezes
Desculpa, somente posso dar uma olhada no seu codigo no final de semana, se tiver resolvido até lá posta aqui no forum como solucionado.
A
ASHAMM
Ok! Agradeço a sua ajuda! Vou tentando!
J
j-menezes
Qual a versão do jsoup está usando ?
A
ASHAMM
Utilizo a versão jsoup 1.12.1
J
j-menezes1 like
blz, amanha eu vejo
J
j-menezes3 likes
Olha, verifiquei o programa e somente encontrei um erro minimo na parser da pagina da google. Bom, Eu tambem coloquei um decode pra ver se o resultado estava correto quando colocasse o endereço no navegador. Funcionou corretamente.
importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.net.URLDecoder;importjava.nio.charset.StandardCharsets;importjava.util.ArrayList;importjava.util.List;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavax.swing.text.Document;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;publicclassGoogleSearchDemo{// pattern for extracting the link such as www.codeforeach.com/java/ ( domain// name + path )privatestaticfinalPatternp=Pattern.compile("([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/[^&]*)*");publicstaticvoidmain(String[]args)throwsIOException{StringsearchQuery="animais";List<String>links=searchGoogle(searchQuery);for(Stringlink:links){System.out.println(link);}}publicstaticList<String>searchGoogle(StringsearchQuery)throwsIOException{List<String>result=newArrayList<>();// lets get the top results counting to nearly 15Stringrequest="https://www.google.com/search?q="+searchQuery+"&num=15";org.jsoup.nodes.Documentdoc=Jsoup.connect(request).userAgent("Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)").get();// get the required content from response . Here ( h3 a ) is the selector// pattern for selecting all heading links//% System.out.println( "--> \n" + doc.toString() ); //% Elements links = doc.select("h3 a[href]"); Elementslinks=doc.select("a[href]");for(Elementlink:links){StringhrefValue=link.attr("href");if(hrefValue.startsWith("/url?q=")){try{hrefValue=URLDecoder.decode(hrefValue,StandardCharsets.UTF_8.toString());result.add(extractLink(hrefValue));}catch(UnsupportedEncodingExceptionex){thrownewRuntimeException(ex.getCause());}}}returnresult;}// extract required link from href valueprivatestaticStringextractLink(Stringhref){Stringresult=null;Matcherm=p.matcher(href);if(m.find()){result=m.group();}returnresult;}}
Bons Codigos
A
ASHAMM1 like
Já funcionou! Muito obrigado pela ajuda, a sério!
A
ASHAMM
Mas já agora, pode-me explicar a lógica se eu quisesse buscar os nomes e não os links?! Seria mais fácil?
J
j-menezes1 like
Bom, primeiramente você precisa ver dentro como está o html.
Pra fazer isso é bem simples,pode colocar um breakPoint atraves do debug na linha de parada e ver o que o jsoup esta retornando.
Agora dê uma analisada na fonte e tambem na documentação da jsoup.
Vou postar o fonte com essa alteração pra você analisar melhor e fazer as alterações que te interessam.
E tambem destaco que existe outra forma de fazer isso, que é atraves da raspagem usando WebEngine e WebView, que podem ficar ocultos se necessário e usar uma função em javascript sendo chamada atraves da WebEngine.
importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.net.URLDecoder;importjava.nio.charset.StandardCharsets;importjava.util.ArrayList;importjava.util.List;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavafx.util.Pair;importjavax.swing.text.Document;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;publicclassGoogleSearchDemo{// pattern for extracting the link such as www.codeforeach.com/java/ ( domain// name + path )privatestaticfinalPatternp=Pattern.compile("([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/[^&]*)*");publicstaticvoidmain(String[]args)throwsIOException{StringsearchQuery="animais";List<Pair>links=searchGoogle(searchQuery);for(Pairlink:links){System.out.println("link="+link.getKey()+" url="+link.getValue());}}publicstaticList<Pair>searchGoogle(StringsearchQuery)throwsIOException{List<Pair>result=newArrayList<>();// lets get the top results counting to nearly 15Stringrequest="https://www.google.com/search?q="+searchQuery+"&num=15";org.jsoup.nodes.Documentdoc=Jsoup.connect(request).userAgent("Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)").get();// get the required content from response . Here ( h3 a ) is the selector// pattern for selecting all heading links// System.out.println( "--> \n" + doc.toString() );Elementslinks=doc.select(".kCrYT");for(Elementlink:links){Elementsel_a=link.select("a");StringhrefValue=el_a.attr("href");Elementsel_divs=el_a.select("div");Stringnome="";if(el_divs.size()>0){nome=el_divs.get(0).html();}if(hrefValue.startsWith("/url?q=")){try{Stringslink=extractLink(hrefValue);if(slink!=null){hrefValue=URLDecoder.decode(slink,StandardCharsets.UTF_8.toString());Pairpair=newPair(nome,hrefValue);result.add(pair);}}catch(UnsupportedEncodingExceptionex){thrownewRuntimeException(ex.getCause());}catch(java.lang.IndexOutOfBoundsExceptionie){ie.printStackTrace();// nao faca nada }}}returnresult;}// extract required link from href valueprivatestaticStringextractLink(Stringhref){Stringresult=null;Matcherm=p.matcher(href);if(m.find()){result=m.group();}returnresult;}}
A
ASHAMM1 like
É isso mesmo! Obrigado pela ajuda!
A
ASHAMM
Agradeço muito a sua ajuda! Mas tenho mais uma duvida:
Como posso retirar a data da noticia ou do artigo publicado?
Isto:
há 2 horas
Obrigado
J
j-menezes1 like
Voce precisa fazer o scan de um bloco do html que tenha esses dados.
A
ASHAMM
Obrigado
Seria possivel fazer a pesquisa no site do Google News?
A
ASHAMM
Consegue-me explicar isto? Não entendo onde foi buscar o .kCrYT
R
rodriguesabner
é o id do div class.
A
ASHAMM
Eu não consigo encontrar esse elemento .kCrYT no codigo fonte da pagina do google!
R
rodriguesabner
deve ter outro nome, procura o elemnto que vc quer buscar e insere ele no seu codigo
J
Solucao aceita
j-menezes
Se você no navegador usar a opção Inspecionar não vai aparecer, agora se usar o conteudo antes do navegador exibir atraves do jsoup vai aparecer.
Provavel que o o Site chame alguma função interna que troca o nome, vi que o “kCrYT” no navegador aparece como “r”.
Parece que é a mesmo coisa, mas não necessariamente.
O jsoup obtem o retorno do servidor puro, agora quando vai renderizar esse conteudo, dentro da propria pagina, como Eu disse pode ser chamada alguma função e alterar algumas coisas, seja por segurança ou pelo conjunto interno das coisas.
A
ASHAMM
Desculpa estar a ser chato mas como faço isso? Já pesquisar mas não encontrei nada
J
j-menezes
Voce tem que interceptar o conteudo apos o retorno do jsoup.
Tem paginas que sim, o mesmo conteudo que vem será o mesmo a ser exibido, mas isso não é uma regra.
J
j-menezes
Do mais, se você quer pegar o conteúdo exatamente igual está na apresentação da pagina, nesse caso o jsoup não é indicado, embora muitos achem que seja a mesma coisa, mas não, a prova é essa do search do google.
Se quiser pegar exatamente como o navegador apresenta, tem que fazer raspagem usando WebView e WebEngine.
A
ASHAMM
Adaptei o codigo para pesquisar uma palavra no google news e retornar o titulo e o link da noticia. Mas não me retorna nada! O que esta errado? Consegues-me ajudar? Ja intercetei o conteudo pelo jsoup e não ercebo porque nao está a funcionar!
Aqui esta o codigo:
packagegooglesearch;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.net.URLDecoder;importjava.nio.charset.Charset;importjava.nio.charset.StandardCharsets;import staticjava.nio.charset.StandardCharsets.UTF_8;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importjavafx.util.Pair;importjavax.swing.text.Document;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;publicclassGoogleSearch{// pattern for extracting the link such as www.codeforeach.com/java/ ( domain// name + path )compile("([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/[^&]*)*");privatestaticfinalPatternp=Pattern.compile("([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,6}(/[^&]*)*");privatestaticStringrequest;publicstaticvoidmain(String[]args)throwsIOException{Scannerler=newScanner(System.in);System.out.println("Insira a palavra: ");Stringpesquisa=ler.nextLine();pesquisa=pesquisa.toLowerCase();StringsearchQuery=pesquisa;List<Pair>links=searchGoogle(searchQuery);for(PairtitulosResultados:links){System.out.println("Titulo: "+titulosResultados.getKey());System.out.println("Link: "+titulosResultados.getValue());}}publicstaticList<Pair>searchGoogle(StringsearchQuery)throwsIOException{List<Pair>result=newArrayList<>();// lets get the top results counting to nearly 15request="https://news.google.com/search?q="+searchQuery+"&hl=pt-PT&gl=PT&ceid=PT%3Apt-150";org.jsoup.nodes.Documentdoc=Jsoup.connect(request).userAgent("Mozilla/5.0 (compatible; Googlebot/2.1; +http://news.google.com/bot.html)").get();// get the required content from response . Here ( h3 a ) is the selector// pattern for selecting all heading links// System.out.println( "--> \n" + doc.toString() );Elementslinks=doc.select(".xrnccd");for(Elementlink:links){Elementsel_a=link.select("h3");StringhrefValue=el_a.attr("a");Elementsel_divs=el_a.select("div");Stringnome="";if(el_divs.size()>0){nome=el_divs.get(0).html();}if(hrefValue.startsWith("/url?q=")){try{Stringslink=extractLink(hrefValue);if(slink!=null){hrefValue=URLDecoder.decode(slink,StandardCharsets.UTF_8.toString());Pairpair=newPair(nome,hrefValue);result.add(pair);}}catch(UnsupportedEncodingExceptionex){thrownewRuntimeException(ex.getCause());}catch(java.lang.IndexOutOfBoundsExceptionie){ie.printStackTrace();}}}returnresult;}// extract required titulosResultados from href valueprivatestaticStringextractLink(Stringhref){Stringresult=null;Matcherm=p.matcher(href);if(m.find()){result=m.group();}returnresult;}}
Obrigado pela ajuda
J
j-menezes
Esse é um trabalho de paciência e testes.
Quando debugar e estiver na linha de interesse, vais testando as instruções do jsoup até trazer exatamente o que de fato desejas.