2009-10-29 18 views
8

Estoy buscando una biblioteca PHP que me permita eliminar páginas web y cuidar todas las cookies y rellenar los formularios con los valores predeterminados, eso es lo que más me molesta.Scraping Library para PHP - phpQuery?

Estoy cansado de tener que hacer coincidir todos los elementos de entrada con xpath y me encantaría que existiera algo mejor. Me encontré con phpQuery pero el manual no está muy claro y no puedo encontrar la manera de realizar solicitudes POST.

¿Alguien me puede ayudar? Gracias.

@ Jonathan Fingland:

En el ejemplo proporcionado por el manual para browserGet() tenemos:

require_once('phpQuery/phpQuery.php'); 

phpQuery::browserGet('http://google.com/', 'success1'); 

function success1($browser) 
{ 
    $browser->WebBrowser('success2') 
    ->find('input[name=q]')->val('search phrase') 
    ->parents('form') 
    ->submit(); 
} 

function success2($browser) 
{ 
    echo $browser; 
} 

supongo que todos los demás campos son desguazados y enviar de vuelta en la solicitud GET , Quiero hacer lo mismo con el método phpQuery :: browserPost() pero no sé cómo hacerlo. El formulario que estoy tratando de eliminar tiene un token de entrada y me encantaría que phpQuery fuera lo suficientemente inteligente como para raspar el token y simplemente dejarme cambiar los otros campos (en este caso, nombre de usuario y contraseña), enviar por correo todo.

PS: Tenga la seguridad, esto es no va a ser utilizado por el correo basura.

+2

+1 no tiene una respuesta, pero esperamos otros comentarios – Andrew

+0

Si el manual no está claro, entonces puede intentar leer el código fuente –

+1

La vida es bastante difícil para los spammers en estos días. –

Respuesta

2

Ver http://code.google.com/p/phpquery/wiki/Ajax y en particular:

phpQuery::post($url, $data, $callback, $type)

y

# data Object, String que define el parámetro de datos como un objeto o una cadena. Publicar demanda debería ser posible utilizando el formato de cadena de consulta, por ejemplo:

$data = "username=Jon&password=123456"; 
$url = "http://www.mysite.com/login.php"; 
phpQuery::post($url, $data, $callback, $type) 

como phpQuery es un puerto jQuery la firma del método es el mismo (los documentos vinculan directamente al sitio de jQuery - http://docs.jquery.com/Ajax/jQuery.post)

Editar

Dos cosas:

también hay una función phpQuery::browserPost que podría cumplir con su n se siente mejor

Sin embargo, también tenga en cuenta que la devolución de llamada success2 solo se invoca en los métodos submit() or click(), por lo que puede completar todos los campos del formulario antes de eso.

p. Ej.

require_once('phpQuery/phpQuery.php'); 
phpQuery::browserGet('http://www.mysite.com/login.php', 'success1'); 
function success1($browser) { 
    $handle = $browser 
    ->WebBrowser('success2'); 
    $handle 
    ->find('input[name=username]') 
     ->val('Jon'); 
    $handle 
    ->find('input[name=password]') 
     ->val('123456'); 
     ->parents('form') 
     ->submit(); 
} 
function success2($browser) { 
    print $browser; 
} 

(Tenga en cuenta que esto no ha sido probado, pero debería trabajo)

+0

Por favor revisa mi actualización. –

0

Utilizaría una biblioteca dedicada para analizar archivos HTML y una biblioteca dedicada para procesar solicitudes HTTP. Usar la misma biblioteca para ambos parece una mala idea, IMO.

Para procesar solicitudes de HTTP, echa un vistazo, por ejemplo. Httpful, Unirest, Requests o Guzzle. Guzzle es especialmente popular en estos días, pero al final, la biblioteca que mejor funcione para usted es aún una cuestión de gusto personal.

Para analizar archivos HTML, recomendaría una biblioteca que escribí yo mismo: DOM-Query. Le permite (1) cargar un archivo HTML y luego (2) seleccionar o cambiar partes de su HTML más o menos de la misma manera que lo haría si estuviera usando jQuery en una aplicación de interfaz.