我正在抓取网站,到目前为止,使用Goutte解析HTML没有问题。但我需要从网站检索JSON,并且由于cookie管理,我不想用file_get_contents()
执行此操作 - 这不起作用。
我可以使用纯cURL,但在这种情况下,我只想使用Goutte而不想使用任何其他库。
那么有什么方法可以通过Goutte解析文本,或者我真的必须用旧的方法来做这个吗?
/* Sample Code */
$client = new Client();
$crawler = $client->request('foo');
$crawler = $crawler->filter('bar'); // of course not working
谢谢。
答案 0 :(得分:14)
经过对Goutte图书馆的深入搜索,我发现了一种方式,我想分享。因为Goutte是非常强大的库,但是文档非常复杂。
通过(Goutte> Guzzle)解析JSON
只需获取所需的输出页面并将json存储到数组中。
$client = new Client(); // Goutte Client
$request = $client->getClient()->createRequest('GET', 'http://***.json');
/* getClient() for taking Guzzle Client */
$response = $request->send(); // Send created request to server
$data = $response->json(); // Returns PHP Array
使用Cookie解析JSON 通过(Goutte + Guzzle) - 进行身份验证
发送请求之一的网站页面(主页看起来更好)以获取Cookie,然后使用这些Cookie进行身份验证。
$client = new Client(); // Goutte Client
$crawler = $client->request("GET", "http://foo.bar");
/* Send request directly and get whole data. It includes cookies from server and
it automatically stored in Goutte Client object */
$request = $client->getClient()->createRequest('GET', 'http://foo.bar/baz.json');
/* getClient() for taking Guzzle Client */
$cookies = $client->getRequest()->getCookies();
foreach ($cookies as $key => $value) {
$request->addCookie($key, $value);
}
/* Get cookies from Goutte Client and add to cookies in Guzzle request */
$response = $request->send(); // Send created request to server
$data = $response->json(); // Returns PHP Array
我希望它有所帮助。因为我几乎花了3天时间来了解Gouttle及其组件。
答案 1 :(得分:2)
经过几个小时的搜索,我发现了这一点,只需这样做:
$client = new Client(); // Goutte Client
$crawler = $client->request("GET", "http://foo.bar");
$jsonData = $crawler->text();
答案 2 :(得分:1)
mithataydogmus'解决方案对我没用。我创建了一个新类" BetterClient":
use Goutte\Client as GoutteClient;
class BetterClient extends GoutteClient
{
private $guzzleResponse;
public function getGuzzleResponse() {
return $this->guzzleResponse;
}
protected function createResponse($response)
{
$this->guzzleResponse = $response;
return parent::createResponse($response);
}
}
用法:
$client = new BetterClient();
$request = $client->request('GET', $url);
$data = $client->getGuzzleResponse()->json();
答案 3 :(得分:1)
我也可以通过以下方式获得JSON:
$client->getResponse()->getContent()->getContents()