Foros del Web » Programando para Internet » PHP »

Extraer datos de otra web

Estas en el tema de Extraer datos de otra web en el foro de PHP en Foros del Web. Ante todo, gracias por este foro maravilloso que me saca de problemillas de vez en cuando. Soy totalmente autodidacta en esto de la programación y ...
  #1 (permalink)  
Antiguo 07/02/2014, 11:11
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Extraer datos de otra web

Ante todo, gracias por este foro maravilloso que me saca de problemillas de vez en cuando. Soy totalmente autodidacta en esto de la programación y me formo a través de la información y documentación que hay en la web, por eso os pido paciencia y comprensión, si alguna de la cuestiones que planteo son de cajón.
Paso a explicar lo que me tiene de cabeza.
Intento extraer datos de una web para despues insertar los registros obtenidos a una BD mysql, para lo que estoy montando un script, cuyo código es éste:

<?php
require("phpsqlsearch_dbinfo.php");
$connection=mysql_connect (localhost, $username, $password);
if (!$connection) {
die("Not connected : " . mysql_error());
}

// Set the active mySQL database
$db_selected = mysql_select_db($database, $connection);
mysql_query("SET NAMES utf8");
if (!$db_selected) {
die ("Can\'t use db : " . mysql_error());
}

$extrae = $_POST['url'];
$provincias = $_POST['county'];
$paises = $_POST['country'];
// Use internal libxml errors -- turn on in production, off for debugging
libxml_use_internal_errors(true);
// Createa a new DomDocument object
$dom = new DomDocument;
// Load the HTML
$dom->loadHTMLFile($extrae);
// Create a new XPath object
$xpath = new DomXPath($dom);
//Query all <td> nodes containing specified class name
$titulos = $xpath->query('//a[@class="url"]');
$telefonos = $xpath->query('//p[@class="tel"]');
$direcciones = $xpath->query('//span[@class="street-address"]');
$ciudades = $xpath->query('//a[@class="locality"]');
$lats = $xpath->query('//span[@class="latitude hidden"]');
$lngs = $xpath->query('//span[@class="longitude hidden"]');
// Set HTTP response header to text/html for debugging output
header('Content-type: text/html; charset=utf-8');
//Traverse the DOMNodeList object to output each DomNode's nodeValue
foreach ($titulos as $titulo) {
$name = ltrim($titulo->nodeValue);
echo $name."<br>";
}
foreach ($direcciones as $direccion) {
$address = $direccion->nodeValue;
echo $address."<br>";
}
foreach ($ciudades as $ciudad) {
$city = $ciudad->nodeValue;
echo $city." ".$provincias." ".$paises."<br>";
}
foreach ($telefonos as $telefono) {
$phone = $telefono->nodeValue;
echo $phone."<br>";
}
foreach ($lats as $lat) {
$latitud = $lat->nodeValue;
echo $latitud."<br>";
}
foreach ($lngs as $lng) {
$longitud = $lng->nodeValue;
echo $longitud."<br>";
}
$sqlins = "INSERT INTO markersprueba (name, address, city, county, country, phone, lat, lng, fecAlta) ".
"VALUES ('$name', '$address', '$city', '$provincias', '$paises', '$phone', '$latidud', '$longitud', CURDATE())";
$resultins = mysql_query($sqlins) or die("No se ha podido insertar el log".mysql_error());
?>

El único registro que me inserta es el último obtenido, el resto no los inserta. Se que no lo estoy haciendo bien, pero he probado todo lo que he visto por la red y no lo consigo.
Agradezco desde ya vuestra ayuda
  #2 (permalink)  
Antiguo 07/02/2014, 11:29
Colaborador
 
Fecha de Ingreso: mayo-2008
Ubicación: $MX['VZ']['Xalapa']
Mensajes: 3.005
Antigüedad: 15 años, 11 meses
Puntos: 528
Respuesta: Extraer datos de otra web

Debes usar la herramienta highlight para que tu código sea más fácil de leer. Pero así a simple vista, veo que haces el insert en la tabla al final de todo y no está dentro de ningún ciclo, por lo que sería normal que sólo te guarde un registro y no más.
  #3 (permalink)  
Antiguo 07/02/2014, 12:10
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Extraer datos de otra web

Gracias ocp001a por tu respuesta... y disculpa si no he utilizado la herramienta, ahora lo hago. Pero díme, en qué ciclo incluirias tu el insert para que tome todos los datos?

Código PHP:
Ver original
  1. <?php
  2. require("phpsqlsearch_dbinfo.php");
  3. $connection=mysql_connect (localhost, $username, $password);
  4. if (!$connection) {
  5. die("Not connected : " . mysql_error());
  6. }
  7.  
  8. // Set the active mySQL database
  9. $db_selected = mysql_select_db($database, $connection);
  10. mysql_query("SET NAMES utf8");
  11. if (!$db_selected) {
  12. die ("Can\'t use db : " . mysql_error());
  13. }
  14.  
  15. $extrae = $_POST['url'];
  16. $provincias = $_POST['county'];
  17. $paises = $_POST['country'];
  18. // Use internal libxml errors -- turn on in production, off for debugging
  19. // Createa a new DomDocument object
  20. $dom = new DomDocument;
  21. // Load the HTML
  22. $dom->loadHTMLFile($extrae);
  23. // Create a new XPath object
  24. $xpath = new DomXPath($dom);
  25. //Query all <td> nodes containing specified class name
  26. $titulos = $xpath->query('//a[@class="url"]');
  27. $telefonos = $xpath->query('//p[@class="tel"]');
  28. $direcciones = $xpath->query('//span[@class="street-address"]');
  29. $ciudades = $xpath->query('//a[@class="locality"]');
  30. $lats = $xpath->query('//span[@class="latitude hidden"]');
  31. $lngs = $xpath->query('//span[@class="longitude hidden"]');
  32. // Set HTTP response header to text/html for debugging output
  33. header('Content-type: text/html; charset=utf-8');
  34. //Traverse the DOMNodeList object to output each DomNode's nodeValue
  35. foreach ($titulos as $titulo) {
  36. $name = ltrim($titulo->nodeValue);
  37. echo $name."<br>";
  38. }
  39. foreach ($direcciones as $direccion) {
  40. $address = $direccion->nodeValue;
  41. echo $address."<br>";
  42. }
  43. foreach ($ciudades as $ciudad) {
  44. $city = $ciudad->nodeValue;
  45. echo $city." ".$provincias." ".$paises."<br>";
  46. }
  47. foreach ($telefonos as $telefono) {
  48. $phone = $telefono->nodeValue;
  49. echo $phone."<br>";
  50. }
  51. foreach ($lats as $lat) {
  52. $latitud = $lat->nodeValue;
  53. echo $latitud."<br>";
  54. }
  55. foreach ($lngs as $lng) {
  56. $longitud = $lng->nodeValue;
  57. echo $longitud."<br>";
  58. }
  59. $sqlins = "INSERT INTO markersprueba (name, address, city, county, country, phone, lat, lng, fecAlta) ".
  60. "VALUES ('$name', '$address', '$city', '$provincias', '$paises', '$phone', '$latidud', '$longitud', CURDATE())";
  61. $resultins = mysql_query($sqlins) or die("No se ha podido insertar el log".mysql_error());
  62. ?>
  #4 (permalink)  
Antiguo 07/02/2014, 15:51
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años
Puntos: 34
Respuesta: Extraer datos de otra web

necesitariamos ver un var_dump de como vienen los datos. Por que haces un foreach POR CADA TIPO DE DATO??? y por qué no guardas los datos en ningun lado dentro de cada foreach??? es obvio que se pierden!
  #5 (permalink)  
Antiguo 07/02/2014, 16:23
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Extraer datos de otra web

Gracias patriciomase por tu respuesta. En primer lugar, hago un foreach por cada tipo de dato porque no se como hacerlo de otra manera y tampoco se como guardarlos dentro de cada bucle. ¿Podrías ponerme un ejemplo? Gracias de antemano
  #6 (permalink)  
Antiguo 08/02/2014, 07:03
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Extraer datos de otra web

Despues de la respuesta de patriciomase, he escrito otro código:
Código PHP:
Ver original
  1. <?php
  2. require("phpsqlsearch_dbinfo.php");
  3. $connection=mysql_connect (localhost, $username, $password);
  4. if (!$connection) {
  5.   die("Not connected : " . mysql_error());
  6. }
  7.  
  8. // Set the active mySQL database
  9. $db_selected = mysql_select_db($database, $connection);
  10. mysql_query("SET NAMES utf8");
  11. if (!$db_selected) {
  12.   die ("Can\'t use db : " . mysql_error());
  13. }
  14.  
  15. $extrae = $_POST['url'];
  16. $provincias = $_POST['county'];
  17. $paises = $_POST['country'];
  18. // Use internal libxml errors -- turn on in production, off for debugging
  19. // Createa a new DomDocument object
  20. $dom = new DomDocument;
  21. // Load the HTML
  22. $dom->loadHTMLFile($extrae);
  23. // Create a new XPath object
  24. $xpath = new DomXPath($dom);
  25. //Query all <td> nodes containing specified class name
  26. $titulos = $xpath->query('//a[@class="url"]|//p[@class="tel"]|//span[@class="street-address"]|//a[@class="locality"]|//span[@class="latitude hidden"]|//span[@class="longitude hidden"]');
  27. // Set HTTP response header to text/html for debugging output
  28. header('Content-type: text/html; charset=utf-8');
  29. foreach($titulos as $titulo) {
  30.     $datos = array();
  31.     $datos = $titulo->nodeValue;
  32.     var_dump($datos);
  33. }
  34. ?>

Este codigo me devuelve:

string(35) "
G. Elias y Muñoz Abogados"
string(16) "+34 915 71 17 87"
string(37) "C/ Sor Ángela de la Cruz, 24 - 3º D"
string(6) "Madrid"
string(10) "40.4598677"
string(10) "-3.6957341"
string(58) "
San Martín Rodriguez Abogados - Bufete Casadeley"
string(16) "+34 914 41 46 59"
string(25) "Calle de José Abascal 58"
string(6) "Madrid"
string(10) "40.4378855"
string(10) "-3.6914792"
string(25) "
Abanlex Abogados"
string(16) "+34 915 64 93 45"
string(53) "Calle de Velázquez 109, 7º Izquierda - Madrid 28006"
string(6) "Madrid"
string(16) "40.4362994223884"
string(16) "-3.6834454536438"
string(29) "
Accidente y Tráfico"
string(16) "+34 913 23 99 41"
string(37) "Calle Nuñez Morgado 6, 28036, Madrid"
string(6) "Madrid"
string(10) "40.4686546"
string(10) "-3.6853908"
string(32) "
EL Monasterio del Cobro"
string(16) "+34 915 56 32 11"
string(30) "PASEO DE LA CASTELLANA, 129, 1"
string(6) "Madrid"
string(10) "40.4585177"
string(10) "-3.6905893"
string(23) "
Manga Abogados"
string(16) "+34 915 55 75 86"
string(24) "Calle de Orense 39, 3ºb"
string(6) "Madrid"
string(9) "40.453842"
string(9) "-3.694883"
string(27) "
Garrigues Abogados"
string(13) "Hermosilla, 3"
string(6) "Madrid"
string(10) "40.4266467"
string(10) "-3.6888685"
string(35) "
Perea & Asociados Abogados"
string(16) "+34 915 74 81 39"
string(27) "Profesor Waksman, 3 - 2º B"
string(6) "Madrid"
string(10) "40.4562278"
string(10) "-3.6893621"
string(35) "
Dlg Abogados Y Economistas"
string(16) "+34 915 70 42 34"
string(20) "Calle Espronceda, 12"
string(6) "Madrid"
string(10) "40.4406084"
string(10) "-3.6982083"
string(21) "
iAbogado.com"
string(16) "+34 917 48 93 57"
string(38) "Paseo de la Castellana 179, esc. C, 1C"
string(6) "Madrid"
string(9) "40.462305"
string(10) "-3.6917305"
string(19) "
Alcalá 59"
string(16) "+34 917 81 29 53"
string(19) "C/ Alcalá, 59, 5º"
string(6) "Madrid"
string(10) "40.4198035"
string(10) "-3.6913739"
string(46) "
ABOGADOS PENALISTAS - Abogados Grande"
string(16) "+34 655 19 39 20"
string(36) "Calle Fernán González 36, 2º izq."
string(6) "Madrid"
string(10) "40.4207393"
string(17) "-3.67457060000004"
string(37) "
Gutiérrez Y Riesgo Abogados"
string(16) "+34 675 95 41 04"
string(25) "Ronda Segovia, 22 - 1º B"
string(6) "Madrid"
string(10) "40.4083451"
string(10) "-3.7163378"
string(30) "
Lucas Franco Abogados"
string(16) "+34 600 85 86 86"
string(27) "C/ Espronceda, 39 3º,dcha."
string(6) "Madrid"
string(10) "40.4405395"
string(17) "-3.69395450000002"
string(25) "
Lextime Abogados"
string(16) "+34 914 00 88 66"
string(27) "Calle Máiquez, 18 - Local "
string(6) "Madrid"
string(10) "40.4208712"
string(10) "-3.6729907"

Pregunta: ¿Como lo inserto en una tabla de mi BD?

Gracias de antemano
  #7 (permalink)  
Antiguo 08/02/2014, 08:31
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Extraer datos de otra web

hola amigo,

en primer lugar las funciones de mysql estan [URL="http://php.net/manual/es/function.mysql-connect.php"]obsoletas[/URL] te recomiendo en su lugar utilizar [URL="http://es.php.net/pdo"]PDO[/URL].

volviendo al tema, ya lo tienes casi hecho.

teniendo una tabla como esta:
Código:
tabla 'registro' {
    nombre,
    telefono,
    provincia,
    direccion,
    latitud,
    longitud
}
y usando PDO:
Código PHP:
$connection = new PDO('mysql:host=HOST;dbname=DB;''USUARIO''PASSWORD');

$statement $connection->prepare(
    
'INSERT INTO tabla (nombre, telefono, provincia, direccion, latitud, longitud) VALUES(?,?,?,?,?,?);'
);

foreach (
$titulos as $titulo)
    
$statement->execute($titulo->nodeValue); 
espero haberte ayudado, saludos.

Última edición por lolainas; 08/02/2014 a las 08:33 Razón: INSERTO por INSERT
  #8 (permalink)  
Antiguo 08/02/2014, 12:05
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Extraer datos de otra web

lolaina me devuelve este error:
Warning: PDOStatement::execute() expects parameter 1 to be array, string given in /home/ubicator/public_html/ext.php on line 52.
Siguiendo las indicaciones, el código ha quedado así:
Código PHP:
Ver original
  1. <?php    
  2.     $extrae = $_POST['url'];
  3.     $provincias = $_POST['county'];
  4.     $paises = $_POST['country'];
  5.     // Use internal libxml errors -- turn on in production, off for debugging
  6.     // Createa a new DomDocument object
  7.     $dom = new DomDocument;
  8.     // Load the HTML
  9.     $dom->loadHTMLFile($extrae);
  10.     // Create a new XPath object
  11.     $xpath = new DomXPath($dom);
  12.     //Query all <td> nodes containing specified class name
  13.     $titulos = $xpath->query('//a[@class="url"]|//p[@class="tel"]|//span[@class="street-address"]|//a[@class="locality"]|//span[@class="latitude hidden"]|//span[@class="longitude hidden"]');
  14.     // Set HTTP response header to text/html for debugging output
  15.     header('Content-type: text/html; charset=utf-8');
  16.  
  17. $username = 'mi_usuario';
  18. $password = 'mi_contraseña';
  19. $connection = new PDO('mysql:host=localhost;dbname=mi_base_datos', $username, $password);
  20.  
  21. $statement = $connection->prepare('INSERT INTO markersprueba (name, phone, address, city, lat, lng) VALUES(?,?,?,?,?,?)');
  22.  
  23. foreach ($titulos as $titulo){
  24.     $statement->execute($titulo->nodeValue);
  25. }
  26. ?>

¿En que estoy fallando?
  #9 (permalink)  
Antiguo 08/02/2014, 12:09
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Extraer datos de otra web

Cita:
Iniciado por lolainas Ver Mensaje
hola amigo,

en primer lugar las funciones de mysql estan [URL="http://php.net/manual/es/function.mysql-connect.php"]obsoletas[/URL] te recomiendo en su lugar utilizar [URL="http://es.php.net/pdo"]PDO[/URL].

volviendo al tema, ya lo tienes casi hecho.

teniendo una tabla como esta:
Código:
tabla 'registro' {
    nombre,
    telefono,
    provincia,
    direccion,
    latitud,
    longitud
}
y usando PDO:
Código PHP:
$connection = new PDO('mysql:host=HOST;dbname=DB;''USUARIO''PASSWORD');

$statement $connection->prepare(
    
'INSERT INTO tabla (nombre, telefono, provincia, direccion, latitud, longitud) VALUES(?,?,?,?,?,?);'
);

foreach (
$titulos as $titulo)
    
$statement->execute($titulo->nodeValue); 
espero haberte ayudado, saludos.
He seguido tus indicaciones y debo estar supertorpe
  #10 (permalink)  
Antiguo 10/02/2014, 20:50
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años
Puntos: 34
Respuesta: Extraer datos de otra web

Le estas mandando un string y quiere un array, vas a tener que usar un bucle mas para formatear los datos, o agregarlo antes del insert en el mismo foreach que ya tienes

Última edición por patriciomase; 10/02/2014 a las 20:53 Razón: no vi la otra respuesta
  #11 (permalink)  
Antiguo 10/02/2014, 20:54
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años
Puntos: 34
Respuesta: Extraer datos de otra web

$titulo->nodeValue debería ser un array, muestranos var_dump a ver como viene formateado, si esta separado por comas es solo hacer un explode y ya anda
  #12 (permalink)  
Antiguo 11/02/2014, 01:22
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Extraer datos de otra web

Cita:
Iniciado por patriciomase Ver Mensaje
Le estas mandando un string y quiere un array, vas a tener que usar un bucle mas para formatear los datos, o agregarlo antes del insert en el mismo foreach que ya tienes
Y como hago ese bucle?? He probado de mil formas, pero nada de nada, sigue dandome el mismo error.
  #13 (permalink)  
Antiguo 11/02/2014, 01:24
 
Fecha de Ingreso: febrero-2014
Ubicación: Madrid
Mensajes: 19
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: Extraer datos de otra web

Cita:
Iniciado por patriciomase Ver Mensaje
$titulo->nodeValue debería ser un array, muestranos var_dump a ver como viene formateado, si esta separado por comas es solo hacer un explode y ya anda
A continuación te muestro lo que me devuelve var_dump:
Código HTML:
Ver original
  1. string(35) "
  2. G. Elias y Muñoz Abogados"
  3. string(16) "+34 915 71 17 87"
  4. string(37) "C/ Sor Ángela de la Cruz, 24 - 3º D"
  5. string(6) "Madrid"
  6. string(10) "40.4598677"
  7. string(10) "-3.6957341"
  8. string(58) "
  9. San Martín Rodriguez Abogados - Bufete Casadeley"
  10. string(16) "+34 914 41 46 59"
  11. string(25) "Calle de José Abascal 58"
  12. string(6) "Madrid"
  13. string(10) "40.4378855"
  14. string(10) "-3.6914792"
  15. string(25) "
  16. Abanlex Abogados"
  17. string(16) "+34 915 64 93 45"
  18. string(53) "Calle de Velázquez 109, 7º Izquierda - Madrid 28006"
  19. string(6) "Madrid"
  20. string(16) "40.4362994223884"
  21. string(16) "-3.6834454536438"
  22. string(29) "
  23. Accidente y Tráfico"
  24. string(16) "+34 913 23 99 41"
  25. string(37) "Calle Nuñez Morgado 6, 28036, Madrid"
  26. string(6) "Madrid"
  27. string(10) "40.4686546"
  28. string(10) "-3.6853908"
  29. string(32) "
  30. EL Monasterio del Cobro"
  31. string(16) "+34 915 56 32 11"
  32. string(30) "PASEO DE LA CASTELLANA, 129, 1"
  33. string(6) "Madrid"
  34. string(10) "40.4585177"
  35. string(10) "-3.6905893"
  36. string(23) "
  37. Manga Abogados"
  38. string(16) "+34 915 55 75 86"
  39. string(24) "Calle de Orense 39, 3ºb"
  40. string(6) "Madrid"
  41. string(9) "40.453842"
  42. string(9) "-3.694883"
  43. string(27) "
  44. Garrigues Abogados"
  45. string(13) "Hermosilla, 3"
  46. string(6) "Madrid"
  47. string(10) "40.4266467"
  48. string(10) "-3.6888685"
  49. string(35) "

Etiquetas: html, mysql, registro, select, sql
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 01:37.