PHP: Как получить сайт с cURL и вести себя как настоящий браузер? - PullRequest
0 голосов
/ 31 октября 2019

Есть конкретный веб-сайт, с которого я хочу получить исходный код с помощью PHP cURL.

Посещение этого веб-сайта с помощью Bowser с моего компьютера работает без каких-либо проблем.

Но когда я хочузайдите на этот сайт с помощью моего PHP-скрипта, веб-сайт распознает, что это автоматический запрос, и отобразит сообщение об ошибке.

Это мой PHP-скрипт:

<?php
$url = "https://www.example.com";
$user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15";
$header = array('http' => array('user_agent' => $user_agent));

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
echo $data;
?>

Пользовательский агент такой жеЯ также использую с браузером. Я использую локальный сервер с MAMP PRO. Это означает, что я использую один и тот же IP-адрес как для доступа к браузеру, так и для доступа к сценариям PHP.

Я уже пробовал свой сценарий PHP со многими различными заголовками и параметрами, но ничего не работало.

Необходимобыть тем, что делает доступ к PHP-скрипту отличным от доступа к браузеру, для веб-сервера, с которого я хочу, чтобы получить доступ к веб-сайту. Но что? У вас есть идея?

РЕДАКТИРОВАТЬ

Я обнаружил, что она работает с этим cURL:

curl 'https://www.example.com/' -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36' -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3' -H 'accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7'

Если я наберу это, например,Терминал, он показывает правильный исходный код.

Я преобразовал его в скрипт PHP следующим образом:

<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://www.example.com/');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

$headers = array();
$headers[] = 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3';
$headers[] = 'Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>

К сожалению, таким образом он все еще показывает сообщение об ошибке.

Это означает, что должно быть все, что делает доступ к командной строке отличным от доступа к браузеру, для веб-сервера, с которого я хочу, чтобы получить доступ к веб-сайту. Но что это?

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Нет разницы между запросом cURL и запросом, который выполняет браузер, кроме запрашиваемых им заголовков HTTP и того, что в браузере запущен JavaScript на клиенте.

Единственное, что идентифицируетHTTP-клиент - это его заголовки - обычно строка пользовательского агента - и, поскольку вы установили пользовательский агент точно таким же, как браузер, должны быть другие проверки на месте.

По умолчанию cURL не делаетНе отправляйте заголовок Accept по умолчанию, тогда как браузеры запрашивают страницы с этим заголовком, чтобы показать возможности браузера. Я ожидаю, что веб-сервер будет проверять что-то вроде этого.

Copy HTTP request as cURL

Взгляните на скриншот выше Chrome Developer Tools. Он позволяет вам скопировать весь запрос как запрос cURL, включая все заголовки, отправленные из Chrome, для тестирования в терминале.

Попробуйте точно сопоставить все заголовки из вашего PHP, и я 'Я уверен, что веб-сервер не сможет идентифицировать вас как скрипт.

0 голосов
/ 31 октября 2019

Вы должны попытаться имитировать настоящий браузер, подделав «настоящий» http-запрос. Добавьте больше заголовков, чем User-Agent, например «Accept», «Accept-Language», «Accept-Encoding». Кроме того, вам, вероятно, нужно принимать (и правильно обрабатывать) файлы cookie. Если ваш целевой веб-сайт использует JavaScript для обнаружения реального браузера, это еще одна проблема.

...