Gibt es ein PHP-Äquivalent zu WWW::Mechanize von Perl?

Lesezeit: 7 Minuten

Gibt es ein PHP Aquivalent zu WWWMechanize von Perl
davr

Ich suche nach einer Bibliothek, die eine ähnliche Funktionalität wie Perl hat WWW::Mechanisieren, aber für PHP. Grundsätzlich sollte es mir ermöglichen, HTTP GET- und POST-Anforderungen mit einer einfachen Syntax zu senden und dann die resultierende Seite zu parsen und alle Formulare und ihre Felder zusammen mit allen Links auf der Seite in einem einfachen Format zurückzugeben.

Ich kenne CURL, aber es ist ein bisschen zu barebones und die Syntax ist ziemlich hässlich (Tonnen von curl_foo($curl_handle, ...) Aussagen

Klärung:

Ich möchte etwas Höheres als die bisherigen Antworten. In Perl könnten Sie beispielsweise Folgendes tun:

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

Das Gleiche mit HTTP_Client, wget oder CURL zu tun, wäre eine Menge Arbeit, ich müsste die Seiten manuell parsen, um die Links zu finden, die Formular-URL zu finden, alle versteckten Felder zu extrahieren und so weiter. Der Grund, warum ich nach einer PHP-Lösung frage, ist, dass ich keine Erfahrung mit Perl habe und wahrscheinlich mit viel Arbeit bauen könnte, was ich brauche, aber es wäre viel schneller, wenn ich das oben Genannte in PHP machen könnte.

Gibt es ein PHP Aquivalent zu WWWMechanize von Perl
troelskn

SimpleTests Skriptfähiger Browser kann unabhängig vom Testframework verwendet werden. Ich habe es für zahlreiche Automatisierungsaufgaben verwendet.

  • Das sieht sehr gut aus, muss ich ausprobieren. Es hat so ziemlich alles, was ich brauche, es fehlt nur eine Möglichkeit, alle Links / Formulare auf einer Seite aufzulisten, aber ich denke, ich könnte damit auskommen.

    – davr

    13. Oktober 2008 um 23:30 Uhr

  • Sie können $browser->getUrls() verwenden. Andernfalls können Sie immer $dom = DomDocument::loadHtml($browser->getContent()) und dann $dom->getElementsByTagName(“a”) verwenden, wenn Sie mehr Kontrolle benötigen.

    – troelskn

    14. Oktober 2008 um 11:07 Uhr

Ich fühle mich gezwungen, dies zu beantworten, obwohl es ein alter Beitrag ist … Ich habe viel mit PHP Curl gearbeitet und es ist nicht annähernd vergleichbar mit etwas wie WWW: Mechanize, zu dem ich wechsle (glaube ich Ich werde mich für die Ruby-Sprachimplementierung entscheiden). Formen, an denen ich es ausprobiere … ehrlich gesagt, ich denke, PHP fehlt in dieser Kategorie von Scraping, Web-Automatisierung, also ist es am besten, sich eine andere Sprache anzusehen, wollte dies nur posten, da ich unzählige Stunden mit diesem Thema verbracht habe und vielleicht es wird in Zukunft jemand anderem Zeit ersparen.

Es ist 2016 jetzt und da ist Nerz. Es unterstützt sogar verschiedene Engines von Headless Pure-PHP “Browser” (ohne JavaScript) über Selenium (das einen Browser wie Firefox oder Chrome benötigt) bis hin zu einem Headless “browser.js” in NPM, das JavaScript unterstützt.

  • Das ist immens nützlich und viel besser als alles andere, was auf dieser Seite erwähnt wird. Danke für das Update!

    – supersan

    8. Dezember 2016 um 13:04 Uhr

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

Sie können so etwas Einfaches tun:

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 eines der folgenden:

(Ja, es ist ZendFramework-Code, aber es macht Ihre Klasse nicht langsamer, da es nur die erforderlichen Bibliotheken lädt.)

  • Sie machen immer noch viel mehr Arbeit als Mechanize, siehe meine Klarstellung zur Frage.

    – davr

    13. Oktober 2008 um 23:10 Uhr

  • Gut F. Ich denke, keiner von ihnen tut das noch. Aber ich denke, ich wäre bereit, es zu bauen, ich werde mir morgen die Mechanize-API ansehen.

    – Bis

    14. Oktober 2008 um 13:13 Uhr

  • Wenn Sie am Ende etwas machen, posten Sie bitte eine neue Antwort und ich werde es mir auf jeden Fall ansehen. Vielleicht möchten Sie sich die Antwort „ScriptableBrowser“ als Ausgangspunkt ansehen, ich denke, es braucht nur ein paar weitere Funktionen, um alles zu tun, was Mechanize tut

    – davr

    14. Oktober 2008 um 20:43 Uhr

  • Es wird eine Weile dauern, ich hatte noch keine Zeit, mich intensiv mit Mechanik zu beschäftigen. Ich bin überrascht, dass es noch keinen Port gibt.

    – Bis

    17. Oktober 2008 um 0:52 Uhr

1646258049 659 Gibt es ein PHP Aquivalent zu WWWMechanize von Perl
Eli

Schauen Sie sich Snoopy an:
http://sourceforge.net/projects/snoopy/

  • Sie machen immer noch viel mehr Arbeit als Mechanize, siehe meine Klarstellung zur Frage.

    – davr

    13. Oktober 2008 um 23:10 Uhr

  • Gut F. Ich denke, keiner von ihnen tut das noch. Aber ich denke, ich wäre bereit, es zu bauen, ich werde mir morgen die Mechanize-API ansehen.

    – Bis

    14. Oktober 2008 um 13:13 Uhr

  • Wenn Sie am Ende etwas machen, posten Sie bitte eine neue Antwort und ich werde es mir auf jeden Fall ansehen. Vielleicht möchten Sie sich die Antwort „ScriptableBrowser“ als Ausgangspunkt ansehen, ich denke, es braucht nur ein paar weitere Funktionen, um alles zu tun, was Mechanize tut

    – davr

    14. Oktober 2008 um 20:43 Uhr

  • Es wird eine Weile dauern, ich hatte noch keine Zeit, mich intensiv mit Mechanik zu beschäftigen. Ich bin überrascht, dass es noch keinen Port gibt.

    – Bis

    17. Oktober 2008 um 0:52 Uhr

Curl ist der richtige Weg für einfache Anfragen. Es läuft plattformübergreifend, hat eine PHP-Erweiterung und ist weit verbreitet und getestet.

Ich habe eine nette Klasse erstellt, die ein Array von Daten (EINSCHLIEßLICH DATEIEN!) GET und POST an eine URL senden kann, indem sie einfach CurlHandler::Get($url, $data) || aufruft CurlHandler::Post($url, $data). Es gibt auch eine optionale HTTP-Benutzerauthentifizierungsoption 🙂

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

}

?>

[edit] Lesen Sie die Klarstellung erst jetzt … Sie möchten wahrscheinlich eines der oben genannten Tools verwenden, das Dinge automatisiert. Sie können sich auch für eine clientseitige Firefox-Erweiterung wie z Hühnerfuß für mehr Flexibilität. Ich werde die Beispielklasse oben hier für zukünftige Suchen belassen.

  • Danke für das Beispiel, ich denke, diese Art von Wrapper könnte für andere Aufgaben nützlich sein, aber ja, ich denke, ich hätte zuerst deutlicher machen sollen, dass ich eine Art Automatisierung haben möchte

    – davr

    13. Oktober 2008 um 23:23 Uhr

916510cookie-checkGibt es ein PHP-Äquivalent zu WWW::Mechanize von Perl?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy