Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: ccrunch en 14 Julio 2015, 13:51 pm



Título: [Resuelto] Sacar datos de una web y meterlos en un fichero
Publicado por: ccrunch en 14 Julio 2015, 13:51 pm
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!


Título: Re: Sacar datos de una web y meterlos en un fichero
Publicado por: moikano→@ en 14 Julio 2015, 15:14 pm
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í.

Código:
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.


Título: Re: Sacar datos de una web y meterlos en un fichero
Publicado por: MinusFour en 14 Julio 2015, 16:28 pm
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
  1. <?php
  2. include 'Petition.php';
  3. class Test {
  4. public static function init(){
  5. $petition = new Petition('http://www.cece.gva.es/ocd/areacd/es/consulta01.asp');
  6. $petition->enableTransfer(true);
  7. $data = $petition->process();
  8. preg_match_all('/centro\.asp\?codi\=([0-9]{8})/', $data, $matches);
  9. foreach($matches[1] as $cod){
  10. $pet = new Petition('http://www.cece.gva.es/ocd/areacd/es/centro.asp?codi='.$cod);
  11. $pet->enableTransfer(true);
  12. $dom = @DOMDocument::loadHTML($pet->process());
  13. $domElement = $dom->getElementById('contenidoInferior');
  14. $node = $domElement->getElementsByTagName('table')->item('2')->childNodes->item('3')->childNodes->item('2');
  15. echo $node->nodeValue . '; ';
  16. usleep(500000);
  17. }
  18. }
  19. }
  20. Test::init();
  21. ?>

Código
  1. <?php
  2. class Petition {
  3. private $handler;
  4. private $url;
  5.  
  6. public function __construct($url = null){
  7. $this->handler = curl_init();
  8. if($url){
  9. $this->setUrl($url);
  10. }
  11. }
  12.  
  13. public function __destruct(){
  14. curl_close($this->handler);
  15. }
  16.  
  17. public function setOption($optName, $value){
  18. return curl_setopt($this->handler, $optName, $value);
  19. }
  20.  
  21. public function setUrl($url){
  22. $this->url = $url;
  23. $this->setOption(CURLOPT_URL, $url);
  24. }
  25.  
  26. public function enableTransfer($val){
  27. $this->setOption(CURLOPT_RETURNTRANSFER, $val);
  28. }
  29.  
  30. public function setUserAgent($val){
  31. $this->setOption(CURLOPT_USERAGENT, $val);
  32. }
  33.  
  34. public function setReferer($val){
  35. $this->setOption(CURLOPT_REFERER, $val);
  36. }
  37.  
  38. public function getUrl(){
  39. return $this->url;
  40. }
  41.  
  42. public function process(){
  43. $result = curl_exec($this->handler);
  44. if($result === false){
  45. throw Exception(curl_error($this->handler));
  46. }
  47. return $result;
  48. }
  49. }
  50. ?>

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


Título: Re: Re: Sacar datos de una web y meterlos en un fichero
Publicado por: Usuario Invitado en 14 Julio 2015, 16:54 pm
Puedes hacerlo con PHP:

Código
  1. $dom = new DOMDocument;
  2. $dom->loadHTMLFile('la_url');
  3. $table = $dom->getElementsByTagName('table')[0];
  4. $links = $table->getElementsByTagName('a');
  5. // haces peticiones a cada link, y extraes el correo (debe tener algun id asociado o por el estilo) de la misma forma
  6.  


Título: Re: Sacar datos de una web y meterlos en un fichero
Publicado por: ccrunch en 17 Julio 2015, 14:02 pm
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  ;)