Pergunta

Eu estou procurando uma biblioteca que tem funcionalidade similar ao Perl de WWW :: mechanize , mas para PHP. Basicamente, ele deve permitir-me para enviar HTTP GET e POST solicitações com uma sintaxe simples, e, em seguida, analisar a página e retorno resultando em um formato simples de todas as formas e seus campos, juntamente com todos os links na página.

Eu sei sobre CURL, mas é um pouco barebones, ea sintaxe é muito feio (toneladas de declarações curl_foo($curl_handle, ...)

Esclarecimento:

Eu quero algo mais alto nível do que as respostas até agora. Por exemplo, em Perl, você poderia fazer 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 fazer a mesma coisa usando HTTP_Client ou wget ou CURL seria um monte de trabalho, eu teria que analisar manualmente as páginas para encontrar as ligações, encontrar o URL forma, extrair todos os campos ocultos, e assim por diante. A razão que eu estou pedindo uma solução PHP é que eu não tenho nenhuma experiência com Perl, e eu provavelmente poderia construir o que eu preciso com um monte de trabalho, mas seria muito mais rápido se eu poderia fazer isso em PHP.

Foi útil?

Solução

SimpleTest de ScriptableBrowser pode ser usado independendly do framework de testes. Eu usei-o para inúmeras automação empregos.

Outras dicas

Eu me sinto obrigado a responder a isso, embora seu um post antigo ... Eu tenho trabalhado com PHP onda muito e não é tão bom em qualquer lugar próximo comparável a algo como WWW: Mecanizar, que estou mudando para (eu acho que estou indo para ir com a implementação linguagem ruby) .. onda está desatualizado, pois exige muito "trabalho pesado" para automatizar qualquer coisa, o simpletest navegador script parecia promissor para mim, mas em testá-lo, ele não vai funcionar na maioria dos formulários web eu experimentá-lo ... honestamente, eu acho que PHP está faltando nesta categoria de raspagem, automação web assim o seu melhor para olhar para um idioma diferente, só queria postar isso desde que eu passei inúmeras horas sobre este tema e talvez ele vai salvar alguém em algum momento no futuro.

É 2016 agora e não há Mink . Ele ainda suporta diferentes motores de sem cabeça "navegador"-PHP puro (sem JavaScript), mais de selênio (que precisa de um navegador como o Firefox ou Chrome) para um sem cabeça "browser.js" em NPM, que dá suporte a JavaScript.

Tente procurar na biblioteca PEAR. Se tudo isso falhar, criar um objeto wrapper para curl.

Você pode, então algo simples como isto:

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);
    }
}

Tente um dos seguintes:

(Sim, é código ZendFramework, mas não faz a sua classe mais lenta a usá-lo, uma vez que apenas carrega os libs necessárias.)

Onda é o caminho a percorrer para pedidos simples. Ele é executado em várias plataformas, tem uma extensão PHP e é amplamente adotado e testado.

Eu criei uma boa classe que pode GET e POST uma matriz de dados (incluindo arquivos!) Para uma url por apenas chamando CurlHandler :: Get ($ url, $ dados) || CurlHandler :: Post ($ url, $ dados). Há uma opção HTTP A autenticação do usuário opcional também:)

/**
 * 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 $_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);
        }
    }

}

?>

[editar] Leia o esclarecimento só agora ... Você provavelmente vai querer ir com uma das ferramentas acima mencionadas esse material automatiza. Você também pode decidir usar um clientside extensão firefox como Chickenfoot para obter mais flexibilidade. Vou deixar a classe exemplo acima aqui para pesquisas futuras.

Se você estiver usando CakePHP em seu projeto, ou se você está inclinado para extrair a biblioteca relevantes que você pode usar a sua onda invólucro HttpSocket. Ele tem a sintaxe de página buscar simples que você descreve, por exemplo,

# 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"
)
);

... embora ele não tem uma maneira de analisar a página de resposta. Por que eu vou usar simplehtmldom: http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/ que descreve -se como tendo um jQuery-como sintaxe.

I tendem a concordar que a linha de fundo é que o PHP não tem as bibliotecas impressionantes raspagem / automação que Perl / Ruby ter.

Se você estiver em um sistema * nix você poderia usar shell_exec () com wget, que tem um monte de opções agradáveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top