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!
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.
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
<?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();
?>
<?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.
Puedes hacerlo con PHP:
$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
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 ;)