crawler — Как сканировать с помощью php Goutte и Guzzle, если данные загружаются с помощью Javascript?

Много раз при сканировании мы сталкиваемся с проблемами, когда контент, отображаемый на странице, генерируется с помощью Javascript, и поэтому scrapy не может сканировать его (например, ajax запросы, jQuery).

5

Решение

Вы хотите взглянуть на фантомов. Есть такая реализация php:

http://jonnnnyw.github.io/php-phantomjs/

если вам нужно, чтобы он работал с php, конечно.

Вы можете прочитать страницу и затем передать содержимое в Guzzle, чтобы использовать приятные функции, которые дает вам Guzzle (например, поиск содержимого и т. Д.). Это будет зависеть от ваших потребностей, может быть, вы можете просто использовать DOM, как это:

Как получить элемент по имени класса?

Вот некоторый рабочий код.

  $content = $this->getHeadlessReponse($url);
$this->crawler->addContent($this->getHeadlessReponse($url));

/**
* Get response using a headless browser (phantom in this case).
*
* @param $url
*   URL to fetch headless
*
* @return string
*   Response.
*/
public function getHeadlessReponse($url) {
// Fetch with phamtomjs
$phantomClient = PhantomClient::getInstance();
// and feed into the crawler.
$request = $phantomClient->getMessageFactory()->createRequest($url, 'GET');

/**
* @see JonnyW\PhantomJs\Http\Response
**/
$response = $phantomClient->getMessageFactory()->createResponse();

// Send the request
$phantomClient->send($request, $response);

if($response->getStatus() === 200) {
// Dump the requested page content
return $response->getContent();
}

}

Единственный недостаток использования фантома, это будет медленнее, чем жрать, но, конечно, вам придется ждать загрузки всех этих надоедливых js.

6

Другие решения

Guzzle (который Goutte использует внутри) — это HTTP-клиент. В результате содержимое javascript не будет анализироваться или выполняться. Файлы Javascript, находящиеся за пределами запрошенной конечной точки, загружаться не будут.

Я полагаю, что в зависимости от вашей среды можно было бы использовать PHPv8 (расширение PHP, в которое встроен механизм JavaScript V8 Google) и пользовательский обработчик / промежуточное ПО выполнять то, что вы хотите.

Опять же, в зависимости от вашей среды, может быть проще просто выполнить очистку с помощью клиента javascript.

1

Поскольку невозможно работать с JavaScript, я могу предложить другое решение:

GOOGLE CHROME> Правая кнопка> Проверить элемент> Правая кнопка> отредактировать как html> copy> работать с скопированным html

        $html = $the_copied_html;
$crawler = new Crawler($html);

$data = $crawler->filter('.your-selector')->each(function (Crawler $node, $i) {
return [
'text' => $node->text()
];
});

//Do whatever you want with the $data
return $data; //type Array

Это будет работать только для отдельных заданий, а не для автоматизированных процессов. В моем случае это будет сделано.

-2
По вопросам рекламы [email protected]