@asosonko4

Почему Simple HTML DOM не находит отдельные объекты?

Добрый день, подскажите пожалуйста... Столкнулся со следующей проблемой. Пытаюсь парсить следующую страницу: superdeals.aliexpress.com/en

Необходимо достать div class="pro-msg" который хранится в li с class list-items.
Однако получается так, что далеко не все данные отображаются на странице. Код выглядит следующим образом:

require_once 'simple_html_dom.php';

$base = 'http://superdeals.aliexpress.com/en?spm=2114.11010108.21.1.v65LIL';

$curl = curl_init();
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_URL, $base);
curl_setopt($curl, CURLOPT_REFERER, $base);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$str = curl_exec($curl);
curl_close($curl);

$html = new simple_html_dom();
$html->load($str);

	$res=$html->find('div.pro-msg', 0)->outertext;
	echo $res;


То есть Simple HTML DOM даже не видит отдельные части страницы, исполнение кода = пустой странице, ставлю дургой div - все работает. Если парсить всю страницу file_get_html, то естественным образом отображается далеко не весь сайт. Подскажите пожалуйста как можно обойти проблему.

Заранее спасибо большое!
  • Вопрос задан
  • 1786 просмотров
Решения вопроса 1
@Nc_Soft
phantomjs
---
Ладно, помогу тебе, а то будешь всю жизнь ajax парсить регулярками :)
1. Создай пустую папку ali
2. Скачай туда композер https://getcomposer.org/composer.phar
3. Cоздай файл composer.json с таким содержимым
{
  "require": {
    "jonnyw/php-phantomjs": "3.*",
    "symfony/dom-crawler": "3.*",
    "symfony/css-selector": "3.*"
  },
  "config": {
    "bin-dir": "bin"
  },
  "scripts": {
    "post-install-cmd": [
      "PhantomInstaller\\Installer::installPhantomJS"
    ],
    "post-update-cmd": [
      "PhantomInstaller\\Installer::installPhantomJS"
    ]
  }
}

4. Выполни
php composer.phar install
5. Создай файл index.php
<?php

require __DIR__ . '/vendor/autoload.php';

$client = \JonnyW\PhantomJs\Client::getInstance();
$request = $client->getMessageFactory()->createRequest('http://superdeals.aliexpress.com/en?spm=2114.11010108.21.1.v65LIL', 'GET');
$response = $client->getMessageFactory()->createResponse();
$client->send($request, $response);
$html = $response->getContent();

$crawler = new \Symfony\Component\DomCrawler\Crawler($html);
$div = $crawler->filter('div.pro-msg');
if($div) {
    echo $div->first()->text();
}

6. Выполни его php index.php и смотри результат
/usr/local/bin/php /Users/evgenij/projects/untitled/index.php

				Today Only
				
					Boy's Coat
					>  Synthetic leather> Motor jacket style> Available in black and red
					share:

    vk
        pinterest
        facebook
        Twinner
        Google+
        Email
    Sign in and share the website for a chance to get Points, which you can then convert to coupons.

					US $9.74
					
						US $32.48 / piece | 70% Off
					
					
					
					
						0486Left					
					Buy Now
					
				
			
Process finished with exit code 0
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@RomkaChev
view-source:superdeals.aliexpress.com/en?spm=2114.11010108.21.... - 1049 строка.
Нужный вам элемент вставляется на страницу посредством JS. Поэтому его и нет в качестве DOM элемента в исходном коде
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы