Con*_*nce 3 php symfony symfony-2.1 guzzle
我使用php guzzle客户端抓取网站,然后使用symfony 2.1抓取工具处理它
我正在尝试访问表单....例如此测试表单 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();
Run Code Online (Sandbox Code Playgroud)
但我得到了例外:
当前节点列表为空.
关于如何访问表单,我有点迷茫
尝试使用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();
Run Code Online (Sandbox Code Playgroud)
如果您确实需要设置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);
// ...
Run Code Online (Sandbox Code Playgroud)
更新:
使用DomCrawler时,我经常会遇到同样的错误.大部分时间是因为我没有在页面中选择正确的元素,或者因为它不存在.尝试而不是使用:
$crawler->selectButton('submit')->form();
Run Code Online (Sandbox Code Playgroud)
请执行下列操作:
$form = $crawler->filter('#signin_button')->form();
Run Code Online (Sandbox Code Playgroud)
你在哪里使用filter方法通过id获取元素,如果它有一个,'#signin_button'或者你也可以通过类获取它 '.signin_button'.过滤方法需要CssSelector组件.
还可以通过打印HTML(echo $crawler->html();)并确保您实际位于正确的页面来调试表单.