Много раз при сканировании мы сталкиваемся с проблемами, когда контент, отображаемый на странице, генерируется с помощью Javascript, и поэтому scrapy не может сканировать его (например, ajax запросы, jQuery).
Вы хотите взглянуть на фантомов. Есть такая реализация 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.
Guzzle (который Goutte использует внутри) — это HTTP-клиент. В результате содержимое javascript не будет анализироваться или выполняться. Файлы Javascript, находящиеся за пределами запрошенной конечной точки, загружаться не будут.
Я полагаю, что в зависимости от вашей среды можно было бы использовать PHPv8 (расширение PHP, в которое встроен механизм JavaScript V8 Google) и пользовательский обработчик / промежуточное ПО выполнять то, что вы хотите.
Опять же, в зависимости от вашей среды, может быть проще просто выполнить очистку с помощью клиента javascript.
Поскольку невозможно работать с 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
Это будет работать только для отдельных заданий, а не для автоматизированных процессов. В моем случае это будет сделано.