[Resuelto] Sacar datos de una web y meterlos en un fichero

Iniciado por ccrunch, 14 Julio 2015, 13:51 PM

0 Miembros y 1 Visitante están viendo este tema.

ccrunch

Hola a todos, por cuestiones varias necesito sacar el correo electrónico de todos los centros de educación de Valencia.

En esta página: http://www.cece.gva.es/ocd/areacd/es/consulta01.asp al pinchar sobre el código se abre otra página donde aparece el campo "E-Correo:"

Necesito sacar el valor de ese campo de todos los centros y meterlos en un fichero de modo direccion@correo.com; direccion2@correo.com

Alguien me puede ayudar?

Le he dado vueltas pero no consigo sacarlo adelante.

Salu2 y gracias a todos!

moikano→@

Pues lo primero que tienes que sacar son los enlaces. Con expresiones regulares sobre el mismo código de la página que has dado se pueden sacar todos.

Si son algo así.

centro.asp?codi=46019155

Pues busca una expresión regular para sacarlas todas.

Y luego con un script haces curl a todos esos enlaces, poniendo un delay entre petición y petición ya que puede que tengan algún sistema de limitación de peticiones, y vuelves ha hacer una expresión regular para sacar cada correo, que por cierto no lleva protección alguna así que son fáciles de sacar.

Suerte.

MinusFour

#2
Lo ideal sería que hicieras una petición inicial para parsear la tabla y sacar los links. Una vez que hace eso, lanzar peticiones a cada una de las paginas. Son cerca de 1000 peticiones por lo que vas a tener que darle un delay de 500-1000 ms para que no te bloquee su servidor.

Edit: Me puse a jugar un poco con un script, estaba un poco aburrido:

http://pastebin.com/yfmQKyfb

Código (php) [Seleccionar]

<?php
include 'Petition.php';
set_time_limit(0);
class 
Test {
public static function init(){
$petition = new Petition('http://www.cece.gva.es/ocd/areacd/es/consulta01.asp');
$petition->enableTransfer(true);
$data $petition->process();
preg_match_all('/centro\.asp\?codi\=([0-9]{8})/'$data$matches);
foreach($matches[1] as $cod){
$pet = new Petition('http://www.cece.gva.es/ocd/areacd/es/centro.asp?codi='.$cod);
$pet->enableTransfer(true);
$dom = @DOMDocument::loadHTML($pet->process());
$domElement $dom->getElementById('contenidoInferior');
$node $domElement->getElementsByTagName('table')->item('2')->childNodes->item('3')->childNodes->item('2');
echo $node->nodeValue '; ';
usleep(500000);
}
}
}
Test::init();
?>


Código (php) [Seleccionar]

<?php
class Petition {
private $handler;
private $url;

public function __construct($url null){
$this->handler curl_init();
if($url){
$this->setUrl($url);
}
}

public function __destruct(){
curl_close($this->handler);
}

public function setOption($optName$value){
return curl_setopt($this->handler$optName$value);
}

public function setUrl($url){
$this->url $url;
$this->setOption(CURLOPT_URL$url);
}

public function enableTransfer($val){
$this->setOption(CURLOPT_RETURNTRANSFER$val);
}

public function setUserAgent($val){
$this->setOption(CURLOPT_USERAGENT$val);
}

public function setReferer($val){
$this->setOption(CURLOPT_REFERER$val);
}

public function getUrl(){
return $this->url;
}

public function process(){
$result curl_exec($this->handler);
if($result === false){
throw Exception(curl_error($this->handler));
}
return $result;
}
}
?>


Realmente no es necesario la clase Petition. Puedes usar fopen o similar.

Usuario Invitado

Puedes hacerlo con PHP:

Código (php) [Seleccionar]

$dom = new DOMDocument;
$dom->loadHTMLFile('la_url');
$table = $dom->getElementsByTagName('table')[0];
$links = $table->getElementsByTagName('a');
// haces peticiones a cada link, y extraes el correo (debe tener algun id asociado o por el estilo) de la misma forma
"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein

ccrunch

Hola, gracias a todos y especialmente a MinusFour que me ha sacado de un gran apuro  :xD me ha funcionado a la perfección y se ha resuelto el problema.

Gracias otra vez.

Te debo una compadre  ;)