سؤال

أنا أبحث عن المكتبة التي لديها وظائف مماثلة Perl WWW::مكننة, ولكن من أجل PHP.أساسا ، فإنه يجب أن تسمح لي أن أقدم HTTP GET و POST طلبات تركيب بسيط ، ثم تحليل الناتج الصفحة والعودة في شكل بسيط كل أشكال حقولهم ، جنبا إلى جنب مع جميع الروابط في الصفحة.

أنا أعرف عن حليقة, لكنه قليل جدا المجردة ، جملة قبيحة جدا (طن من 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 أو حليقة سوف يكون هناك الكثير من العمل يجب أن يدويا تحليل الصفحات للعثور على الروابط تجد شكل رابط, استخراج جميع الحقول المخفية, وهلم جرا.السبب أنا أطلب PHP الحل هو أن لدي أي خبرة مع Perl, و ربما بناء على ما أريد مع الكثير من العمل, ولكن سيكون أسرع بكثير إذا كنت يمكن أن تفعل ذلك في PHP.

هل كانت مفيدة؟

المحلول

SimpleTest هو ScriptableBrowser يمكن استخدامها independendly من إطار اختبار.لقد استعملت العديد من الأتمتة-وظائف.

نصائح أخرى

أجد نفسي مضطرا للرد على هذا ، على الرغم من أن وظيفة القديم...لقد تم العمل مع PHP الضفيرة الكثير و أنها ليست جيدة في أي مكان بالقرب مماثلة شيء مثل WWW:المكننة التي أنا التحول إلى (اعتقد وانا ذاهب للذهاب مع لغة روبي التنفيذ)..حليقة عفا عليها الزمن كما أنه يتطلب الكثير من "العمل الناخر" لأتمتة أي شيء ، simpletest النصية المتصفح تبدو واعدة بالنسبة لي ولكن في الاختبار ، فإنه لن يعمل على معظم نماذج ويب جربتها...بصراحة أعتقد PHP ينقصنا في هذه الفئة من تجريف ، ويب أتمتة لذلك من الأفضل أن ننظر إلى لغة مختلفة ، فقط أردت الرد على هذا منذ أن كنت قد أمضى ساعات لا تحصى في هذا الموضوع و ربما سيوفر شخص آخر لبعض الوقت في المستقبل.

إنه 2016 الآن و هناك المنك.حتى أنها تدعم محركات مختلفة من مقطوعة الرأس النقي-PHP "المتصفح" (بدون جافا سكريبت), على السيلينيوم (الذي يحتاج متصفح مثل فايرفوكس أو كروم) إلى مقطوعة الرأس "browser.js" في الآلية التي لا تدعم جافا سكريبت.

حاول تبحث في الكمثرى المكتبة.إذا فشل كل شيء آخر ، إنشاء كائن المجمع حليقة.

يمكنك حتى شيء بسيط مثل هذا:

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

حاول تنفيذ أحد الإجراءات التالية:

(نعم, انها ZendFramework رمز, ولكن لا تجعل الفئة الخاصة بك أبطأ استخدامه منذ ذلك فقط الأحمال المطلوبة يبس.)

ننظر إلى سنوبي:http://sourceforge.net/projects/snoopy/

حليقة هو وسيلة للذهاب طلبات بسيطة.فإنه يعمل عبر منصة ، وقد PHP التمديد هو اعتمادها على نطاق واسع واختبارها.

أنا خلقت لطيفة الدرجة التي يمكن أن تحصل بعد مجموعة من البيانات (بما في ذلك الملفات!) إلى عنوان url فقط عن طريق الدعوة CurlHandler::Get($url, $data) || CurlHandler::وظيفة($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);
        }
    }

}

?>

[تحرير] قراءة التوضيح فقط الآن...ربما كنت ترغب في الذهاب مع واحدة من الأدوات المذكورة أعلاه بأتمتة الأشياء.يمكنك أيضا أن تقرر استخدام clientside فايرفوكس التمديد مثل ChickenFoot لمزيد من المرونة.سأترك سبيل المثال فئة أعلاه هنا من أجل عمليات البحث المستقبلية.

إذا كنت تستخدم للكيك في المشروع الخاص بك ، أو إذا كنت تميل إلى استخراج ذات الصلة المكتبة يمكنك استخدام حليقة المجمع 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/ التي تصف نفسها بأنها مسج مثل بناء الجملة.

أنا أميل إلى الاتفاق على أن بيت القصيد هو أن PHP لا يجب رهيبة تجريف/أتمتة المكتبات التي Perl/روبي لديك.

إذا كنت على أنظمة nix *هل يمكن استخدام shell_exec() مع wget التي لديها الكثير من الخيارات لطيفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top