Bir PHP Perl WWW eşdeğer mechanize :: var mı?

7 Cevap php

Ben Perl'ın WWW::Mechanize benzer işlevselliğe sahip bir kitaplık için arıyorum, ama PHP için yaşıyorum. Temelde, bana sayfadaki tüm linkler ile birlikte, basit bir biçimde tüm formları ve onların alanları basit bir sözdizimi ile HTTP GET ve POST isteklerini bildirmek ve daha sonra çıkan sayfa ayrıştırmak ve geri dönmek için izin vermelidir.

Ben CURL hakkında biliyorum, ama bu biraz da barebones, ve sözdizimi curl_foo($curl_handle, ...) tabloların oldukça çirkin (ton

Clarification:

Ben şimdiye kadar cevap daha üst düzey bir şey daha istiyorum. Örneğin, Perl, gibi bir şey yapabilirsiniz:

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

HTTP_Client veya wget veya CURL bir sürü iş olacağını kullanırken aynı şeyi yapmak için, ben elle böylece, bağlantıları bulmak için sayfaları ayrıştırmak formu URL'sini bulmak, tüm gizli alanları ayıklamak, ve olurdu. Ben bir PHP çözüm için soruyorum nedeni Perl ile hiçbir deneyimi var, ve ben muhtemelen bir sürü iş ile ihtiyacınız olanı inşa edebileceğini, ama ben PHP yukarıdaki yapabileceğini eğer çok daha hızlı olacağını olmasıdır.

7 Cevap

SimpleTest en ScriptableBrowser test çerçevesinden independendly kullanılabilir. Ben çok sayıda otomasyon-işler için kullandım.

Ben bile onun eski bir yazı olsa ... Ben çok kıvırmak PHP ile çalışıyoruz, bu cevaplamak zorunda hissediyorum ve o kadar iyi değil her yerde WWW gibi bir şey karşılaştırılabilir yakın: Mechanize, (Sanırım geçiş am I) Ruby dili uygulanması ile gitmek için gidiyorum .. o şey otomatikleştirmek için çok "homurtu iş" gerektirir Curl modası geçmiş, SimpleTest script tarayıcı benim için umut verici görünüyordu ama bunu test, çoğu web çalışmaz Bunu denemek formlar ... dürüstçe, ben PHP belki onun en iyi yani sadece bu konu üzerinde sayısız saatler geçirdim beri bu göndermek istedim, farklı bir dil bakmak için, web otomasyon kazıma bu kategoride eksik ve düşünüyorum Gelecekte başka birisi biraz zaman kazandıracak.

PEAR kütüphanesi bakmayı deneyin. Bütün bunlardan başarısız olursa, kıvrılma için bir nesne sarıcı oluşturmak.

Bu gibi basit öylesine bir şey yapabilirsiniz:

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

Aşağıdakilerden birini deneyin:

(Evet, bu ZendFramework kod, ama bu sadece gerekli kütüphanelerini yükler beri kullanıyorum sınıf yavaş yapmaz.)

Ben biraz getto biliyorum, ama sen bir * nix sistem üzerinde iseniz, güzel seçenekleri bir yeri vardır ki, wget ile () shell_exec kullanın.

Curl basit istekleri için gitmek yoludur. Bu, çapraz platform çalışan bir PHP uzantısı vardır ve yaygın olarak kabul edilen ve test edilir.

Ben sadece CurlHandler arayarak bir url (! Dosyalar dahil) veri dizisini GET ve POST bir güzel sınıf oluşturuldu :: ($ url, $ veri) alın | | CurlHandler :: Resmi ($ url, $ veri). İsteğe bağlı HTTP kullanıcı kimlik doğrulama seçeneği de var :)

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

}

?>

[Değiştir] sadece şimdi açıklama oku ... Muhtemelen yukarıda belirtilen araçlardan biri şeyler otomatik ile gitmek istiyorum. Ayrıca daha fazla esneklik için ChickenFoot gibi bir clientside firefox uzantısı kullanmaya karar verebilir. Ben gelecek aramalar için buraya yukarıdaki örnekte sınıf bırakacağım.

Eğer projede CakePHP kullanarak konum, ya da ilgili kütüphane ayıklamak eğilimli iseniz HttpSocket onların kıvırmak sarıcı kullanabilirsiniz. Bu, size tarif basit sayfa getiriliyor sözdizimi, örneğin vardır

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

... Bu tepki sayfa ayrıştırmak için bir yol yok olsa. Bir jQuery gibi sözdizimi sahip olarak tanımlıyor http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/ ki: Bunun için ben simplehtmldom kullanmak için gidiyorum.

Ben alt satırı PHP Perl / Ruby var müthiş kazıma / otomasyon kütüphaneleri yok olduğunu kabul etmek eğilimindedir.