Парсил каталог товаров оптовика, заблочили, как быть?

Шлю запрос так:
function request($url){
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($ch, CURLOPT_REFERER, $url);
	curl_setopt($ch, CURLOPT_POST, 0);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/6.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36");
	$result = curl_exec($ch);
	$info = curl_getinfo($ch);
	if ($info['http_code'] != 200) {
		curl_close($ch);
		return false;
	}
	curl_close($ch);
	return str_get_html($result);
}

Можно ли как-то обойти блокировку?
Сначала думал - по ip, но ,похоже, нет - поменял на новый - не помогло.
Представился другим браузером - тоже не помогло.
Слал дополнительные заголовки - не помогло.
--
Есть ли идеи, что можно еще попробовать?)
Заранее благодарен за ответ.

P.S. Отдают заглушку при очередном запросе, что мол не надо так)

UPD:
print_r(curl_getinfo($ch)):
<code lang="php">
Array
(
    [url] => https://site.ru/
    [content_type] => text/html; charset=utf-8
    [http_code] => 403
    [header_size] => 308
    [request_size] => 240
    [filetime] => -1
    [ssl_verify_result] => 20
    [redirect_count] => 0
    [total_time] => 0.020305
    [namelookup_time] => 4.4E-5
    [connect_time] => 0.000747
    [pretransfer_time] => 0.007452
    [size_upload] => 0
    [size_download] => 600
    [speed_download] => 30000
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => -1
    [starttransfer_time] => 0.020198
    [redirect_time] => 0
    [redirect_url] => 
    [primary_ip] => 36.32.116.75
    [certinfo] => Array
        (
        )

    [primary_port] => 443
    [local_ip] => 31.170.122.143
    [local_port] => 42420
)
</code>
  • Вопрос задан
  • 1495 просмотров
Решения вопроса 4
1) Меняйте CURLOPT_USERAGENT через N запросов
2) Может сайт что-то в куки пишет, проверяйте их тоже и передавайте
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Откройте сайт в браузере, в DevTools возьмите строки header-а HTTP-запроса, и повторите их в curl-запросе. Посмотрите curl_error($ch);, вполне возможно там есть что-то вменяемое.

В конце концов попробуйте fsockopen($ip, 80, $errno, $errstr); с последующим echo($errno.":".$errstr); для debug-а.

А если сайт каталога детектит по отсутствию имени хоста в GET-запросе - прийдётся делать запросы вручную, cRUL такого "нарушения спецификации" на отрез не может.
Ответ написан
lukoie
@lukoie
забирайте по 10 штук с интервалами. У меня такое было, когда парсил, там по 100 может отдать, и тоже банит. Разбивал просто на чанки, и менял айпи.
Ответ написан
xPomaHx
@xPomaHx
1vs9
Типичный подход в таких проблемах, это ставить http proxy дампер, делать запрос из браузер и из твоего софта, и потом сравнивать что разного в запросах. Конечно это если у тебя в браузере нормально открывает.
Ну а вообще можешь юзать headless браузеры если не хочешь вообще ни с чем парится, всё будет работать сразу, но там тоже свои минусы есть.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега PHP
Написать письмо. Представиться, объяснить, что ничего плохого в виду не имеешь, попросить разрешения либо парсить как есть, либо доступ к цивилизованному API.
Ответ написан
Ваш ответ на вопрос

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

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