
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.

troelskn
SimpleTests Skriptfähiger Browser kann unabhängig vom Testframework verwendet werden. Ich habe es für zahlreiche Automatisierungsaufgaben verwendet.
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.
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.)

Eli
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.
9165100cookie-checkGibt es ein PHP-Äquivalent zu WWW::Mechanize von Perl?yes
Dort eigentlich ist eine Portierung davon: compasswebpublisher.com/php/www-mechanize-for-php aber es ist Teil eines CMS und es gibt keinen Download.
– Gordon
6. März 2013 um 8:34 Uhr