Crawler + Guzzle: доступ к форме
Я использую php guzzle клиент, чтобы захватить веб-сайт, а затем обработать его с помощью 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();
Но я получаю исключение:
Текущий список узлов пуст.
Так что я немного потерялся, о том, как получить доступ к форме
1 ответ:
Попробуйте использовать Goutte, это скребок экрана и библиотека веб-обхода, построенная поверх инструментов, которые вы уже используете (Guzzle, Symfony2 Crawler). Дополнительную информацию смотрите в репозитории GitHub.
Ваш код будет выглядеть так, используя 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' => 'P@S5' )); var_dump($crawler->count()); echo $crawler->html(); echo $crawler->text();Если вам действительно нужно настроить параметры скручивания, вы можете сделать это следующим образом:
<?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); // ...Обновление:
При использовании DomCrawler я часто получаю ту же ошибку. В основном потому, что я не такой. выбор правильного элемента на странице или потому, что он не существует. Попробуйте вместо использования:
$crawler->selectButton('submit')->form();Сделайте следующее:
$form = $crawler->filter('#signin_button')->form();Где вы используете метод фильтра, чтобы получить элемент по идентификатору, если он имеет один
'#signin_button', или вы также можете получить его по классу'.signin_button'. Метод фильтра требует компонента CssSelector.Также отладьте форму, распечатав HTML (
echo $crawler->html();) и убедившись, что вы действительно находитесь на нужной странице.
Comments