Página 1 de 3

Grep en web

NotaPublicado: 2007-10-03 12:53 @578
por joss
Lo que estoy intentado hacer es entrar en una web y buscar una palabra mediante grep. Y si existe que me lo confirme.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use IO::Socket::INET;
$sock = IO::Socket::INET->new(PeerAddr => "www.google.es", PeerPort => 80, Proto => "tcp");

$grep= "$sock | grep Web";

if($grep == 0)  {

    print "NO EXISTE\n";
}
else {
    print "EXISTE\n";
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Con ese script estoy intentando entrar a google y si me encuentra la palabra "Web" que me imprima "EXISTE". Pero ese code está mal.

NotaPublicado: 2007-10-03 12:59 @583
por explorer
Con IO::Socket haces la conexión, si... pero no estás haciendo la petición HTTP.

Te aconsejo que uses el paquete LWP. Mírate los ejemplos de lwpcook.

NotaPublicado: 2007-10-03 13:09 @589
por explorer
Copiado del lwpcook:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use LWP::Simple;
$doc = get 'http://www.google.es';
if ( $doc =~ m/ Web /mosix ) {
    print "EXISTE\n";
}
else {
    print "NO EXISTE\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

NotaPublicado: 2007-10-04 12:40 @570
por joss
Estoy intentando hacer algo más complicado ... Un script que te pida la URL de una web mediante argumentos... y después tu le metes desde el mismo programa parte de esa URL y que después haga el grep:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$host=$ARGV[0];

print "$host";

$comando=<STDIN>;

print "Comando injectado: $comando\n";

$doc = get '$host . $comando';

if ( $doc =~ m/ Web /mosix ) {
    print "EXISTE\n";
}
else {
    print "NO EXISTE\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Un ejemplo es:

Código: Seleccionar todo
argumento ==> www.localhost.com/index.asp?id=
comando ==> 72

Doc ==> www.localhost.com/index.asp?id=72


y después que haga el grep en esa url y si encuentra la palabra a buscar que lo diga... pero la cuestión es que está la palabra y me dice que no existe.

NotaPublicado: 2007-10-04 12:52 @578
por kidd
Haciendo unos pequeños cambios en el código vas a conseguir lo que quieres:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$host=$ARGV[0];

print "$host";

$comando=<STDIN>;

chomp $comando;

print "Comando injectado: $comando\n";

$doc = get($host . $comando);

if ( $doc =~ m/ Web /mosix ) {
    print "EXISTE\n";
}
else {
    print "NO EXISTE\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos

NotaPublicado: 2007-10-04 13:38 @609
por joss
Ya me funcionó. Pero me es muy vergonzoso preguntar cada problema que se me planteé... estoy buscando un manual que me explique la estructura a seguir en cada caso. Por ejemplo yo puse:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$doc = get '$host . $comando';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y por comerme unos simples paréntesis ya no me funcionó el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$doc = get($host . $comando);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Mirad como estoy con el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$host=$ARGV[0];

print "$host";

$comando=<STDIN>;

chomp $comando;

if ($comando =~ s/ /+/g) {
    print "Comando injectado: $comando\n";

    $doc = get ($host . $comando);

    if ( $doc =~ m/ Web /mosix ) {
        print "EXISTE\n";
    }
    else {
        print "NO EXISTE\n";
    }

} # fin del if del comando
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Le añadí:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($comando =~ s/ /+/g)
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Para que todos los espacios que haya en el comando se cambien por un +, para evitar errores.

Pero aún sigo queriendo hacer una cosa, por ejemplo si a mi me busca en la web la palabra "Web" , quiero que me imprima todo el párrafo que le prosigue.

Ejemplo: La web está muy bien.

Pues si el script encuentra la palabra web que imprima todo lo que le sigue, quedaría así: web está muy bien.

Pero no tengo ni idea por dónde empezar para hacer eso.

NotaPublicado: 2007-10-04 14:44 @656
por kidd
Muy bien, ya estamos hablando una cosa algo diferente, lo primero sería ¿qué consideras como un párrafo dentro de la página? ¿Cada línea separada? ¿Un bloque dentro de los tags de párrafo <p>?

Te podríamos ayudar más si pones un ejemplo de la página que estás leyendo y a base de ello el resultado que quisieras encontrar de ella.

Como comentario del código que tienes ahora, debes de hacer la sustitución sin el if, de lo contrario, si tu variable $comando no contiene espacios entonces se saltará por completo el bloque del if, y supongo que no deseas este comportamiento.

NotaPublicado: 2007-10-04 14:56 @664
por joss
Me refiero a un <p> en HTML. Ejemplo:

Código: Seleccionar todo
<<Comienzo>>

blablablablablablablablablablablablablablablablablablablablablablablabla
blablablablablablablablablablablabla.

<<FIn>>

blablablablablablablablablablablablablablablablablablablabla.


Respecto a los del if, ¿cómo podría cambiar los 'espacios' por '+' de otra forma a la que he puesto?

NotaPublicado: 2007-10-04 18:01 @792
por explorer
No fueron los paréntesis lo que falló. El fallo estuvo en usar comillas simples.

La regla es fácil: si hay comillas simples, no hay interpolación de variables.

Así que la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$doc = get '$host . $comando';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
hacía justo eso: almacenaba en $doc la cadena de caracteres literal que habías pasado: $host . $comando.

En cuanto al tema de los espacios: haces correctamente la sustitución con el s///, pero, ¿por qué (if) necesitas preguntar si lo ha hecho?

Es cuestión de lógica del programa saber el por qué pones la sustitución como una condición, si no quieres que sea una condición. Si quieres que sea solo una sustitución, te sobra la condición.

NotaPublicado: 2007-10-05 09:23 @432
por kidd
En primer lugar, como decía explorer, para quitar los espacios sin tener que usarlo como condicional, simplemente quitas el if y pones la línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$comando =~ s/ /+/g
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora, aún sigo sin ver el HTML que necesitas leer y parsear, por lo que creo que tienes dos opciones.

1. Usar el módulo HTML::Parser y sacar todos los <p> de tu HTML y luego realizar la búsqueda con el regexp en cada uno de ellos.

2. Si el código de tu HTML está exactamente como me pones en el ejemplo y cada párrafo está divido por dos saltos de línea '\n\n', entonces podrías hacer algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$host=$ARGV[0];

print "$host";

$comando=<STDIN>;

chomp $comando;

$comando =~ s/ /+/g;

print "Comando injectado: $comando\n";

$doc = get ($host . $comando);

#dividir por párrafos
my @parrafos = split /\n\n/, $doc;

for my $parrafo( @parrafos ){

    if ( $parrafo =~ m/ Web /mosix ) {
        print "EXISTE - $parrafo\n";
    }
    else {
        print "NO EXISTE\n";
    }

}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



Pero nuevamente, se te podría dar una respuesta más acertada si podemos ver el código del HTML que deseas parsear.

Saludos