Foros del Web » Programando para Internet » PHP »

Evitar utilizar loop recursivo

Estas en el tema de Evitar utilizar loop recursivo en el foro de PHP en Foros del Web. Hola compañeros de FDW!, estuve desarrollando un webcrawler y cuando pensé que lo había terminado surgió un error Utilizo un loop recursivo para visitar una ...
  #1 (permalink)  
Antiguo 27/10/2012, 17:01
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Busqueda Evitar utilizar loop recursivo

Hola compañeros de FDW!, estuve desarrollando un webcrawler y cuando pensé que lo había terminado surgió un error

Utilizo un loop recursivo para visitar una web, y si se cumplen ciertas condiciones comenzar la extracción, luego se vuelve a llamar una y otra ves a la función para que se repita hasta que ya no se cumpla alguna condición.

Pero eso no es lo peor, tenía una fecha para presentar este webcrawler en mi escuela, y yo creía que lo había terminado

Cuando pongo en funcionamiento el código solo extrae la pág principal y después no puede continuar debido al máximo de conecciones disponibles. ¿Qué puedo hacer para evitar repetir todo el tiempo y lograr consumir menos conecciones?

Les muestro el código completo:

Código PHP:
<?php
error_reporting
(E_ALL);
?>
<?php
$url 
"http://www.web.com";
$patron "http://www.web.com";
$prof 1;

function 
storeLink($titulo,$descripcion,$url,$keywords) {
    
$query "INSERT INTO webs (webTitulo, webDescripcion, weburl, webkeywords) VALUES ('$titulo', '$descripcion', '$url', '$keywords')";
    
mysql_query($query) or die('Error, falló la inserción de datos');
}

function 
extraer($url$prof){
$server_link mysql_connect("Serv""User""Pass"); 

if(!
$server_link){ die("Fall&oacute; la Conexi&oacute;n "mysql_error()); 

$db_selected mysql_select_db("DB"$server_link);
if(!
$db_selected){ die("No se pudo seleccionar la Base de Datos "mysql_error()); 


$url "http://www.web.com";
$patron "http://www.web.com";
$prof 1;
$userAgent 'Interredu';

$ch curl_init();
curl_setopt($chCURLOPT_USERAGENT$userAgent);
curl_setopt($chCURLOPT_URL,$url);
curl_setopt($chCURLOPT_HTTPHEADER, array(("Accept-Language: es-es,en")));
curl_setopt($chCURLOPT_FAILONERRORtrue);
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
curl_setopt($chCURLOPT_SSL_VERIFYHOSTFALSE);
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
curl_setopt($chCURLOPT_MAXREDIRS2);
curl_setopt($chCURLOPT_AUTOREFERERtrue);
curl_setopt($chCURLOPT_RETURNTRANSFER,true);
$htmlcurl_exec($ch);
if (!
$html) {
    echo 
"<br />cURL error number:" .curl_errno($ch);
    echo 
"<br />cURL error:" curl_error($ch);
    exit;
}

$dom = new DOMDocument();
@
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$hrefs $xpath->evaluate("/html/body//a");
$busqueda mysql_query("SELECT weburl FROM webs WHERE weburl='$url'");

if(
$prof and mysql_num_rows($busqueda)==and strpos($url$patron)!==FALSE){
    
preg_match_all ("(<title>(.*)<\/title>)siU"$html$title);
    
preg_match_all ("(<meta name=\"description\" content=\"(.*)\"\/>)siU"$html$description);
    
preg_match_all ("(<meta name=\"keywords\" content=\"(.*)\"\/>)siU"$html$keys);
    
$titulo $title[1][0];
    
$descripcion $description[1][0];
    
$keywords $keys[1][0];
    
storeLink($titulo,$descripcion,$url,$keywords);
    }
for (
$i 0$i $hrefs->length$i++) {
    
$href $hrefs->item($i);
    
$url2 $href->getAttribute('href');
    
extraer($url2$prof ++);
}
}
extraer($url$prof);
?>
Saludos y gracias por su ayuda!!!!
  #2 (permalink)  
Antiguo 27/10/2012, 18:30
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Vi que utilizas @ para ocultar errores,
Mira con DOMDocumnt puedes capturar esos errores;
Código PHP:
Ver original
  1. // Activas Captura de Errores
  2. // Despues creas y cargas que es donde generalmente se producen los errores (load)
  3.  
  4. $errores = libxml_get_errors();
  5.  
  6. // limpias el buffer de errores.
Los errores te quedaran en la variable $errores por si quieres hacer algun log.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #3 (permalink)  
Antiguo 27/10/2012, 19:56
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Gracias por el aporte!. Igualmente lo que estoy intentando saber es como puedo reemplazar el loop recursivo, porque el limite de conecciones no me va a permitir guardar los enlaces de ninguna página.

Saludos!
  #4 (permalink)  
Antiguo 27/10/2012, 21:16
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Código PHP:
Ver original
  1. <?php
  2. error_reporting(E_ALL | E_STRICT);
  3.  
  4. $server_link = mysql_connect("localhost", "root", "");
  5. if(!$server_link) {
  6.     die("Fall&oacute; la Conexi&oacute;n ". mysql_error());
  7. }
  8.  
  9. $db_selected = mysql_select_db("buscadorfulltext", $server_link);
  10. if(!$db_selected) {
  11.     die("No se pudo seleccionar la Base de Datos ". mysql_error());
  12. }
  13.  
  14.  
  15. function storeLink($titulo,$descripcion,$url,$keywords)
  16. {
  17.     $query = "INSERT INTO spider (webTitulo, webDescripcion, weburl, webkeywords) VALUES ('$titulo', '$descripcion', '$url', '$keywords')";
  18.     mysql_query($query) or die('Error, falló la inserción de datos');
  19. }
  20.  
  21. function extraer($url, $prof, $patron)
  22. {
  23.  
  24.     $userAgent = 'Interredu';
  25.  
  26.     $ch = curl_init();
  27.     curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
  28.     curl_setopt($ch, CURLOPT_URL,$url);
  29.     curl_setopt($ch, CURLOPT_HTTPHEADER, array(("Accept-Language: es-es,en")));
  30.     curl_setopt($ch, CURLOPT_FAILONERROR, true);
  31.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  32.     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  33.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  34.     curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
  35.     curl_setopt($ch, CURLOPT_AUTOREFERER, true);
  36.     curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
  37.     $html= curl_exec($ch);
  38.  
  39.     if (!$html) {
  40.         echo "<br />cURL error number:" .curl_errno($ch);
  41.         echo "<br />cURL error:" . curl_error($ch);
  42.         exit;
  43.     }
  44.  
  45.     $dom = new DOMDocument();
  46.     $dom->loadHTML($html);
  47.  
  48.     $xpath = new DOMXPath($dom);
  49.     $hrefs = $xpath->evaluate("/html/body//a");
  50.  
  51.     for ($i = 0; $i < $hrefs->length; $i++) {
  52.         $href = $hrefs->item($i);
  53.         $url2 = $href->getAttribute('href');
  54.    
  55.         $var = strstr($url2, '#', true);
  56.         if ($var !== false ) {
  57.             $url2 = $var;
  58.         }
  59.    
  60.         if ($url2 != $url && $url2 != '') {
  61.             if (saveUrl($url2, $prof,$patron, $html)) {
  62.                 extraer($url2, $prof ++, $patron);
  63.             }
  64.         }
  65.     }
  66. }
  67.  
  68.  
  69. function saveUrl($url, $prof, $patron, $html)
  70. {
  71.     $retorno = false;
  72.     $busqueda = mysql_query("SELECT weburl FROM spider WHERE weburl='$url'");
  73.     $cantidad = mysql_num_rows($busqueda);
  74.     $pos      = strpos($url, $patron);
  75.  
  76.     if( $prof <= 1 and $cantidad == 0 and $pos !== false) {
  77.         preg_match_all ("(<title>(.*)<\/title>)siU", $html, $title);
  78.         preg_match_all ("(<meta name=\"description\" content=\"(.*)\"\/>)siU", $html, $description);
  79.         preg_match_all ("(<meta name=\"keywords\" content=\"(.*)\"\/>)siU", $html, $keys);
  80.         $titulo = $title[1][0];
  81.         $descripcion = $description[1][0];
  82.         $keywords = $keys[1][0];
  83.         storeLink($titulo,$descripcion,$url,$keywords);
  84.         $retorno = true;
  85.         echo 'Guardada pagina : ' . $url . ' con profundidad ' . $prof . '<br>' . "\n\r";
  86.     }
  87.     return $retorno;
  88. }
  89.  
  90.  
  91. $url = "http://www.forosdelweb.com/f18";
  92. $patron = "http://www.forosdelweb.com/f18";
  93. $prof = 1;
  94.  
  95. extraer($url, 1, $patron);
  96. $errores = libxml_get_errors();

Tienes que refinar metas y keywoards,
Cuando lo tengas mas refinado me lo pasas.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #5 (permalink)  
Antiguo 27/10/2012, 21:57
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Muchas gracias, para mejorar las metas pensaba hacer un if, en caso de que no exista la meta description, voy a extraer lo que se encuentre en <p></p>. Y para las keys algo similar.

Yo esperaba que me dieran una idea no el código jaja, sos un genio.

Hoy voy a estar puliendo la parte de las metas y entre hoy y mañana publico el nuevo código.

Lo único que pasó fue que sigue con el problema del "Maximum function nesting level", voy a ver como corregirlo.

Saludos!
  #6 (permalink)  
Antiguo 27/10/2012, 22:46
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Una que puedes hacer es en la linea 77
Código PHP:
Ver original
  1. if( $prof <= 1 and $cantidad == 0 and $pos !== false) {
  2. // Cambiar a >=1
  3.  if( $prof >= 1 and $cantidad == 0 and $pos !== false) {
Y ahí te guardara las paginas hijas también,
y en la funcion extraer poner un condicional en base a $prof como;
Código PHP:
Ver original
  1. if ($prof <= 5) {
  2.                    extraer($url2, $prof++, $patron);  
  3.                 }

Una idea no mas...
Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 27/10/2012 a las 22:58
  #7 (permalink)  
Antiguo 27/10/2012, 23:05
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Gracias por la ayuda!, estuve revisando con algunas páginas, para mejorar las metas y ver el limite que tenía y me di cuenta de que hay un problema con la url.

Te muestro un ejemplo de lo sucedido:

Id Titulo Descripcion Url Keys
2 Titulo2 desc2 url3 keys2
3 titulo3 desc3 url4 keys3

Lo que hace es guardar la url en el campo que le sigue, en vez del campo que le corresponde. Si encuentro la solucion edito el comentario.

Saludos
  #8 (permalink)  
Antiguo 28/10/2012, 00:39
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Código PHP:
Ver original
  1. <?php
  2. error_reporting(E_ALL | E_STRICT);
  3.  
  4. $server_link = mysql_connect("localhost", "root", "");
  5. if(!$server_link) {
  6.     die("Fall&oacute; la Conexi&oacute;n ". mysql_error());
  7. }
  8.  
  9. $db_selected = mysql_select_db("buscadorfulltext", $server_link);
  10. if(!$db_selected) {
  11.     die("No se pudo seleccionar la Base de Datos ". mysql_error());
  12. }
  13.  
  14.  
  15. function storeLink($titulo,$descripcion,$url,$keywords, $prof)
  16. {
  17.     $query = "INSERT INTO spider (webTitulo, webDescripcion, weburl, webkeywords, prof) VALUES ('$titulo', '$descripcion', '$url', '$keywords', $prof)";
  18.     mysql_query($query) or die('Error, falló la inserción de datos');
  19. }
  20.  
  21.  
  22.  
  23. function extraer($url, $prof, $patron)
  24. {
  25.     $userAgent = 'Interredu';
  26.  
  27.     $ch = curl_init();
  28.     curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
  29.     curl_setopt($ch, CURLOPT_URL,$url);
  30.     curl_setopt($ch, CURLOPT_HTTPHEADER, array(("Accept-Language: es-es,en")));
  31.     curl_setopt($ch, CURLOPT_FAILONERROR, true);
  32.     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  33.     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  34.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  35.     curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
  36.     curl_setopt($ch, CURLOPT_AUTOREFERER, true);
  37.     curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
  38.     $html= curl_exec($ch);
  39.     // La salvo de Entrada, para que no se me corra en la entrada a la base de datos
  40.     saveUrl($url, $prof,$patron, $html);
  41.  
  42.     // Mando error pero no corto porque si una url esta mal formada termina con la
  43.     // ejecucion
  44.     if (!$html) {
  45.         echo "<br />cURL error number:" .curl_errno($ch);
  46.         echo "<br />cURL error:" . curl_error($ch);
  47.     }  
  48.    
  49.     $dom = new DOMDocument();
  50.     $dom->loadHTML($html);
  51.  
  52.     $xpath = new DOMXPath($dom);
  53.     $hrefs = $xpath->evaluate("/html/body//a");
  54.  
  55.     for ($i = 0; $i < $hrefs->length; $i++) {
  56.         $href = $hrefs->item($i);
  57.         $url2 = $href->getAttribute('href');
  58.    
  59.         $var = strstr($url2, '#', true);
  60.         if ($var !== false ) {
  61.             $url2 = $var;
  62.         }
  63.         // Me aseguro que este bajo nuestro sitio.
  64.         if (strpos($url2, $patron) === false) {
  65.             continue;
  66.         }
  67.        
  68.         // Me aseguro que ya no este ingresada, para no iterar sobre ella misam
  69.         if ($url2 != $url && $url2 != '') {
  70.             // Se podria agregar un campo timestap para luego reescanera paginas
  71.             // que tuvieran una fecha menor.
  72.             // URL Unica para que falle y como es mysql poner INSERT INTO ...... ON DUPLICATE KEY ... en la funcion de guardado
  73.             $busqueda = mysql_query("SELECT weburl FROM spider WHERE weburl='$url2'");
  74.             $cantidad = mysql_num_rows($busqueda);
  75.             if ($prof <= 5 && $cantidad == 0) {
  76.                 extraer($url2, $prof++, $patron);  
  77.             }
  78.         }
  79.     }
  80. }
  81.  
  82.  
  83. function saveUrl($url, $prof, $patron, $html)
  84. {
  85.     $retorno = false;
  86.     $pos      = strpos($url, $patron);
  87.  
  88.     if( $prof >= 1) {
  89.         preg_match_all ("(<title>(.*)<\/title>)siU", $html, $title);
  90.         preg_match_all ("(<meta name=\"description\" content=\"(.*)\"\/>)siU", $html, $description);
  91.         preg_match_all ("(<meta name=\"keywords\" content=\"(.*)\"\/>)siU", $html, $keys);
  92.         $titulo = $title[1][0];
  93.         $descripcion = $description[1][0];
  94.         $keywords = $keys[1][0];
  95.         storeLink($titulo,$descripcion,$url,$keywords, $prof);
  96.         $retorno = true;
  97.         echo 'Guardada pagina : ' . $url . ' con profundidad ' . $prof . '<br>' . "\n\r";
  98.     }
  99.     return $retorno;
  100. }
  101.  
  102.  
  103. $url = "http://objetivophp.com";
  104. $patron = "http://objetivophp.com";
  105. $prof = 5;
  106.  
  107. extraer($url, 1, $patron);
  108. $errores = libxml_get_errors();
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 28/10/2012 a las 00:46
  #9 (permalink)  
Antiguo 29/10/2012, 11:28
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Hola!, probé el código, pero no funciona =S, me marca Undefined offset: 0, y después Error en la inserción de datos.


Pensé hacer un cambio en el código también...

Esta parte del código:
Código PHP:
Ver original
  1. preg_match_all ("(<meta name=\"keywords\" content=\"(.*)\"\/>)siU", $html, $keys);

Podría ser reemplazado con esto:
Código PHP:
Ver original
  1. $keyw = preg_match_all ("(<meta name=\"keywords\" content=\"(.*)\"\/>)siU", $html, $keys);
  2.         if ($keyw !== false){
  3.         preg_match_all("#<\s*b[^>]*>[^<]+</b>#is", $html, $b);
  4.         preg_match_all("#<\s*h1[^>]*>[^<]+</h1>#is", $html, $h1);
  5.         $h1 = $encabezado1[1][0];
  6.         $b = $bold[1][0];
  7.         }

En caso de que meta keywords no retorne nada, se extrae el encabezado1 o h1, se podría seguir extendiendo utilizando h2,h3,h4...etc, también extrae todos los bold (<b></b>), de esta manera se reemplaza la meta por los encabezados y negrita.

Saludos!

EDITO: Tenía un código viejo del webcrawler, que funciona mejor para las meta description y keywords:
Código PHP:
Ver original
  1. for ($i = 0; $i < $hrefs->length; $i++) {
  2.         $href = $hrefs->item($i);
  3.         $url2 = $href->getAttribute('href');
  4.  
  5.         if($href->getAttribute('name') == 'description')
  6.         $descripcion = $href->getAttribute('content');
  7.         if($href->getAttribute('name') == 'keywords')
  8.         $keywords = $href->getAttribute('content');

Última edición por xarmagedonx; 29/10/2012 a las 13:46
  #10 (permalink)  
Antiguo 29/10/2012, 16:51
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Cambiaste los datos de bases y campos...

Porque le agregue unas cosas a mi me funciona.
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #11 (permalink)  
Antiguo 29/10/2012, 19:21
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Ahora si jaja, me había olvidado de crear el campo prof en la tabla

PD: ¿Te funciona la extracción de metas?, acabo de probar con otro sitio que tiene description y keys pero no las guarda

Última edición por xarmagedonx; 29/10/2012 a las 19:51
  #12 (permalink)  
Antiguo 29/10/2012, 20:02
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Me funcionaba con las expresiones regulares, lo unico que ponía una parte del código.
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #13 (permalink)  
Antiguo 29/10/2012, 20:32
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Ahora si!, reemplazando el if( $prof >= 1) actual por el siguiente:

Se extrae perfectamente titulo y keywords
Código PHP:
Ver original
  1. if( $prof >= 1) {
  2.         preg_match_all ("(<title>(.*)<\/title>)siU", $html, $title);
  3.         $metas = get_meta_tags($url,1);
  4.         $titulo = $title[1][0];
  5.     $descripcion = $metas["description"];
  6.         $keywords = $metas["keywords"];
  7.         storeLink($titulo,$descripcion,$url,$keywords, $prof);
  8.         $retorno = true;
  9.         echo 'Guardada pagina : ' . $url . ' con profundidad ' . $prof . '<br>' . "\n\r";
  10.     }

Aunque no logre hacer funcionar el if, ahora estoy viendo como hacer el if para que en caso de que no se encuentre description y keywords se extraigan otras cosas.
  #14 (permalink)  
Antiguo 29/10/2012, 20:39
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Con ese método sale 10 pts todo.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #15 (permalink)  
Antiguo 30/10/2012, 15:37
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Estoy revisando los datos de la bd extraidos de objetivophp y me encontré con que no puede reconocer los tildes en el titulo.

Te muestro un ejemplo:

Cita:
DEAME3P Versión 5.4.0 - ObjetivoPHP
También probé con mi página y pasa lo mismo:

Cita:
Libélula - Naica
El último problema que encontre fue que en algunos resultados no pone la descripcion ni keywords, y en otros tampoco el titulo, después en otros pone todo completo, y vuelve a pasar con los siguientes. Revise las url y tenían las metas correspondientes, no se que es lo que está funcionando mal. ¿Te pasó lo mismo?

Saludos y gracias por todo!
  #16 (permalink)  
Antiguo 30/10/2012, 19:12
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Lo de los tildes lo tengo bien.
Tengo la base codificada con utf-8,
si te quieres asegurar el ingreso de los datos en utf-8, luego enseguida de la coneccion reliza la siguiente consulta:

Código PHP:
Ver original
  1. mysql_query("SET names utf8");

tienes razon de pende de donde codifica bien o no..
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 30/10/2012 a las 19:30
  #17 (permalink)  
Antiguo 30/10/2012, 21:56
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Gracias, cambie el cotejamiento de la bd y comenzó a funcionar con tíldes. Pero no me reconoce ahora las description y keywords al utilizar get meta tags.

Me marca el siguiente error:

Cita:
Undefined index: description
Undefined index: keywords
Y sigue salteandose algunos campos, mañana con más tiempo reviso el código, porque también anda un poco lento jaja, si necesito cargar 1 millón de páginas no creo llegar.
  #18 (permalink)  
Antiguo 31/10/2012, 05:12
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Lo de los metatags y el undefined index, es porque la pagina no debe tener esos metas.

Código PHP:
Ver original
  1. $descripcion = isset($metas["description"])?$metas["description"] : '';

Por lo menos no largara el error, aunque si te va a quedar vació.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #19 (permalink)  
Antiguo 02/11/2012, 21:15
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Hola!, gracias por toda tu ayuda.... solo tengo algunas dudas más...

¿Cómo puedo lograr extraer páginas con conección segura: https?, porque intente con wikipedia y no llegue a extrare ningún artículo =S, y por último, al cargar por ejemplo la url inicial:

Me añade estas dos a la bd, omo si fueran distintas:

¿como puedo evitar esto?

Saludos y muchas gracias por todo!!!!!!, voy a seguir trabajando en el código así el 7 puedo presentarlo =).

Última edición por xarmagedonx; 03/11/2012 a las 07:22
  #20 (permalink)  
Antiguo 03/11/2012, 15:22
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Lo primero habria que seguir extrayendo mejor la url, en donde sacamos por ejemplo el ancla y seguir luego para ver si termina en / o no y asi sacarselo.

Lo otro de wikipedia voy a ver que pasa.

Me fije, y me parece que el problema es porque la wiki tiene referencias relativas mayormente en los enlaces,
de la forma /wiki/Wikipedia:Bienvenidos.
Quizás sea eso lo que hace que no se puedan recorrer los enlaces.
Pero no creo que sea por el https pues si pones uno lo hace.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp

Última edición por portalmana; 03/11/2012 a las 17:16
  #21 (permalink)  
Antiguo 04/11/2012, 16:12
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Hola, esta bien lo que decis sobre wikipedia, pero si por ejemplo quisiera extraer los artículos desde: http://es.wikipedia.org/wiki/Wikiped...los_destacados los enlaces hacia los artículos tiene la forma de http://es.wikipedia.org/wiki/

Pero claro los del menú tienen la forma /wiki/Wikipedia:Bienvenidos, hay alguna forma de evitar estos e ir directamente hacia los artículos???
  #22 (permalink)  
Antiguo 04/11/2012, 19:29
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Lo que se me ocurre, es que generalmente en los enlaces de artículos la propiedad href es wiki/nombre_articulo y tiene siempre el atributo title que es nombre_articulo.

Pero ahí ya te estaría quedando como muy enfocado a eso.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #23 (permalink)  
Antiguo 04/11/2012, 20:44
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Encontré una solución temporal, hacer un copy & paste de los links de wikipedia, en un archivo de dreamweaver, y descargarlos con el webcrawler desde ahí.

Edito: Como podría incluirse la fecha actual al campo "timestap"?

Saludos!

Última edición por xarmagedonx; 05/11/2012 a las 11:24
  #24 (permalink)  
Antiguo 05/11/2012, 17:07
Avatar de portalmana  
Fecha de Ingreso: septiembre-2007
Ubicación: Montevideo-Uruguay
Mensajes: 633
Antigüedad: 16 años, 7 meses
Puntos: 80
Respuesta: Evitar utilizar loop recursivo

Si en por defecto pones CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, con eso ya se inserta solo y se actualiza solo. No necesitas enviar la fecha y hora.

Saludos
__________________
"La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein
objetivophp.com,twitter.com/objetivophp
  #25 (permalink)  
Antiguo 05/11/2012, 19:56
Avatar de xarmagedonx  
Fecha de Ingreso: marzo-2009
Mensajes: 360
Antigüedad: 15 años, 1 mes
Puntos: 29
Respuesta: Evitar utilizar loop recursivo

Gracias!, para reemplazar en caso de que esté desactualizado se podría hacer algo como esto:

Código PHP:
Ver original
  1. if (date('Y-m-d') == date('Y-m-d', strtotime('2012-5-11 10:54:00'))) {
  2.     //es hoy
  3. } else {
  4. //aca se reemplazaría
  5. }

PD: si intento añadir dos veces una misma url lo acepta, y graba dos veces la página principal =S. También tengo la codificación utf-8 pero no acepta comillas y otros simbolos.

EDITO IMPORTANTE: Conseguí dos códigos que generan la descripcion y las keywords de una página web:

Para la descripción:

Código PHP:
Ver original
  1. function obtenerMetaDescription($text) {
  2.         $text = strip_tags($text);
  3.         $text = trim($text);
  4.         $text = substr($text, 0, 247);
  5.         return $text."...";
  6.     }

Para las keywords:

Código PHP:
Ver original
  1. function obtenerMetaKeywords($text) {
  2.         // Limpiamos el texto
  3.         $text = strip_tags($text);
  4.         $text = strtolower($text);
  5.         $text = trim($text);
  6.         $text = preg_replace('/[^a-zA-Z0-9 -]/', ' ', $text);
  7.         // extraemos las palabras
  8.         $match = explode(" ", $text);
  9.         // contamos las palabras
  10.         $count = array();
  11.         if (is_array($match)) {
  12.             foreach ($match as $key => $val) {
  13.                 if (strlen($val)> 3) {
  14.                     if (isset($count[$val])) {
  15.                         $count[$val]++;
  16.                     } else {
  17.                         $count[$val] = 1;
  18.                     }
  19.                 }
  20.             }
  21.         }
  22.         // Ordenamos los totales
  23.         arsort($count);
  24.         $count = array_slice($count, 0, 10);
  25.         return implode(", ", array_keys($count));
  26.     }

Intenté con el de la descripción pero sale el siguiente error:

Cita:
Cannot redeclare obtenerMetaDescription()
Reemplaze los $text por $html que es el que guarda la página, pero igual tiene ese problema.

Saludos y gracias por todo

Última edición por xarmagedonx; 06/11/2012 a las 10:28

Etiquetas: conecciones, webcrawler, bases-de-datos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:49.