Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Парс удаленной страницы


Автор: MrDmitry 15.10.2020, 18:33
Здравствуйте, пытаюсь пропарсить ссылку https://shop.autoeuro.ru/main/search?maker=MANN-FILTER&code=W811/80&crosses=1 при помощи simplehtmldom

Код

$html = file_get_html(" https://shop.autoeuro.ru/main/search?maker=MANN-FILTER&code=W811/80&crosses=1");
$e = $html->find("#stat_best_s_0_0", 0);
echo $e->plaintext;

получаю 

Цитата
Fatal error: Call to a member function find() on a non-object in

Автор: bars80080 15.10.2020, 20:13
нет такой функции file_get_html:

https://www.php.net/manual-lookup.php?pattern=file_get_html&scope=quickref

Добавлено через 51 секунду
намёк на то, что она фиг знает, что делает, потому ответа ждать можно вечно

Автор: The_Aleksey 15.10.2020, 21:20
file_get_html - это часть библиотеки PHP Simple HTML DOM (simplehtmldom.sourceforge.io/manual.htm)

рискну предположить, что там пробел лишний перед https в адресе, поэтому невозможно получить ресурс и объект пустой

Автор: MrDmitry 16.10.2020, 15:33
К сожалению пробела нет. Я допустил ошибку когда писал на форуме, строка формируется. сама. 

Вот точный код если быть точным.

Код

require_once("simplehtmldom/simple_html_dom.php");

 $autoeuro = "https://shop.autoeuro.ru/";

function gethtmlonautoeuro($url, $list)
{
    $data = split(":", $list, 2); 
    $data[0] = str_replace(' ', '', $data[0]);
    $data[1] = str_replace(' ', '', $data[1]);
    $html = file_get_html($url."main/search?maker=".$data[0]."&code=".$data[1]."&crosses=1");
    $e = $html->find('#stat_best_s_0_0', 0);
    return $e->plaintext;
}

$price = gethtmlonautoeuro($autoeuro, $list);


Откуда берётся $list тут не важно, главное что получается в итоге 

https://shop.autoeuro.ru/main/search?maker=MANN-FILTER&code=W811/80&crosses=1

Автор: ksnk 16.10.2020, 17:25
Не открывается, потому что ответная сторона не хочет отдавать свой контент. 
Если внимательно посмотреть на то, что выдает страница в броузере, то она сначала устанавливает какие-то куки, потом переадресуется на немного другой адрес, и там уже выдает  результат поиска.
Вероятнее всего, они проверяют предварительно, что посылаемые заголовки похожи на броузер, вероятнее всего, они проверяют устанавленные куки, вероятнее всего они еще что-нибудь проверяют... 

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

Автор: The_Aleksey 20.10.2020, 21:09
Да, на этой странице действительно 302-й редирект на страницу с другими GET-параметрами, в качестве предложения, можно вот так

Код

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://shop.autoeuro.ru/main/search?maker=MANN-FILTER&code=W811/80&crosses=1');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36 OPR/38.0.2220.31");
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
var_dump($httpcode, $data);
?>


Здесь, вначале мы получим 302, потом, используя CURLOPT_FOLLOWLOCATION перейдём по новому адресу, и в итоге в $data у нас будет строка с содержимым сайта, и вот эту строку потом можно будет засунуть в DOM парсер и искать в ней

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)