Diego Plentz

29 Mar, 2006

Code contest #1

Posted by: Diego Plentz In: Unsorted| java| php| python| ruby

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: 53% [?]

16 Responses to "Code contest #1"

1 | Nullability » Code contest

March 30th, 2006 at 8:13 pm

Avatar

[...] 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 | Tiago

March 31st, 2006 at 10:37 am

Avatar

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

3 | Leonardo Goslar Otto

March 31st, 2006 at 2:07 pm

Avatar

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.

4 | Urubatan

March 31st, 2006 at 6:09 pm

Avatar

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("", ""));
	}
}

5 | Giuliano

March 31st, 2006 at 7:32 pm

Avatar

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…

6 | Pedro

April 2nd, 2006 at 10:43 am

Avatar

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”.

7 | Giuliano

April 2nd, 2006 at 4:35 pm

Avatar

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

8 | Thingol

April 5th, 2006 at 2:52 pm

Avatar

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

9 | Diego Pires Plentz

April 5th, 2006 at 10:30 pm

Avatar

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

10 | Rafael

April 6th, 2006 at 11:53 am

Avatar

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.

11 | Nullability » Rapidinhas

April 6th, 2006 at 9:55 pm

Avatar

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

12 | Nullability » Code Contest - 2

April 7th, 2006 at 4:14 pm

Avatar

[...] 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? [...]

13 | Thiago Bohn » Blog Archive » Dynamic Language Runtime

May 3rd, 2007 at 9:53 am

Avatar

[...] 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 [...]

14 | Rodrigo Urubatan

July 13th, 2007 at 4:24 pm

Avatar

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

15 | No ruby parece tudo fácil, até screen scrapping … (E não estou falando do rails agora) | Blog do Urubatan

August 19th, 2007 at 9:46 pm

Avatar

[...] 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 [...]

16 | strongest weight loss and fat burner pill

September 24th, 2008 at 2:54 am

Avatar

strongest weight loss and fat burner pill…

ruthless slights Mackinac cleanliness?carbolic!…

Comment Form


  • Rodrigo Amaral Rosa: Olá Diego, como disse antes funcionou tudo certo no tutorial. Mas eu quis seguir um pouco mais além, configurando virtualhost no apache para o meu d
  • éricoulisses: absurdo: não consegui passar de 50kbps com o pacote de 500kbps, se cheguei a 50 foi um milagre, só fiz download de uma música e pronto, kkkkkk,
  • Tony Amorim: Ótimo Tutorial, parabéns.... Estou com problemas com pool de conexão no tomcat, não está funcionando. Funciona com o tomcat sózinho. Tony

Flickr PhotoStream

  • IMG_3498
  • IMG_3458
  • IMG_3450
  • IMG_3473
  • IMG_3469
  • IMG_3464
  • IMG_3444
  • IMG_3402

About

This is an example of a WordPress page, you could edit this to put information about yourself or your site so readers know where you are coming from.