rendellstivens
@rendellstivens

Почему simple_html_dom.php один сайт парсит, а другой нет?

Добрый день, товарищи!

Пишу парсер на php, но уперся в то, что парсер работает только на одной ссылке из трёх.
Когда я предаю в функцию dlPage() ссылку $url_ms, то все хорошо, но если я передаю другие две, то ничего не происходит. Помогите разобраться!
<?php
require_once 'simple_html_dom.php';
$url_md = 'https://www.maxidom.ru/catalog/smesiteli/filter/item_firm-is-505a006bf69e69c71d23b5ca06faa83d/apply/?repIDchanged=4&amount=100';
$url_ms = 'https://kazan.megastroy.com/catalog/smesiteli?field79%5B%5D=AM.PM';
$url_lm = 'https://leroymerlin.ru/search/?q=%D1%81%D0%BC%D0%B5%D1%81%D0%B8%D1%82%D0%B5%D0%BB%D0%B8+am.pm';


function dlPage($href) {
    $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, $href);
    curl_setopt($curl, CURLOPT_REFERER, $href);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.125 Safari/533.4");
    $str = curl_exec($curl);
    curl_close($curl);

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

    return $dom;
}

$html = dlPage($url_md);
$item = $html->find('a');

foreach($html->find('a') as $element)
    echo $element->href . '<br>';
  • Вопрос задан
  • 117 просмотров
Решения вопроса 1
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
d:\OpenServer>curl "https://www.maxidom.ru/catalog/smesiteli/filter/item_firm-is-505a006bf69e69c71d23b5ca06faa83d/apply/?repIDchanged=4&amount=100" -v

*   Trying 95.213.244.197:443...
* Connected to www.maxidom.ru (95.213.244.197) port 443 (#0)
* schannel: disabled automatic use of client certificate
* ALPN: offers http/1.1
* ALPN: server accepted http/1.1
> GET /catalog/smesiteli/filter/item_firm-is-505a006bf69e69c71d23b5ca06faa83d/apply/?repIDchanged=4&amount=100 HTTP/1.1
> Host: www.maxidom.ru
> User-Agent: curl/7.83.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< Server: nginx
< Date: Mon, 15 Aug 2022 12:19:49 GMT
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Powered-By: PHP/7.1.33-44+0~20211119.61+debian10~1.gbp448fbe
< P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA"
< X-Powered-CMS: Bitrix Site Manager (daa31dd015896c419c3750efb37325d9)
< Set-Cookie: PHPSESSID=nWRt3aUxn56jtZd4ZrA1vkh81L5wtU3P; path=/; domain=maxidom.ru; HttpOnly
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate
< Pragma: no-cache
< Set-Cookie: MAXI_LOC_ID=4; expires=Wed, 14-Sep-2022 12:19:49 GMT; Max-Age=2592000; path=/
< Set-Cookie: maxidom_SALE_UID=1945123973; expires=Thu, 10-Aug-2023 12:19:49 GMT; Max-Age=31104000; path=/; domain=maxidom.ru
< Location: https://www.maxidom.ru/catalog/smesiteli/filter/item_firm-is-505a006bf69e69c71d23b5ca06faa83d/apply/index.php?amount=100
<
* Connection #0 to host www.maxidom.ru left intact


У первого сайта - редирект стоит со старта.

И хотя вы вроде поставили FOLLOW_LOCATION / true, но что-то пошло не так...

Бывает, что надо заголовок юзерагента воткнуть, через него защиту делают максимально примитивную.
Бывает, что нужно смотреть какие данные в Google Developer Console страница отсылает, чтобы получить в ответ верстку, там иногда верстка выдается только если user_auth_id требуется.
Бывает, что там SSL и если не поставить SSL_VERIFY_PEER / false оно не загребает контент, т.е. пытается проверить подлинность и не может, т.к. на локале на винде сертификаты не настроены, а настраивать их ну немногие умеют, проще false поставить

Много ситуаций.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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