2013-04-05 3 views
3

Я использую PHP жрать клиент, чтобы захватить веб-сайт, а затем обработать его с Symfony 2.1 гусеничногоCrawler + жрать: Доступ сформировать

Я пытаюсь получить доступ к форме .... например, этот тест образуют здесь http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm

$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm'; 
$client = new Client($url); 

$request = $client->get(); 
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYHOST, false); 
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYPEER, false); 
$response = $request->send(); 
$body = $response->getBody(true); 
$crawler = new Crawler($body); 
$filter = $crawler->selectButton('submit')->form(); 
var_dump($filter);die(); 

Но я получаю исключение:

список текущий узел пуст.

Так я вроде потерял, о том, как получить доступ к форме

ответ

6

Попробуйте использовать Гуты, это соскобом экрана и веб-ползать библиотека строится поверх инструментов, которые вы уже используете (жрать, Symfony2 Crawler). См. GitHub repo для получения дополнительной информации.

Ваш код будет выглядеть следующим образом, используя Goutte

<?php 
use Goutte\Client; 

$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm'; 
$client = new Client(); 

$crawler = $client->request('GET', $url); 
$form = $crawler->selectButton('submit')->form(); 
$crawler = $client->submit($form, array(
    'username' => 'myuser', // assuming you are submitting a login form 
    'password' => '[email protected]' 
)); 
var_dump($crawler->count()); 
echo $crawler->html(); 
echo $crawler->text(); 

Если вам действительно нужно настроить параметры CURL вы можете сделать это следующим образом:

<?php 
$url = 'http://de.selfhtml.org/javascript/objekte/anzeige/forms_method.htm'; 
$client = new Client(); 
$guzzle = $client->getClient(); 
$guzzle->setConfig( 
    array(
     'curl.CURLOPT_SSL_VERIFYHOST' => false, 
     'curl.CURLOPT_SSL_VERIFYPEER' => false, 
    )); 
$client->setClient($guzzle); 
// ... 

UPDATE:

При использовании DomCrawler я часто получаю ту же ошибку. В большинстве случаев я не выбираю правильный элемент на странице или потому, что он не существует. Попробуйте вместо использования:

$crawler->selectButton('submit')->form(); 

сделать следующее:

$form = $crawler->filter('#signin_button')->form(); 

Где вы используете метод фильтра, чтобы получить элемент по идентификатору, если он имеет один '#signin_button' или вы могли бы также получить его по классу '.signin_button' , Метод фильтра требует The CssSelector Component.

Также отлаживайте форму, распечатав HTML (echo $crawler->html();) и убедитесь, что вы на самом деле находитесь на правильной странице.