Frage

Ich bin für eine Bibliothek, die eine ähnliche Funktionalität wie Perl WWW :: Mechanize , aber für PHP. Grundsätzlich sollte es mich erlauben einreichen HTTP GET und POST-Anfragen mit einer einfachen Syntax, und dann analysieren, um die resultierenden Seite und kehrt in einem einfachen Format alle Formen und ihre Felder, zusammen mit allen Links auf der Seite.

Ich weiß, über CURL, aber es ist ein wenig zu Barebones, und die Syntax ist ziemlich hässlich (Tonnen curl_foo($curl_handle, ...) Aussagen

Zur Verdeutlichung:

Ich möchte etwas mehr High-Level als die Antworten bisher. Zum Beispiel in Perl, könnten Sie so etwas wie:

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

Um das gleiche zu tun mit HTTP_Client oder wget oder ROTATION viel Arbeit wäre, würde ich manuell die Seiten analysieren die Links zu finden, finden Sie das Formular URL, extrahieren Sie alle versteckten Felder, und so weiter. Der Grund, warum ich für eine PHP-Lösung bin gefragt ist, dass ich keine Erfahrung mit Perl, und ich könnte wahrscheinlich bauen, was ich mit vieler Arbeit benötigen, aber es wäre viel schneller, wenn ich die oben in PHP tun könnte.

War es hilfreich?

Lösung

ScriptableBrowser können independendly aus dem Test-Framework verwendet werden. Ich habe es für eine Vielzahl von Automatisierungsjobs verwendet.

Andere Tipps

Ich glaube gezwungen, dies zu beantworten, auch wenn seine alten Post ... Ich habe mit PHP arbeiten viel curl und es ist nicht so gut, irgendwo in der Nähe vergleichbar mit so etwas wie WWW: Mechanize, die ich bin zu Schalt (ich glaube, ich mit der Sprache Ruby-Implementierung gehen werde) .. Locke ist veraltet, da es zu viel „Grunzen Arbeit“ erfordert etwas zu automatisieren, der Simpleskriptfähige Browser sah mir vielversprechend, aber es zu testen, wird es nicht funktionieren auf den meisten Web-Formulare ich es auf versuchen ... ehrlich, ich denke, PHP in dieser Kategorie von Schaben fehlt, Web-Automatisierung, um seine besten auf einer anderen Sprache zu suchen, dies wollte schreiben gerade da ich unzählige Stunden zu diesem Thema verbracht haben, und vielleicht wird es jemanden anderes einige Zeit in der Zukunft zu retten.

Es ist 2016 jetzt und es gibt Mink . Es unterstützt auch verschiedene Motoren von kopflos rein PHP „Browser“ (ohne JavaScript), über Selen zu einem kopflos „browser.js“ in NPM (die einen Browser wie Firefox oder Chrome benötigt), die JavaScript unterstützt.

Versuchen Sie, in der PEAR-Bibliothek suchen. Wenn alles andere fehlschlägt, erstellen Sie ein Objekt-Wrapper für curl.

Sie können so etwas Einfaches wie folgt aus:

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

Versuchen Sie eine der folgenden Möglichkeiten:

(Ja, es ist ZendFramework Code, aber es macht nicht Ihre Klasse langsamer es verwenden, da es nur die benötigte Libs lädt.)

Locke ist der Weg für einfache Anfragen zu gehen. Es läuft Cross-Plattform, hat eine PHP-Erweiterung und wird weithin angenommen und getestet.

habe ich eine nette Klasse, die ein Array von Daten GET und POST kann (einschließlich Dateien!) Zu einer URL von nur anrufen CurlHandler :: Get ($ url, $ data) || CurlHandler :: Post ($ url, $ data). Es gibt eine optionale HTTP-Benutzerauthentifizierung Option zu:)

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

}

?>

[Bearbeiten] Lesen Sie die Klärung erst jetzt ... Sie wahrscheinlich mit einem der oben genannten Werkzeugen, dass automatisiert Sachen erwähnt gehen wollen. Sie könnten auch eine client Firefox-Erweiterung wie Chicken für mehr verwenden möchten Flexibilität. Ich werde das Beispiel Klasse verlassen oben hier für zukünftige Suchen.

Wenn Sie CakePHP in Ihrem Projekt verwenden, oder wenn Sie geneigt, die entsprechenden Bibliothek extrahieren Sie ihre curl Wrapper HttpSocket verwenden können. Es hat die einfache Seite-Abrufen Syntax Sie beschreiben, zum Beispiel

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

... obwohl es keine Möglichkeit hat, die Antwort-Seite zu analysieren. Dafür werde ich simplehtmldom verwenden: http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/ , die beschreibt, selbst als eine jQuery-ähnliche Syntax hat.

Ich neige dazu, zu bestätigen, dass das Endergebnis ist, dass PHP nicht über die genial Schaben / Automatisierungsbibliotheken, die Perl / Ruby-haben.

Wenn Sie auf einem * nix-System sind Sie shell_exec () mit wget verwenden könnte, die viele nette Optionen hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top