2008-10-13 3 views
23

Perl의 WWW::Mechanize과 비슷한 기능을 가진 라이브러리를 찾고 있는데 PHP 용입니다. 기본적으로 간단한 구문으로 HTTP GET 및 POST 요청을 제출 한 다음 결과 페이지를 구문 분석하고 페이지의 모든 링크와 함께 모든 양식과 해당 필드를 간단한 형식으로 반환 할 수 있어야합니다.Perl의 WWW :: Mechanize와 동일한 PHP가 있습니까?

나는 CURL에 대해 알고 있지만, 조금 너무 베어, 그리고 구문이 curl_foo($curl_handle, ...)

의 꽤 (추한 톤

명확한 설명 :

내가 그렇게 대답보다는 뭔가 더 높은 수준을 원한다 . 지금까지 예를 들어, Perl로, 당신은 같은 것을 할 수있는 : HTTP_Client 또는 wget을 또는 CURL 많은 일이 될 것입니다 사용하여 같은 일을

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

을, 나는 수동으로 t을 분석해야 할 것 그는 링크를 찾고, 양식 URL을 찾고, 숨겨진 모든 필드를 추출하는 등의 작업을 수행합니다. 필자가 PHP 솔루션을 요구하는 이유는 필자가 Perl에 대한 경험이 없기 때문에 많은 작업을 통해 필요한 것을 구축 할 수 있지만 PHP에서 위와 같은 작업을 수행 할 수 있다면 훨씬 더 빠를 것입니다.

+0

사실 * http://www.compasswebpublisher.com/php/www-mechanize-for-php이지만 일부 CMS의 일부이며 다운로드가 없습니다. – Gordon

답변

21

SimpleTest의 ScriptableBrowser 테스트 프레임 워크에서 independendly 사용할 수 있습니다. 나는 수많은 자동화 작업을 위해 그것을 사용했다.

+0

이것은 꽤 좋아 보인다, 나는 그것을 시험해보아야 할 것이다. 그것은 내가 필요한 모든 것을 가지고 있습니다. 단 한가지 빠진 것은 페이지의 모든 링크/양식을 나열하는 방법이지만, 제가 할 수 있다고 생각합니다. – davr

+0

$ browser-> getUrls()를 사용할 수 있습니다. 그렇지 않으면 더 많은 제어가 필요하면 항상 $ dom = DomDocument :: loadHtml ($ browser-> getContent()), $ dom-> getElementsByTagName ("a")를 사용할 수 있습니다. – troelskn

1

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

이것은 내가 찾던 것이 아니며, 더 명확하게 해줄 명확한 설명을 추가했습니다. – davr

1

것은 다음 중 하나를 시도해보십시오

(네, ZendFramework 코드입니다, 그러나 그것을 사용하여 클래스를 느리게 만들지는 않습니다. 그냥 필요한 라이브러리를로드합니다.)

+0

그들은 Mechanize보다 여전히 많은 작업을하고 있습니다. 질문에 대한 나의 설명을 참조하십시오. – davr

+0

좋은 질문. 나는 그들 중 누구도 아직 그렇게 생각하지 않는다. 그러나 나는 그것을 구축하기위한 것이라고 생각합니다, 나는 내일 Mechanize API를 볼 것입니다. – Till

+0

아무 것도하지 않으면 새로운 답변을 올리십시오. 'ScriptableBrowser'답변을 시작점으로보고 싶을 수도 있습니다. 기계화가하는 모든 작업을 수행하는 데 필요한 몇 가지 기능이 더 필요하다고 생각합니다. – davr

-1

* nix 시스템을 사용하는 경우 멋진 옵션이 많은 wget과 함께 shell_exec()를 사용할 수 있습니다. 스누피에

+1

오, 그래, 나는 거기에 사용자 입력을 던지지 않을 것이다. –

1

간단한 요청을 처리하는 방법은 Curl입니다. 그것은 크로스 플랫폼을 실행하고, PHP 확장을 가지고 널리 채택되고 테스트됩니다.

CurlHandler :: Get ($ url, $ data) ||을 호출하여 URL에 데이터 배열 (파일 포함!)을 가져와 게시 할 수있는 멋진 클래스를 만들었습니다. 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과 같은 클라이언트 측 파이어 폭스 확장을 사용하기로 결정할 수도 있습니다. 앞으로의 검색을 위해 예제 클래스를 여기 위에 두겠습니다.

+0

그러나 예를 들어 주셔서 감사합니다, 나는이 종류의 래퍼가 다른 작업에 유용 할 수 있다고 생각하지만 예를 들어 내가 먼저 명확히해야 할 것은 자동화 유형의 것을 원한다는 것입니다. – davr

2

이전 게시물인데도 답변을해야한다고 느낍니다.나는 PHP 컬을 많이 사용하여 작업 해 왔으며 WWW와 비슷한 것에 가까운 비슷한 곳에서는 좋지 않습니다. (내가 Ruby 언어 구현과 함께 갈 것이라고 생각합니다.) 기계로 바꾸고 있습니다. Curl은 시대에 뒤 떨어진 것입니다. 무엇이든 자동화하기에는 너무 많은 "쓸데없는 일"이 필요하기 때문에 간단한 스크립트 작성 가능 브라우저가 나에게 유망 해 보였지만 테스트 할 때 대부분의 웹 양식에서 작동하지 않을 것입니다 ... 솔직히 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이 있습니다. 심지어 자바 스크립트를 지원하는 NPM의 headless "browser.js"에 Selenium (Firefox 나 Chrome과 같은 브라우저가 필요함)을 통해 헤드리스 순수 PHP "브라우저"(자바 스크립트 없음)와 다른 엔진을 지원합니다.

+0

이것은 대단히 유용하고 훨씬 좋습니다 이 페이지에서 언급 된 다른 모든 것보다 업데이트 주셔서 감사합니다! – supersan

관련 문제