Question

Je recherche une bibliothèque ayant une fonctionnalité similaire à celle de Perl WWW :: Mechanize , mais pour PHP. En gros, cela devrait me permettre de soumettre des requêtes HTTP GET et POST avec une syntaxe simple, puis d’analyser la page résultante et de renvoyer dans un format simple tous les formulaires et leurs champs, ainsi que tous les liens de la page.

Je connais CURL, mais c'est un peu trop barebone et la syntaxe est plutôt moche (des tonnes de curl_foo ($ curl_handle, ...)

Clarification:

Je veux quelque chose de plus haut niveau que les réponses à ce jour. Par exemple, en Perl, vous pourriez faire quelque chose comme:

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

Faire la même chose en utilisant HTTP_Client ou wget ou CURL serait beaucoup de travail, je devrais analyser manuellement les pages pour trouver les liens, trouver l'URL du formulaire, extraire tous les champs cachés, etc. Si je demande une solution PHP, c'est que je n'ai aucune expérience de Perl et que je pourrais probablement construire ce dont j'ai besoin avec beaucoup de travail, mais ce serait beaucoup plus rapide si je pouvais faire ce qui précède en PHP.

Était-ce utile?

La solution

Le ScriptableBrowser de SimpleTest peut être utilisé indépendamment du cadre de test. Je l'ai utilisé pour de nombreux travaux d'automatisation.

Autres conseils

Je me sens obligé de répondre à cette question, même si c’est un vieux message. Je travaille beaucoup avec PHP Curl et il n’est pas aussi performant que l’on peut comparer à quelque chose comme WWW: Mechanize, vers lequel je me tourne. (Je pense que je vais aller avec l’implémentation du langage Ruby) .. Curl est obsolète, car il nécessite trop de travail "grognement". pour automatiser quoi que ce soit, le navigateur scriptable le plus simple me paraissait prometteur, mais en le testant, il ne fonctionnera pas avec la plupart des formulaires Web que j'essaie ... honnêtement, je pense que PHP manque dans cette catégorie de grattage, l'automatisation Web. Il est préférable de regarder une autre langue. Je voulais simplement publier ceci car j'ai passé d'innombrables heures sur ce sujet et peut-être que cela sauvera du temps à quelqu'un d'autre.

Nous sommes en 2016 et il existe un Mink . Il prend même en charge différents moteurs, du type navigateur sans navigateur en PHP pur sans tête. (sans JavaScript), via Selenium (qui nécessite un navigateur tel que Firefox ou Chrome) vers un "browser.js" sans tête dans NPM, qui supporte JavaScript.

Essayez de regarder dans la bibliothèque PEAR. Si tout échoue, créez un wrapper d'objet pour curl.

Vous pouvez faire quelque chose de simple comme ceci:

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

Essayez l'une des solutions suivantes:

(Oui, c'est du code ZendFramework, mais votre classe ne sera pas ralentie par son utilisation car elle ne charge que les bibliothèques requises.)

Curl est la solution idéale pour les demandes simples. Il fonctionne sur plusieurs plates-formes, possède une extension PHP et est largement adopté et testé.

J'ai créé une belle classe qui peut obtenir et poster un tableau de données (y compris des fichiers!) dans une URL en appelant simplement CurlHandler :: Get ($ url, $ data) || CurlHandler :: Post ($ url, $ data). Il existe également une option facultative d’authentification de l’utilisateur HTTP:)

/**
 * 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 est la solution idéale pour les demandes simples. Il fonctionne sur plusieurs plates-formes, possède une extension PHP et est largement adopté et testé.

J'ai créé une belle classe qui peut obtenir et poster un tableau de données (y compris des fichiers!) dans une URL en appelant simplement CurlHandler :: Get ($ url, $ data) || CurlHandler :: Post ($ url, $ data). Il existe également une option facultative d’authentification de l’utilisateur HTTP:)

<*>

[edit] Lisez la clarification seulement maintenant ... Vous voudrez probablement utiliser l'un des outils mentionnés ci-dessus qui automatise les commandes. Vous pouvez également décider d'utiliser une extension firefox côté client telle que ChickenFoot pour plus d'informations. la flexibilité. Je laisserai ici la classe d'exemple ci-dessus pour les recherches futures.

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] Lisez la clarification seulement maintenant ... Vous voudrez probablement utiliser l'un des outils mentionnés ci-dessus qui automatise les commandes. Vous pouvez également décider d'utiliser une extension firefox côté client telle que ChickenFoot pour plus d'informations. la flexibilité. Je laisserai ici la classe d'exemple ci-dessus pour les recherches futures.

Si vous utilisez CakePHP dans votre projet, ou si vous êtes enclin à extraire la bibliothèque appropriée, vous pouvez utiliser leur wrapper curl HttpSocket. Il a la syntaxe de récupération de page simple que vous décrivez, par exemple,

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

... bien qu'il ne dispose pas d'un moyen d'analyser la page de réponse. Pour cela, je vais utiliser simplehtmldom: http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/ qui décrit lui-même comme ayant une syntaxe de type jQuery.

Je suis plutôt d’accord pour dire que PHP ne dispose pas des superbes librairies de scraping / automation de Perl / Ruby.

Si vous utilisez un système * nix, vous pouvez utiliser shell_exec () avec wget, qui offre de nombreuses options intéressantes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top