Есть ли PHP-эквивалент WWW :: Mechanize в Perl?

Если у вас есть оболочка, вы можете ввести

for DIR in AccountingCore Common WebCommon; do mkdir $DIR; cd $DIR; git init; git svn init -s svn://host/path/$DIR; git svn fetch; cd ..; done

То есть, если я не допустил ошибок.

24
задан davr 13 October 2008 в 23:34
поделиться

8 ответов

SimpleTest ScriptableBrowser может использоваться независимо от среды тестирования. Я использовал его для многочисленных заданий автоматизации.

22
ответ дан Aziz 13 October 2008 в 23:34
поделиться

Если вы используете 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.

1
ответ дан method 13 October 2008 в 23:34
поделиться

Попытайтесь смотреть в библиотеке PEAR. Если все остальное перестало работать, создайте объектную обертку для завихрения.

Вы можете так что-то простое как это:

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);
    }
}
1
ответ дан 2 revs 13 October 2008 в 23:34
поделиться

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

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

1
ответ дан Till 13 October 2008 в 23:34
поделиться

Изучите Излишне любопытный: http://sourceforge.net/projects/snoopy/

1
ответ дан Eli 13 October 2008 в 23:34
поделиться

Завихрение является способом пойти для простых запросов. Это выполняет кросс-платформенный, имеет расширение PHP и широко принято и протестировано.

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

}

?>

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

1
ответ дан SchizoDuckie 13 October 2008 в 23:34
поделиться

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

-1
ответ дан Francisco Presencia 13 October 2008 в 23:34
поделиться

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

3
ответ дан 28 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: