2008-10-13 16 views
23

मैं ऐसी लाइब्रेरी की तलाश में हूं जिसमें पर्ल के WWW::Mechanize के समान कार्यक्षमता है, लेकिन PHP के लिए। असल में, मुझे मुझे एक सरल वाक्यविन्यास के साथ HTTP GET और POST अनुरोध सबमिट करने की अनुमति देनी चाहिए, और फिर परिणामस्वरूप पृष्ठ को पार्स करना चाहिए और पृष्ठ पर सभी लिंक के साथ सभी रूपों और उनके फ़ील्ड को एक साधारण प्रारूप में वापस लौटना चाहिए।क्या पर्ल के डब्ल्यूडब्ल्यूडब्लू :: मैकेनाइजेशन का PHP बराबर है?

मैं कर्ल के बारे में पता है, लेकिन यह एक छोटे से भी barebones है, और वाक्य रचना बहुत बदसूरत (curl_foo($curl_handle, ...) बयान

की टन है

स्पष्टीकरण:

मैं इतना जवाब से कुछ अधिक उच्च स्तरीय चाहते । अब तक उदाहरण के लिए, पर्ल में, आप की तरह कुछ कर सकता है:

# 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 बहुत काम किया जाएगा का उपयोग कर एक ही बात करने के लिए, मैं मैन्युअल रूप से टी पार्स करने के लिए होगा वह लिंक खोजने के लिए पेज, फॉर्म यूआरएल ढूंढें, सभी छिपे हुए फ़ील्ड निकालें, और इसी तरह। कारण मैं एक PHP समाधान के लिए पूछ रहा हूं कि मुझे पर्ल के साथ कोई अनुभव नहीं है, और शायद मैं बहुत सारे कामों के साथ जो कुछ भी कर सकता हूं उसे बना सकता हूं, लेकिन अगर मैं उपरोक्त PHP में कर सकता हूं तो यह बहुत तेज़ होगा।

+0

वास्तव में * इसका एक बंदरगाह है: http://www.compasswebpublisher.com/php/www-mechanize-for-php लेकिन यह कुछ सीएमएस का हिस्सा है और कोई डाउनलोड नहीं है। – Gordon

उत्तर

21

SimpleTest के ScriptableBrowser परीक्षण ढांचे से independendly इस्तेमाल किया जा सकता। मैंने इसे कई स्वचालन-नौकरियों के लिए उपयोग किया है।

+0

यह बहुत अच्छा लग रहा है, मुझे इसे आज़मा देना होगा। इसमें बहुत कुछ है जो मुझे चाहिए, केवल एक चीज गायब है जो किसी पृष्ठ पर सभी लिंक/फॉर्म सूचीबद्ध करने का एक तरीका है, लेकिन मुझे लगता है कि मैं कर सकता हूं। – davr

+0

आप $ ब्राउज़र-> getUrls() का उपयोग कर सकते हैं। अन्यथा, यदि आप अधिक नियंत्रण की आवश्यकता है, तो आप हमेशा $ dom = DomDocument :: loadHtml ($ ब्राउज़र-> getContent()) का उपयोग कर सकते हैं, और फिर $ dom-> getElementsByTagName ("a") का उपयोग कर सकते हैं। – troelskn

1

पीईएआर लाइब्रेरी में देखने का प्रयास करें। अगर सब कुछ विफल हो जाता है, तो कर्ल के लिए ऑब्जेक्ट रैपर बनाएं।

तुम बहुत कुछ इस तरह सरल कर सकते हैं:

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

1

निम्न में से एक का प्रयास करें:

(हाँ, यह ZendFramework कोड है, लेकिन इससे आपकी कक्षा धीमी गति से इसका उपयोग नहीं करती है बस आवश्यक libs लोड करता है।)

+0

वे अभी भी मैकेनाइजेशन से बहुत अधिक काम कर रहे हैं, प्रश्न के लिए मेरी स्पष्टीकरण देखें। – davr

+0

अच्छा प्रश्न। मुझे लगता है कि उनमें से कोई भी अभी तक ऐसा नहीं करता है। लेकिन मुझे लगता है कि मैं इसे बनाने के लिए तैयार हूं, मैं कल मैकेनाइज एपीआई को देख रहा हूं। – Till

+0

यदि आप कुछ भी खत्म कर देते हैं, तो कृपया एक नया उत्तर पोस्ट करें और मैं निश्चित रूप से इसे देख लूंगा। हो सकता है कि आप 'स्क्रिप्टेबल ब्रॉउज़र' उत्तर को शुरुआती बिंदु के रूप में देखना चाहें, मुझे लगता है कि मैकेनाइजेशन – davr

-1

यदि आप * निक्स सिस्टम पर हैं तो आप wget के साथ shell_exec() का उपयोग कर सकते हैं, जिसमें बहुत अच्छे विकल्प हैं।

Snoopy में
+1

ओह, ठीक है हाँ, मैं वहां पर उपयोगकर्ता इनपुट फेंक नहीं दूँगा। –

1
+0

दिलचस्प लग रहा है, लेकिन यह बहुत पुराना है (अंतिम अपडेट 2005), और कर्ल/wget से बेहतर होने पर, इसमें कुछ विशेषताएं अनुपलब्ध हैं जो इसे बेहतर बनाती हैं। – davr

1

कर्ल सरल अनुरोधों के लिए जाने का तरीका है। यह क्रॉस प्लेटफार्म चलाता है, एक PHP विस्तार है और व्यापक रूप से अपनाया और परीक्षण किया जाता है।

मैंने एक अच्छी कक्षा बनाई है जो केवल कर्लहैंडलर को कॉल करके (यूआरएल, $ डेटा) कॉल करके एक यूआरएल में डेटा की एक सरणी (फाइलों सहित!) प्राप्त कर सकती है और पोस्ट कर सकती है। CurlHandler :: पोस्ट ($ यूआरएल, $ डेटा)। वहाँ एक वैकल्पिक 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 जैसे क्लाइंटसाइड फ़ायरफ़ॉक्स एक्सटेंशन का उपयोग करने का भी निर्णय ले सकते हैं। मैं भविष्य की खोजों के लिए यहां उपरोक्त उदाहरण वर्ग छोड़ दूंगा।

+0

उदाहरण के लिए धन्यवाद, मुझे लगता है कि इस प्रकार का रैपर अन्य कार्यों के लिए आसान हो सकता है, लेकिन हाँ मुझे लगता है कि मुझे पहले और अधिक स्पष्ट करना चाहिए था कि मैं एक स्वचालन प्रकार की चीज़ चाहता हूं – davr

2

मुझे इसका उत्तर देने के लिए मजबूर होना पड़ता है, भले ही यह एक पुरानी पोस्ट है ...मैं PHP कर्ल के साथ बहुत काम कर रहा हूं और यह डब्ल्यूडब्ल्यूडब्लू जैसे कुछ के बराबर कहीं भी अच्छा नहीं है: मैकेनाइज, जिसे मैं स्विच कर रहा हूं (मुझे लगता है कि मैं रूबी भाषा कार्यान्वयन के साथ जा रहा हूं) .. कर्ल पुराना है क्योंकि इसे किसी भी चीज को स्वचालित करने के लिए बहुत अधिक "कड़वाहट काम" की आवश्यकता होती है, सरलतम पटकथा ब्राउज़र मेरे लिए वादा करता था लेकिन परीक्षण में, यह अधिकांश वेब रूपों पर काम नहीं करेगा, मैं इसे आज़माता हूं ... ईमानदारी से, मुझे लगता है कि PHP की कमी है स्क्रैपिंग की इस श्रेणी, वेब स्वचालन इसलिए एक अलग भाषा को देखने के लिए सबसे अच्छा है, बस इसे पोस्ट करना चाहता था क्योंकि मैंने इस विषय पर अनगिनत घंटे बिताए हैं और शायद यह भविष्य में किसी और को बचाएगा।

1

यदि आप अपनी परियोजना में केकेपीएचपी का उपयोग कर रहे हैं, या यदि आप प्रासंगिक पुस्तकालय निकालने के इच्छुक हैं तो आप उनके कर्ल रैपर एचटीपीएसकेट का उपयोग कर सकते हैं। यह सरल पेज-फ़ेच वाक्य रचना आप का वर्णन है, उदाहरण के लिए,

# 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 में शानदार स्क्रैपिंग/ऑटोमेशन लाइब्रेरी नहीं है जो पर्ल/रूबी के पास है।

2

यह 2016 है और Mink है। यह एनपीएम में हेडलेस "ब्राउजर.जेएस" के लिए सेलेनियम (जिसे फ़ायरफ़ॉक्स या क्रोम जैसे ब्राउज़र की आवश्यकता है) से हेडलेस शुद्ध-PHP "ब्राउजर" (जावास्क्रिप्ट के बिना) से अलग इंजनों का भी समर्थन करता है, जो जावास्क्रिप्ट का समर्थन करता है।

+0

यह बेहद उपयोगी और बहुत बेहतर है इस पृष्ठ पर उल्लिखित सब कुछ की तुलना में। अद्यतन के लिए धन्यवाद! – supersan

संबंधित मुद्दे