PHP Простой синтаксический анализатор HTML DOM — заблокирован?

#php #web-scraping

Вопрос:

Спасибо, что разобрались в этом. Хотя это может быть простой проблемой, я слишком новичок в сканировании страниц, чтобы понять, почему этот простой код возвращает «false». В большинстве примеров, которые я вижу в Интернете, используется базовый URL-адрес, но я пытаюсь просмотреть конкретную страницу продукта. Используя ‘http://www.google.com/’ работает нормально. Может быть, меня заблокировали? Если да, то как бы это обойти в php? В python можно было бы чередовать учетные записи пользователей и прокси-серверы. Любые крупицы знаний будут оценены по достоинству. Вот базовый код с конкретной ссылкой.

 require_once($_SERVER['DOCUMENT_ROOT'].'/includes/simple_html_dom.php');

$url = 'https://www.lowes.com/pd/Frigidaire-Gallery-22-cu-ft-Counter-depth-Side-by-Side-Refrigerator-with-Ice-Maker-Fingerprint-Resistant-Black-Stainless-Steel/1000368269';
$html = file_get_html($url);
 

Спасибо, ребята.

Комментарии:

1. Использование file_get_contents вместо file_get_html того, чтобы сообщить нам, что Лоус возвращает запрещенный 403, у них, вероятно, есть какая-то технология защиты от соскабливания.

Ответ №1:

Лоус внедряет некоторые технологии защиты от соскабливания, на которые вы не можете положиться file_get_html . Однако вы можете использовать curl функции PHP, а затем использовать str_get_html простой HTML-DOM.

 <?php

require_once($_SERVER['DOCUMENT_ROOT'].'/includes/simple_html_dom.php');

$url = 'https://www.lowes.com/pd/Frigidaire-Gallery-22-cu-ft-Counter-depth-Side-by-Side-Refrigerator-with-Ice-Maker-Fingerprint-Resistant-Black-Stainless-Steel/1000368269';

// From https://gist.github.com/fijimunkii/952acac988f2d25bef7e0284bc63c406
$user_agents = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
];

// Get random user agent
$user_agent = $user_agents[rand(0,count($user_agents)-1)];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
$exec = curl_exec($ch);

$html = str_get_html($exec);
 

Комментарии:

1. Это была опечатка, она хотела сказать file_get_html

2. Спасибо, мулькин. Спасибо, что указали мне правильное направление: «завиток». Я изучил curl и несколько учебных пособий, чтобы понять и использовать его. Я добавил случайный user_auth и использование прокси-серверов, на которые мы подписываемся. Я получаю ответ, так что вы помогли мне преодолеть это препятствие до того момента, когда я понял, что «Доступ запрещен». Теперь моя цель-преодолеть это. Одно изменение в вашем коде — количество должно быть ‘count($user_agent)-1 Спасибо, мулькин!

3. @napierjohn Добро пожаловать, и спасибо за редактирование, я обновил ответ. Обязательно отметьте ответ как принятый, если вы в состоянии 🙂 Удачи вам в этом!