Skip to content

Code contest #1

Google I’m Feeling Lucky: fazer uma requisição para http://www.google.com.br, pesquisando pelo nome da linguagem(java,ruby,…). Exibir como retorno o endereço, título e descrição do primeiro resultado encontrado.

Ruby (meu):

require 'open-uri'
open('http://www.google.com.br/search?q=ruby').read =~ %r{class=l href="(.*?)">(.*?)</a.*?j><font.*?>(.*?)<br><}m
puts ($2 + "\n" + $1 + "\n" + $3 + "\n").gsub(/<.*?\>/, '')

Java (do Giuliano, bastante melhorada depois pelo Urubatan):

import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;

public class HTTPSample {
       public static void main(String[] args) throws Exception {
               URLConnection con = new URL("http://www.google.com/search?q=java").openConnection();
               con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
               Scanner sc = new Scanner(con.getInputStream());
               System.out.println(sc.findWithinHorizon("<a>.*?</a>", 0).replaceAll("<a>(.*?)</a>", "$2=$1").replaceAll("", ""));
       }
}

PHP (do Pilger, com ajuste do Fernando):

<?php
  $html = implode('', file('http://www.google.com.br/search?q=php'));
  preg_match_all("|class=l href=\"(.*?)\">(.*?)</a.*?j><font.*?>(.*?)<br><|", $html, $out, PREG_SET_ORDER);
  echo $out[0][1]." ".$out[0][2]." ".$out[0][3];
?>

Python (do Salviato):

 import urllib
 import re

 class AppURLopener(urllib.FancyURLopener):
   version = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1"

 urllib._urlopener = AppURLopener()

 html = urllib.urlopen('http://www.google.com.br/search?q=python').read()
 out = re.search('class=l href="(.*?)">(.*?)</a.*?j><font.*?>(.*?)<br><', html, re.DOTALL)
 print re.sub('<.*?>', '', (out.group(1) + '\n' + out.group(2) + '\n' + out.group(3)))

TCl/TK (do Salviato):

 package require http
 http::config -useragent {Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1}
 set html [http::data [http::geturl {http://www.google.com.br/search?q=tcl}]]
 set out [regexp -inline {class=l href="(.*?)">(.*?)(.*?)< } $html]
 puts [regsub -all {<.*?>} [concat "[lindex $out 1]\n[lindex $out 2]\n[lindex $out 3]"] "" ]

VB (do Giuliano):

   Dim http As New WinHttp.WinHttpRequest
   Dim re As New RegExp, matcher As Match
   Dim texto As String
   http.Open "GET", "http://www.google.com.br/search?q=java", False
   http.SetRequestHeader "User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"
   http.Send
   texto = http.ResponseText
   re.Pattern = "class=l href=""(.*?)"">(.*?)</a.*?j><font.*?>(.*?)<br><"
   re.Global = True
   re.IgnoreCase = True
   re.MultiLine = True
   For Each matcher In re.Execute(texto)
       Dim strSaida: strSaida = ""
       strSaida = matcher.SubMatches(0) + vbCrLf + matcher.SubMatches(1) + vbCrLf + matcher.SubMatches(2)
       MsgBox strSaida
       Exit For
    Next

Coldfusion (do Kenji)

<cfhttp url="http://www.google.com.br/search?q=coldfusion+mx">
<cfset tmp = REFindNoCase('class=l href="(.*?)">(.*?)</a.*?j><font.*?>(.*?)<br><', cfhttp.filecontent,1,true)>
<cfoutput>#mid(cfhttp.filecontent,tmp.pos[2],tmp.len[2])# #mid(cfhttp.filecontent,tmp.pos[3],tmp.len[3])# #mid(cfhttp.filecontent,tmp.pos[4],tmp.len[4])#</cfoutput>

Popularity: 59% [?]

{ 10 } Comments

  1. Tiago | 31/03/2006 at 10:37 am | Permalink

    É incrível como cada vez eu tenho mais desgosto em ver código Java para coisas triviais do dia-a-dia… earkk

  2. Leonardo Goslar Otto | 31/03/2006 at 2:07 pm | Permalink

    Nossa to curtindo muito estes context.
    Quero ver quando o pessoal começar a postar Lisp e outras linguagens.
    Continuem o context, e que venham varias linguagens.
    Paranbéns pela iniciativa.

  3. Urubatan | 31/03/2006 at 6:09 pm | Permalink

    o código java pode ser beem menor do que este postado a cima, da uma olhada nisto aqui.

    PS.: concordo que java não é uma linguagem apropriada para processamento de textos assim, e a linha do header é por que o google não gosta de java, ele da um 403, se não colocar aquilo, para evitar consultas automatizadas.

    import java.net.URL;
    import java.net.URLConnection;
    import java.util.Scanner;
    public class HTTPSample {
    	public static void main(String[] args) throws Exception {
    		URLConnection con = new URL("http://www.google.com/search?q=java").openConnection();
    		con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
    		Scanner sc = new Scanner(con.getInputStream());
    		System.out.println(sc.findWithinHorizon(".*?", 0).replaceAll("(.*?)", "$2=$1").replaceAll("", ""));
    	}
    }
  4. Giuliano | 31/03/2006 at 7:32 pm | Permalink

    Urubatan,

    na verdade aquele header tem que ser setado porque o google bloqueia requisições que não tenham sido feitas por um browser para evitar leitura da sua página de resultados por programas de terceiros! Claro que tem sempre como burlar…hehehe…

    Agora só não me perguntem porque com Groovy, Ruby e PHP, não são necessárias.

    Hoje fiz um em VB que também necessitou desse header.

    Falou…

  5. Pedro | 02/04/2006 at 10:43 am | Permalink

    Diego, vou dar uma de velho, mas estou percebendo que existe uma pequena “sacanagem” neste contest, ehhe.

    Afinal, o que é “ganhar” o contest? É escrever código mais curto? Mais LEET? Estes critérios na minha opinião não são adequados.

    Afinal, o maior desafio nosso é manter código, não escrever. Escrever é fácil. Então dois critérios me parecem um alerta sobre a qualidade deste tipo de solução:

    * A menos que você seja o pai das regexps, é muito difícil ler estas soluções. Expressão regular longa e com 3 matches não é algo para bater o olho e compreender.

    * Se amanhã o Google mudar o HTML, como vamos dar manutenção neste tipo de solução? A correção vai envolver entender algo relativamente complicado - e reescrever algo igualmente complicado.

    Como diria o jwz: “Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems”.

    hehe, é isso, apenas uma nota. Não que eu tenha uma solução melhor, e ainda assim todas demonstram muita “bad 0wnage”.

  6. Giuliano | 02/04/2006 at 4:35 pm | Permalink

    JavaScript

                var str = document.body.innerHTML;
                var reg = /class=l href="(.*?)">(.*?)(.*?)/gi;
                var m = reg.exec(str);
                if(m) {
                    var saida = "Titulo: " + m[1] + "\n";
                    saida += "Link: " + m[2].replace(c, "") + "\n";
                    saida += "Descrição: " + m[3].replace(c, "") + "\n";
    
                    alert(saida);
                }
    
  7. Thingol | 05/04/2006 at 2:52 pm | Permalink

    Expressões regulares? Use a Google API. Não há nada mágico aqui.
    [code]
    import com.google.soap.search.*;
    class ImFeelingLucky {
    public static void main(String[] args) {
    String clientKey = “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”; // substitua por sua chave Google API
    GoogleSearch gs = new GoogleSearch();
    gs.setKey (clientKey);
    gs.setMaxResults(1);
    gs.setQueryString (”java”);
    GoogleSearchResult gsr = null;
    try {
    gsr = gs.doSearch();
    GoogleSearchResultElement[] gsre = gsr.getResultElements();
    for (int i = 0; i

  8. Diego Pires Plentz | 05/04/2006 at 10:30 pm | Permalink

    Pedro,

    Respondendo às suas perguntas.

    Afinal, o que é “ganhar” o contest? É escrever código mais curto? Mais LEET? Estes critérios na minha opinião não são adequados.

    Na verdade nem existe ganhador, é somente um comparativo de códigos mesmo.

    * A menos que você seja o pai das regexps, é muito difícil ler estas soluções. Expressão regular longa e com 3 matches não é algo para bater o olho e compreender.

    Acredito que sem usar regexp’s nenhum desses códigos ficaria mais legível. Independente do programador conhecer ou não regexp’s.

    * Se amanhã o Google mudar o HTML, como vamos dar manutenção neste tipo de solução? A correção vai envolver entender algo relativamente complicado - e reescrever algo igualmente complicado.

    Sem dúvida.

    Como diria o jwz: “Some people, when confronted with a problem, think “I know, I’ll use regular expressions.” Now they have two problems”.

    Há controversias :)

    Mas legais as observações. Abraço

  9. Rafael | 06/04/2006 at 11:53 am | Permalink

    hhuumm, queria conhecer o Pedro, gostei do comentário dele.
    Ta bom ta bom, eu sei que to devendo uma versão .NET pra ti..
    Não reclama..

    Abraço.

  10. Rodrigo Urubatan | 13/07/2007 at 4:24 pm | Permalink

    Minha vez de lançar um code contest pra galera
    http://www.urubatan.com.br/2007/07/13/code-contest-valendo-uma-cortesia-para-o-just-java-2007/
    Valendo uma entrada de grátis pro Just Java :D

{ 5 } Trackbacks

  1. Nullability » Code contest | 30/03/2006 at 8:13 pm | Permalink

    [...] Aceitei a intimação do Diego e topei o primeiro desafio usando Groovy. O código segue abaixo: [code lang=”Java”] def content = new URL(”http://www.google.com.br/search?q=groovy”).getText(); def text = (content =~/class=l href=”(.*?)”>(.*?)< /a.*?j>(.*?)   [...]

  2. Nullability » Rapidinhas | 06/04/2006 at 9:55 pm | Permalink

    [...] Conversas com o Guillaume Laforge sobre alterações no Groovy SDK para o bem da humanidade (tudo por causa do Diego). [...]

  3. Nullability » Code Contest - 2 | 07/04/2006 at 4:14 pm | Permalink

    [...] A primeira parte pode ser encontrada aqui. O desafio desta semana é simples. Imagine que você tem um mecanismo de backup beeeeeeeeeem barato, isto é, você tem pouco espaço para armazenamento. Portanto, você quer remover do seu backup todos os arquivos de um determinado diretório (algo como /tmp/backup) que sejam mais velhos do que 1 semana. Como você faria isso usando sua linguagem favorita? [...]

  4. [...] faz mais de ano que o Diego Pires Plentz meu falou sobre as inovações do Ruby on Rails, na época eu era um programador Delphi fazendo uns “bicos” com C#. No dia chegamos a [...]

  5. [...] de um Code Contest no blog do Diego Plentz a algum tempo, a idéia era mostrar a forma mais fácil em cada linguagem [...]

Post a Comment

Your email is never published nor shared. Required fields are marked *