2008-10-13 122 views
23

我正在尋找一個功能類似於Perl的WWW::Mechanize但對於PHP的庫。基本上,它應該允許我用簡單的語法提交HTTP GET和POST請求,然後解析生成的頁面並以簡單的格式返回所有表單及其字段以及頁面上的所有鏈接。是否有一個Perl的WWW :: Mechanize的PHP等價物?

我知道捲曲,但它是一個有點準系統和語法是非常難看(的curl_foo($curl_handle, ...)報表

澄清:

我想要的東西更高層的不是答案,以便。到目前爲止例如,在Perl中,你可以這樣做:

# 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或wget或curl將是一個很大的工作做同樣的事情,我不得不手工解析ŧ他會尋找鏈接,找到表單URL,提取所有隱藏的字段,等等。我要求一個PHP解決方案的原因是,我沒有使用Perl的經驗,而且我可能通過很多工作來構建我需要的東西,但是如果我可以在PHP中完成上述任務,則會更快。

+0

實際上*是*的一個端口:http://www.compasswebpublisher.com/php/www-mechanize-for-php但它是一些CMS的一部分,並且沒有下載。 – Gordon 2013-03-06 08:34:43

回答

21

SimpleTest的的ScriptableBrowser可以從測試框架independendly使用。我已經將它用於衆多自動化作業。

1

嘗試尋找PEAR庫。如果一切都失敗了,爲curl創建一個對象包裝器。

可以這麼簡單的東西是這樣的:

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

這不是我正在尋找的,我添加了一個澄清,希望更清楚,謝謝。 – davr 2008-10-13 23:21:57

1

請嘗試以下之一:

(是的,這是ZendFramework代碼,但它不會讓你的班級慢慢使用它,因爲它只需加載所需的庫)。

+0

他們仍然比機械化工作多得多,請看我對這個問題的澄清。 – davr 2008-10-13 23:10:30

+0

好Q.我認爲他們都沒有那樣做。但我認爲我會爲建設而努力,明天我會看看機械化API。 – Till 2008-10-14 13:13:28

+0

如果你最終做出任何事情,請發表一個新的答案,我一定會看看它。您可能希望將'ScriptableBrowser'的答案看作一個起點,我認爲它只需要更多的功能來完成Mechanize所做的一切。 – davr 2008-10-14 20:43:12

-1

如果你在* nix系統上,你可以使用shell_exec()和wget,它有很多不錯的選擇。

+1

噢,好吧,我不會把用戶輸入放在那裏。 – 2008-10-15 13:56:31

1
+0

看起來很有趣,但它很老舊(2005年的最後一次更新),雖然比curl/wget更好,但缺少一些可以使它更好的功能。 – davr 2008-10-13 23:20:20

1

Curl是簡單請求的方式。它運行跨平臺,具有PHP擴展並被廣泛採用和測試。

我創建了一個很好的類,它可以通過調用CurlHandler :: Get($ url,$ data)來GET和POST一個數據數組(包括文件! CurlHandler :: Post($ url,$ data)。還有一個可選的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 $_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); 
     } 
    } 

} 

?> 

[編輯]閱讀澄清只是現在......你可能想要去的上面自動東西提到的工具之一。您也可以決定使用像ChickenFoot這樣的客戶端Firefox擴展來獲得更大的靈活性。我將在上面留下示例類以供將來搜索。

2

我覺得不得不回答這個問題,儘管它的舊帖子...我一直在使用PHP curl很多,它不像WWW那樣好:機械化,我正在切換到(我認爲我會去用Ruby語言實現)。Curl已經過時了因爲它需要太多的「笨重的工作」來自動化任何事情,最簡單的腳本化瀏覽器看起來很有希望,但在測試它時,它不適用於我試用的大多數Web表單...老實說,我認爲PHP缺乏這類刮板,網頁自動化,所以它最好看看不同的語言,只是想發佈這個,因爲我已經花了無數小時在這個話題上,也許它會在未來的某個時間保存別人。

1

如果您在您的項目中使用CakePHP,或者如果您傾向於提取相關庫,則可以使用它們的捲曲包裝器HttpSocket。它具有簡單的頁面獲取語法你描述,例如,

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

...雖然它沒有一種方法來解析響應頁面。爲此,我將使用simplehtmldom:http://net.tutsplus.com/tutorials/php/html-parsing-and-screen-scraping-with-the-simple-html-dom-library/,它將自己描述爲具有類似jQuery的語法。

我傾向於同意底線是PHP沒有Perl/Ruby所具有的真棒抓取/自動化庫。

2

現在是2016年,現在有Mink。它甚至支持來自無頭的純PHP「瀏覽器」(無JavaScript)的不同引擎,而不是Selenium(需要Firefox或Chrome等瀏覽器)到NPM中的無頭「browser.js」,它支持JavaScript。

相關問題