Вопрос

Я ищу библиотеку, которая имеет функциональность, аналогичную Perl WWW::Механизировать, но для PHP.По сути, это должно позволить мне отправлять HTTP-запросы GET и POST с простым синтаксисом, а затем анализировать результирующую страницу и возвращать в простом формате все формы и их поля вместе со всеми ссылками на странице.

Я знаю о CURL, но он немного чересчур прост, а синтаксис довольно уродливый (тонны 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.

Это было полезно?

Решение

Самый простой Скриптабельный браузер может использоваться независимо от платформы тестирования.Я использовал его для многочисленных работ по автоматизации.

Другие советы

Я чувствую себя обязанным ответить на этот вопрос, хотя это старый пост...Я много работал с PHP curl, и он далеко не так хорош, как что-то вроде WWW:Mechanize, на которое я переключаюсь (я думаю, что я собираюсь использовать реализацию на языке Ruby)..Curl устарел, поскольку требует слишком большой "кропотливой работы" для автоматизации чего-либо, самый простой браузер со скриптами показался мне многообещающим, но при тестировании он не будет работать на большинстве веб-форм, на которых я его пробую...честно говоря, я думаю, что PHP не хватает в этой категории очистки, веб-автоматизации, поэтому лучше всего посмотреть на другой язык, просто хотел опубликовать это, так как я потратил бесчисленное количество часов на эту тему, и, возможно, это сэкономит кому-то еще некоторое время в будущем.

Сейчас 2016 год, и есть Норка.Он даже поддерживает различные двигатели из безголовый чисто на PHP "браузер" (без JavaScript), за селена (который нужен браузер, например Firefox или Chrome), чтобы без головы "browser.js" в npm, который не поддерживает JavaScript.

Попробуйте поискать в библиотеке 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);
    }
}

Попробуйте одно из следующих действий:

(Да, это код ZendFramework, но его использование не замедляет работу вашего класса, поскольку он просто загружает необходимые библиотеки.)

Загляни в Снупи:http://sourceforge.net/projects/snoopy/

Curl - это способ выполнения простых запросов.Он работает на кросс-платформе, имеет расширение PHP и широко распространен и протестирован.

Я создал хороший класс, который может ПОЛУЧАТЬ и ПУБЛИКОВАТЬ массив данных (ВКЛЮЧАЯ ФАЙЛЫ!) по URL-адресу, просто вызвав CurlHandler::Get($url, $data) || 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);
        }
    }

}

?>

[редактировать] Прочтите разъяснение только сейчас...Вероятно, вы захотите воспользоваться одним из упомянутых выше инструментов, который автоматизирует работу.Вы также можете решить использовать клиентское расширение Firefox, например Куриная ножка для большей гибкости.Я оставлю приведенный выше пример класса здесь для будущих поисков.

Если вы используете CakePHP в своем проекте или если вы склонны извлекать соответствующую библиотеку, вы можете использовать их оболочку curl 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.

Если вы используете систему * nix, вы могли бы использовать shell_exec() с wget, у которого есть много приятных опций.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top