4

我正在抓取网站,到目前为止用 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

谢谢你。

4

4 回答 4

16

在 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

通过 (Goutte + Guzzle)使用 Cookie 解析 JSON -用于身份验证

发送请求站点的页面之一(主页看起来更好)以获取 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 及其组件。

于 2013-09-11T12:52:41.547 回答
2

经过几个小时的搜索,我发现了这一点,只需执行以下操作:

$client = new Client(); // Goutte Client
$crawler = $client->request("GET", "http://foo.bar");

$jsonData = $crawler->text();
于 2015-03-31T00:52:32.867 回答
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();
于 2014-09-19T20:52:46.610 回答
1

我还可以通过以下方式获取 JSON:

$client->getResponse()->getContent()->getContents()
于 2016-05-09T21:54:50.677 回答