Pregunta

Estoy buscando una biblioteca que tenga una funcionalidad similar a la de Perl WWW :: Mecanizar , pero para PHP. Básicamente, debería permitirme enviar solicitudes HTTP GET y POST con una sintaxis simple, y luego analizar la página resultante y devolver en un formato simple todos los formularios y sus campos, junto con todos los enlaces en la página.

Sé sobre CURL, pero es un poco demasiado básico, y la sintaxis es bastante fea (toneladas de curl_foo ($ curl_handle, ...) declaraciones

Aclaración :

Quiero algo más de alto nivel que las respuestas hasta ahora. Por ejemplo, en Perl, podría hacer algo como:

# navigate to the main page
$mech->get( 'http://www.somesite.com/' ); 

# follow a link that contains the text 'download this'
$mech->follow_link( text_regex => qr/download this/i );

# submit a POST form, to log into the site
$mech->submit_form(
    with_fields      => {
        username    => 'mungo',
        password    => 'lost-and-alone',
    }
);

# save the results as a file
$mech->save_content('somefile.zip');

Para hacer lo mismo usando HTTP_Client o wget o CURL sería mucho trabajo, tendría que analizar manualmente las páginas para encontrar los enlaces, encontrar el formulario URL, extraer todos los campos ocultos, etc. La razón por la que solicito una solución PHP es que no tengo experiencia con Perl, y probablemente podría construir lo que necesito con mucho trabajo, pero sería mucho más rápido si pudiera hacer lo anterior en PHP.

¿Fue útil?

Solución

SimpleTest's ScriptableBrowser puede usarse independientemente del marco de prueba. Lo he usado para numerosos trabajos de automatización.

Otros consejos

Me siento obligado a responder esto, a pesar de que es una publicación antigua ... He estado trabajando mucho con PHP curl y no es tan bueno en ningún lugar comparable a algo como WWW: Mechanize, que estoy cambiando a (Creo que voy a ir con la implementación del lenguaje Ruby). Curl está desactualizado ya que requiere demasiado "trabajo duro". para automatizar cualquier cosa, el navegador más simple con secuencias de comandos me pareció prometedor, pero al probarlo, no funcionará en la mayoría de los formularios web. lo mejor es mirar un idioma diferente, solo quería publicar esto ya que he pasado innumerables horas sobre este tema y tal vez le ahorrará a alguien más tiempo en el futuro.

Ahora es 2016 y hay Mink . Incluso es compatible con diferentes motores desde el navegador PHP sin cabeza '' (sin JavaScript), a través de Selenium (que necesita un navegador como Firefox o Chrome) a un "browser.js" sin cabeza en NPM, que admite JavaScript.

Intenta buscar en la biblioteca PEAR. Si todo lo demás falla, cree un contenedor de objetos para curl.

Puedes hacer algo tan simple como esto:

class curl {
    private $resource;

    public function __construct($url) {
        $this->resource = curl_init($url);
    }

    public function __call($function, array $params) {
        array_unshift($params, $this->resource);
        return call_user_func_array("curl_$function", $params);
    }
}

Pruebe uno de los siguientes:

(Sí, es el código ZendFramework, pero no hace que su clase sea más lenta al usarlo, ya que solo carga las librerías requeridas).

Curl es el camino a seguir para solicitudes simples. Corre multiplataforma, tiene una extensión PHP y es ampliamente adoptado y probado.

Creé una buena clase que puede OBTENER y PUBLICAR una matriz de datos (¡INCLUYENDO ARCHIVOS!) en una url simplemente llamando a CurlHandler :: Get ($ url, $ data) || CurlHandler :: Post ($ url, $ datos). También hay una opción de autenticación de usuario HTTP opcional :)

/**
 * CURLHandler handles simple HTTP GETs and POSTs via Curl 
 * 
 * @package Pork
 * @author SchizoDuckie
 * @copyright SchizoDuckie 2008
 * @version 1.0
 * @access public
 */
class CURLHandler
{

    /**
     * CURLHandler::Get()
     * 
     * Executes a standard GET request via Curl.
     * Static function, so that you can use: CurlHandler::Get('http://www.google.com');
     * 
     * @param string $url url to get
     * @return string HTML output
     */
    public static function Get($url)
    {
       return self::doRequest('GET', $url);
    }

    /**
     * CURLHandler::Post()
     * 
     * Executes a standard POST request via Curl.
     * Static function, so you can use CurlHandler::Post('http://www.google.com', array('q'=>'StackOverFlow'));
     * If you want to send a File via post (to e.g. PHP's 

Curl es el camino a seguir para solicitudes simples. Corre multiplataforma, tiene una extensión PHP y es ampliamente adoptado y probado.

Creé una buena clase que puede OBTENER y PUBLICAR una matriz de datos (¡INCLUYENDO ARCHIVOS!) en una url simplemente llamando a CurlHandler :: Get ($ url, $ data) || CurlHandler :: Post ($ url, $ datos). También hay una opción de autenticación de usuario HTTP opcional :)

<*>

[edit] Lea la aclaración solo ahora ... Probablemente quiera ir con una de las herramientas mencionadas anteriormente que automatiza las cosas. También puede optar por usar una extensión firefox del lado del cliente como ChickenFoot para obtener más información flexibilidad. Dejaré la clase de ejemplo anterior aquí para futuras búsquedas.

FILES), prefix the value of an item with an @ ! * @param string $url url to post data to * @param Array $vars Array with key=>value pairs to post. * @return string HTML output */ public static function Post($url, $vars, $auth = false) { return self::doRequest('POST', $url, $vars, $auth); } /** * CURLHandler::doRequest() * This is what actually does the request * <pre> * - Create Curl handle with curl_init * - Set options like CURLOPT_URL, CURLOPT_RETURNTRANSFER and CURLOPT_HEADER * - Set eventual optional options (like CURLOPT_POST and CURLOPT_POSTFIELDS) * - Call curl_exec on the interface * - Close the connection * - Return the result or throw an exception. * </pre> * @param mixed $method Request Method (Get/ Post) * @param mixed $url URI to get or post to * @param mixed $vars Array of variables (only mandatory in POST requests) * @return string HTML output */ public static function doRequest($method, $url, $vars=array(), $auth = false) { $curlInterface = curl_init(); curl_setopt_array ($curlInterface, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FOLLOWLOCATION =>1, CURLOPT_HEADER => 0)); if (strtoupper($method) == 'POST') { curl_setopt_array($curlInterface, array( CURLOPT_POST => 1, CURLOPT_POSTFIELDS => http_build_query($vars)) ); } if($auth !== false) { curl_setopt($curlInterface, CURLOPT_USERPWD, $auth['username'] . ":" . $auth['password']); } $result = curl_exec ($curlInterface); curl_close ($curlInterface); if($result === NULL) { throw new Exception('Curl Request Error: '.curl_errno($curlInterface) . " - " . curl_error($curlInterface)); } else { return($result); } } } ?>

[edit] Lea la aclaración solo ahora ... Probablemente quiera ir con una de las herramientas mencionadas anteriormente que automatiza las cosas. También puede optar por usar una extensión firefox del lado del cliente como ChickenFoot para obtener más información flexibilidad. Dejaré la clase de ejemplo anterior aquí para futuras búsquedas.

Si está utilizando CakePHP en su proyecto, o si está dispuesto a extraer la biblioteca relevante, puede usar su envoltorio de rizos HttpSocket. Tiene la sintaxis simple de búsqueda de páginas que describe, por ejemplo,

# This is the sugar for importing the library within CakePHP       
App::import('Core', 'HttpSocket');
$HttpSocket = new HttpSocket();

$result = $HttpSocket->post($login_url,
array(
  "username" => "username",
  "password" => "password"
)
);

... aunque no tiene forma de analizar la página de respuesta. Para eso voy a usar simplehtmldom: http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/ que describe como una sintaxis similar a jQuery.

Tiendo a estar de acuerdo en que la conclusión es que PHP no tiene las impresionantes bibliotecas de raspado / automatización que tiene Perl / Ruby.

Si está en un sistema * nix, podría usar shell_exec () con wget, que tiene muchas buenas opciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top