Domanda

Sto cercando una libreria che abbia funzionalità simili a quelle di Perl WWW :: Mechanize , ma per PHP. Fondamentalmente, dovrebbe permettermi di inviare richieste HTTP GET e POST con una semplice sintassi, quindi analizzare la pagina risultante e restituire in un formato semplice tutti i moduli e i loro campi, insieme a tutti i collegamenti sulla pagina.

Conosco CURL, ma è un po 'troppo spoglio e la sintassi è piuttosto brutta (tonnellate di curl_foo ($ curl_handle, ...)

Chiarimento:

Voglio qualcosa di più alto livello rispetto alle risposte finora. Ad esempio, in Perl, potresti fare qualcosa del tipo:

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

Per fare la stessa cosa usando HTTP_Client o wget o CURL sarebbe un sacco di lavoro, dovrei analizzare manualmente le pagine per trovare i collegamenti, trovare l'URL del modulo, estrarre tutti i campi nascosti e così via. Il motivo per cui sto chiedendo una soluzione PHP è che non ho esperienza con Perl e probabilmente potrei costruire ciò di cui ho bisogno con molto lavoro, ma sarebbe molto più veloce se potessi fare quanto sopra in PHP.

È stato utile?

Soluzione

ScriptableBrowser di SimpleTest può essere utilizzato indipendentemente dal framework di test. L'ho usato per numerosi lavori di automazione.

Altri suggerimenti

Mi sento in dovere di rispondere a questo, anche se è un vecchio post ... Ho lavorato molto con PHP curl e non è altrettanto buono da paragonare a qualcosa come WWW: Mechanize, a cui sto passando (Penso che andrò con l'implementazione del linguaggio Ruby). Il ricciolo è obsoleto perché richiede troppo "lavoro grugnito". per automatizzare qualsiasi cosa, il browser con script più semplice mi è sembrato promettente ma nel testarlo, non funzionerà sulla maggior parte dei moduli web su cui lo provo ... onestamente, penso che a PHP manchi questa categoria di scraping, automazione web quindi meglio guardare una lingua diversa, volevo solo pubblicare questo dato che ho trascorso innumerevoli ore su questo argomento e forse salverà qualcun altro un po 'di tempo in futuro.

Ora è il 2016 e c'è Mink . Supporta anche motori diversi dal puro PHP "browser" senza testa (senza JavaScript), su Selenium (che necessita di un browser come Firefox o Chrome) su un "browser.js" senza testa. in NPM, che supporta JavaScript.

Prova a cercare nella libreria PEAR. Se tutto il resto fallisce, crea un wrapper di oggetti per arricciare.

Puoi così qualcosa di semplice come questo:

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

Prova una delle seguenti opzioni:

(Sì, è il codice ZendFramework, ma non rende la tua classe più lenta usandola poiché carica solo le librerie richieste.)

Curl è la strada da percorrere per richieste semplici. Funziona su più piattaforme, ha un'estensione PHP ed è ampiamente adottato e testato.

Ho creato una bella classe che può OTTENERE e POSTARE un array di dati (INCLUSI FILE!) a un url semplicemente chiamando CurlHandler :: Get ($ url, $ data) || CurlHandler :: Post ($ url, $ data). C'è anche un'opzione di autenticazione utente HTTP opzionale :)

/**
 * 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 è la strada da percorrere per richieste semplici. Funziona su più piattaforme, ha un'estensione PHP ed è ampiamente adottato e testato.

Ho creato una bella classe che può OTTENERE e POSTARE un array di dati (INCLUSI FILE!) a un url semplicemente chiamando CurlHandler :: Get ($ url, $ data) || CurlHandler :: Post ($ url, $ data). C'è anche un'opzione di autenticazione utente HTTP opzionale :)

<*>

[modifica] Leggi il chiarimento solo ora ... Probabilmente vuoi andare con uno degli strumenti sopra menzionati che automatizza le cose. Potresti anche decidere di utilizzare un'estensione firefox sul lato client come ChickenFoot per ulteriori informazioni flessibilità. Lascerò la classe di esempio qui sopra per ricerche future.

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

[modifica] Leggi il chiarimento solo ora ... Probabilmente vuoi andare con uno degli strumenti sopra menzionati che automatizza le cose. Potresti anche decidere di utilizzare un'estensione firefox sul lato client come ChickenFoot per ulteriori informazioni flessibilità. Lascerò la classe di esempio qui sopra per ricerche future.

Se stai usando CakePHP nel tuo progetto, o se sei propenso ad estrarre la libreria pertinente, puoi usare il loro avvolgitore a ricciolo HttpSocket. Ha la semplice sintassi di recupero delle pagine che descrivi, ad esempio

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

... sebbene non abbia modo di analizzare la pagina di risposta. Per questo userò simplehtmldom: http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/ che descrive come se avesse una sintassi simile a jQuery.

Tendo a concordare sul fatto che la linea di fondo è che PHP non ha le fantastiche librerie di automazione / scraping di Perl / Ruby.

Se usi un sistema * nix puoi usare shell_exec () con wget, che ha molte opzioni interessanti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top