tag - ¿Cómo implementar un raspador web en PHP?
strip_tags wordpress (15)
De hecho, estoy buscando arañar BibleGateway.com ya que no proporcionan una API para acceder a los versos de una aplicación web que estoy buscando crear.
Parece que puede estar tratando de ''conectar en caliente'' en lugar de raspar, es decir, actualizar en tiempo real en función del contenido de su sitio.
Este tutorial es bastante bueno:
http://www.merchantos.com/makebeta/php/scraping-links-with-php/
Es posible que también desee ver a Prowser.
¿Qué funciones incorporadas de PHP son útiles para el web scraping? ¿Cuáles son algunos buenos recursos (web o impresos) para ponerse al día con el raspado web con PHP?
Aquí hay un tutorial correcto (se eliminó el enlace, ver a continuación) sobre raspado web usando cURL
y file_get_contents
. Asegúrate de leer las siguientes partes también.
(hipervínculo directo eliminado debido a advertencias de malware)
http://www.oooff.com/php-scripts/basic-php-scraped-data-parsing/basic-php-data-parsing.php
Buen ebook PHP web scraping aquí:
Clase raspador de mi marco:
<?php
/*
Example:
$site = $this->load->cls(''scraper'', ''http://www.anysite.com'');
$excss = $site->getExternalCSS();
$incss = $site->getInternalCSS();
$ids = $site->getIds();
$classes = $site->getClasses();
$spans = $site->getSpans();
print ''<pre>'';
print_r($excss);
print_r($incss);
print_r($ids);
print_r($classes);
print_r($spans);
*/
class scraper
{
private $url = '''';
public function __construct($url)
{
$this->url = file_get_contents("$url");
}
public function getInternalCSS()
{
$tmp = preg_match_all(''/(style=")(.*?)(")/is'', $this->url, $patterns);
$result = array();
array_push($result, $patterns[2]);
array_push($result, count($patterns[2]));
return $result;
}
public function getExternalCSS()
{
$tmp = preg_match_all(''/(href=")(/w.*/.css)"/i'', $this->url, $patterns);
$result = array();
array_push($result, $patterns[2]);
array_push($result, count($patterns[2]));
return $result;
}
public function getIds()
{
$tmp = preg_match_all(''/(id="(/w*)")/is'', $this->url, $patterns);
$result = array();
array_push($result, $patterns[2]);
array_push($result, count($patterns[2]));
return $result;
}
public function getClasses()
{
$tmp = preg_match_all(''/(class="(/w*)")/is'', $this->url, $patterns);
$result = array();
array_push($result, $patterns[2]);
array_push($result, count($patterns[2]));
return $result;
}
public function getSpans(){
$tmp = preg_match_all(''/(<span>)(.*)(<//span>)/'', $this->url, $patterns);
$result = array();
array_push($result, $patterns[2]);
array_push($result, count($patterns[2]));
return $result;
}
}
?>
El raspado generalmente abarca 3 pasos:
- primero obtienes o envías tu solicitud a una URL específica
- A continuación, recibe el html que se devuelve como respuesta
- finalmente analizas ese html el texto que deseas raspar.
Para completar los pasos 1 y 2, a continuación se muestra una clase php simple que utiliza Curl para buscar páginas web mediante GET o POST. Después de recuperar el HTML, solo usa expresiones regulares para completar el paso 3 al analizar el texto que desea raspar.
Para las expresiones regulares, mi sitio de tutorial favorito es el siguiente: Tutorial de expresiones regulares
Mi programa favorito para trabajar con RegExs es Regex Buddy . Le aconsejo que pruebe la demostración de ese producto, incluso si no tiene intención de comprarlo. Es una herramienta invaluable e incluso generará código para sus expresiones regulares en el idioma que elija (incluido php).
Uso:
$curl = new Curl();
$html = $curl->get("http://www.google.com"); // now, do your regex work against $html
Clase PHP:
<?php
class Curl
{
public $cookieJar = "";
public function __construct($cookieJarFile = ''cookies.txt'') {
$this->cookieJar = $cookieJarFile;
}
function setup()
{
$header = array();
$header[0] = "Accept: text/xml,application/xml,application/xhtml+xml,";
$header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
$header[] = "Cache-Control: max-age=0";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
$header[] = "Accept-Language: en-us,en;q=0.5";
$header[] = "Pragma: "; // browsers keep this blank.
curl_setopt($this->curl, CURLOPT_USERAGENT, ''Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7'');
curl_setopt($this->curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($this->curl,CURLOPT_COOKIEJAR, $this->cookieJar);
curl_setopt($this->curl,CURLOPT_COOKIEFILE, $this->cookieJar);
curl_setopt($this->curl,CURLOPT_AUTOREFERER, true);
curl_setopt($this->curl,CURLOPT_FOLLOWLOCATION, true);
curl_setopt($this->curl,CURLOPT_RETURNTRANSFER, true);
}
function get($url)
{
$this->curl = curl_init($url);
$this->setup();
return $this->request();
}
function getAll($reg,$str)
{
preg_match_all($reg,$str,$matches);
return $matches[1];
}
function postForm($url, $fields, $referer='''')
{
$this->curl = curl_init($url);
$this->setup();
curl_setopt($this->curl, CURLOPT_URL, $url);
curl_setopt($this->curl, CURLOPT_POST, 1);
curl_setopt($this->curl, CURLOPT_REFERER, $referer);
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $fields);
return $this->request();
}
function getInfo($info)
{
$info = ($info == ''lasturl'') ? curl_getinfo($this->curl, CURLINFO_EFFECTIVE_URL) : curl_getinfo($this->curl, $info);
return $info;
}
function request()
{
return curl_exec($this->curl);
}
}
?>
El raspado puede ser bastante complejo, dependiendo de lo que quieras hacer. Lea esta serie de tutoriales sobre Lo básico de escribir un raspador en PHP y vea si puede entenderlo.
Puede utilizar métodos similares para automatizar registros de formularios, inicios de sesión, ¡incluso clics falsos en anuncios! Sin embargo, las principales limitaciones del uso de CURL son que no admite el uso de javascript, por lo que si está intentando eliminar un sitio que utiliza AJAX para la paginación, por ejemplo, puede ser un poco complicado ... ¡pero hay formas de evitarlo!
Hay un libro "Webbots, arañas y raspadores de pantalla: una guía para desarrollar agentes de Internet con PHP / CURL" sobre este tema - ver una reseña here
PHP-Architect lo cubrió en un artículo bien escrito en el número de diciembre de 2007 de Matthew Turland
La biblioteca Curl le permite descargar páginas web. Deberías buscar expresiones regulares para hacer el raspado.
Me gustaría recomendar esta clase que encontré recientemente. Simple HTML DOM Parser
Recomiendo Goutte, un simple raspador web de PHP .
Ejemplo de uso: -
Cree una instancia de Goutte Client (que amplíe Symfony/Component/BrowserKit/Client
):
use Goutte/Client;
$client = new Client();
Realice solicitudes con el método request()
:
$crawler = $client->request(''GET'', ''http://www.symfony-project.org/'');
El método de request
devuelve un objeto Crawler
( Symfony/Component/DomCrawler/Crawler
).
Haga clic en enlaces:
$link = $crawler->selectLink(''Plugins'')->link();
$crawler = $client->click($link);
Presentar formularios:
$form = $crawler->selectButton(''sign in'')->form();
$crawler = $client->submit($form, array(''signin[username]'' => ''fabien'', ''signin[password]'' => ''xxxxxx''));
Extraer datos:
$nodes = $crawler->filter(''.error_list'');
if ($nodes->count())
{
die(sprintf("Authentification error: %s/n", $nodes->text()));
}
printf("Nb tasks: %d/n", $crawler->filter(''#nb_tasks'')->text());
Si necesita algo que sea fácil de mantener, en lugar de rápido de ejecutar, podría ser útil usar un navegador programable, como SimpleTest''s .
Yo usaría libcurl o Perl''s LWP (libwww para perl). ¿Hay un libwww para php?
aquí hay otro: un raspador PHP simple sin Regex .
ScraperWiki es un proyecto bastante interesante. Te ayuda a construir raspadores en línea en Python, Ruby o PHP. Pude hacer una simple tentativa en pocos minutos.
file_get_contents()
puede tomar una URL remota y darle la fuente. Luego puede usar expresiones regulares (con las funciones compatibles con Perl) para obtener lo que necesita.
Por curiosidad, ¿qué estás tratando de raspar?