PHP - Extraer datos de otra pagina web con php

 
Vista:
Imágen de perfil de novo34

Extraer datos de otra pagina web con php

Publicado por novo34 (9 intervenciones) el 22/06/2016 20:58:11
Hola, tengo un código que se conecta a una página ingresa un dato, realiza la consulta y extrae el dato.

Esto lo hace muy bien, el problema esta en cuando la pagina me da un error y este error hace que se paralice el resto del código.

Lo que estoy intentando y no he logrado, es que si marca error realice una acción y sino que siga el proceso.
El código es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
 
        $fields = array(
                "tipo" => "getDataWsPn",
                "ci" => $consultaBusqueda,
                "tp" => "C",
        );
 
        $raw_fields = http_build_query($fields);
        // Make the POST
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
        curl_setopt($ch,CURLOPT_URL, "http://www.mdi.gob.ec/minterior1/antecedentes/data.php");
        curl_setopt($ch, CURLOPT_POST, 1);
        // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $raw_fields);
        //execute post
        $results = curl_exec($ch);
        //close connection
        curl_close($ch);
 
        $raw_json = $results;
        $result = json_decode( $raw_json );
        // echo $raw_json;
        // print_r($result);
 
        $nombre = $result[0]->name;
        $antecedentes = $result[0]->antecedent;
 
       echo $nombre;
 
 ?>


Espero me puedan ayudar, gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Extraer datos de otra pagina web con php

Publicado por xve (6935 intervenciones) el 22/06/2016 23:17:20
Hola, no te entiendo muy bien, en principio si la pagina devuelve un error 404, el código tal y como lo tienes, debería de continuar... lo único que el contenido que se descargue sera una pagina html del error, no?

Cuando se para el código, en que linea se detiene?

Si el problema es por timeout, puedes añadir esta linea:

1
2
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,30);
curl_setopt($ch, CURLOPT_TIMEOUT, 400);

CURLOPT_CONNECTTIMEOUT -> determina el tiempo de conexión
CURLOPT_TIMEOUT -> determina el tiempo una vez conectado

Los 400 son segundos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de novo34

Extraer datos de otra pagina web con php

Publicado por novo34 (9 intervenciones) el 23/06/2016 12:38:05
Hola, efectivamente como tu lo has dicho, el código funciona bien hasta cuando me da como resultado la pagina html de error.

Ya que este código esta en un formulario en donde ingreso la cédula del cliente lo envío como POST con jQuery y el código lo que hace es buscar en la base de datos si el cliente existe, y si no es así saca el nombre de la pagina y lo guarda en la base de datos, que es cuando genera el error ya que no hay datos que guardar por el html de error, por lo que he intentado poner un if para que cuando de error me diga que debo ingresar los datos manualmente y solo guarde la cédula en la base de datos y no me detenga el resto del código.

este es todo el código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
 
//Variable de búsqueda
$consultaBusqueda = $_POST['valorBusqueda'];
 
 
//Filtro anti-XSS
$caracteres_malos = array("<", ">", "\"", "'", "/", "<", ">", "'", "/");
$caracteres_buenos = array("& lt;", "& gt;", "& quot;", "& #x27;", "& #x2F;", "& #060;", "& #062;", "& #039;", "& #047;");
$consultaBusqueda = str_replace($caracteres_malos, $caracteres_buenos, $consultaBusqueda);
 
//Variable vacía (para evitar los E_NOTICE)
$mensaje = "";
 
 
//Comprueba si $consultaBusqueda está seteado
if (isset($consultaBusqueda)) {
 
 $connection = mysqli_connect("localhost","root","","db_name") or die("Error " . mysqli_error($connection));
 
    //fetch department names from the department table
    $sql = "select * from person where cedula=$consultaBusqueda";
    $result = mysqli_query($connection, $sql) or die("Error " . mysqli_error($connection));
 
  //$result = PersonData::getByCedula();
 
  //Obtiene la cantidad de filas que hay en la result
  $filas = mysqli_num_rows($result);
 
  //Si no existe ninguna fila que sea igual a $consultaBusqueda, entonces mostramos el siguiente mensaje
  if ($filas === 0) {
 
   // busque los antecedentes penales con la cedula en el min del int_erior
 
        $fields = array(
                "tipo" => "getDataWsPn",
                "ci" => $consultaBusqueda,
                "tp" => "C",
        );
 
        $raw_fields = http_build_query($fields);
        // Make the POST
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
        curl_setopt($ch,CURLOPT_URL, "http://www.mdi.gob.ec/minterior1/antecedentes/data.php");
        curl_setopt($ch, CURLOPT_POST, 1);
        // curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS, $raw_fields);
        //execute post
        $results = curl_exec($ch);
        //close connection
        curl_close($ch);
 
        $raw_json = $results;
        $result = json_decode( $raw_json );
 
        $nombre = $result[0]->name;
        $antecedentes = $result[0]->antecedent;
        // echo $nombre;
 
 
 
         /* separar el nombre completo en espacios */
          $tokens = explode(' ', trim($nombre));
          /* arreglo donde se guardan las "palabras" del nombre */
          $names = array();
          /* palabras de apellidos (y nombres) compuetos */
          $special_tokens = array('da', 'de', 'del', 'la', 'las', 'los', 'mac', 'mc', 'van', 'von', 'y', 'i', 'san', 'santa');
 
          $prev = "";
          foreach($tokens as $token) {
              $_token = strtolower($token);
              if(in_array($_token, $special_tokens)) {
                  $prev .= "$token ";
              } else {
                  $names[] = $prev. $token;
                  $prev = "";
              }
          }
 
          $num_nombres = count($names);
          $nombres = $apellidos = "";
          switch ($num_nombres) {
              case 0:
                  $nombres = '';
                  break;
              case 1:
                  $nombres = $names[0];
                  break;
              case 2:
                  $nombres    = $names[0];
                  $apellidos  = $names[1];
                  break;
              case 3:
                  $apellidos = $names[0] . ' ' . $names[1];
                  $nombres   = $names[2];
              default:
                  $apellidos = $names[0] . ' '. $names[1];
                  unset($names[0]);
                  unset($names[1]);
 
                  $nombres = implode(' ', $names);
                  break;
          }
 
          $nombres    = mb_convert_case($nombres, MB_CASE_TITLE, 'UTF-8');
          $apellidos  = mb_convert_case($apellidos, MB_CASE_TITLE, 'UTF-8');
 
 
    // Agrega solo la cedula y nombres del cliente en la base 
    // En caso de error al buscar el nombre acá debería agregar solo la cédula en la base para luego agregar el nombre manualmente
 
    $fecha_hora = date('Y-m-d H:i:s');
    $sql = "insert into person (ced,name, lastname,kind_1,fecha) ";
    $sql .= "value ('$consultaBusqueda','$nombres','$apellidos',1,'$fecha_hora')";
    $result = mysqli_query($connection, $sql) or die("Error " . mysqli_error($connection));
 
    $mensaje = $nombres." ".$apellidos." (".$antecedentes.") "."<p>(Fue registrado en el sistema)</p>";
  } else {
 
    //Si existe alguna fila que sea igual a $consultaBusqueda, entonces mostramos el siguiente mensaje
    //echo '<h1> <strong>'.$consultaBusqueda.'</strong></h1>';
 
    //La variable $resultado contiene el array que se genera en la result, así que obtenemos los datos y los mostramos en un bucle
    while($resultados = mysqli_fetch_array($result)) {
      $nombre = $resultados['name'];
      $apellido = $resultados['lastname'];
 
      //Output
      $mensaje .= $nombre ." ". $apellido;
 
    };//Fin while $resultados
 
  }; //Fin else $filas
 
};//Fin isset $consultaBusqueda
 
//Devolvemos el mensaje que tomará jQuery
echo $mensaje;
 
?>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar