У меня есть файл XML локально. Он содержит данные с торговой площадки. Примерно это выглядит так:
<offer id = "2113">
<picture>https://anotherserver.com/image1.jpg</picture>
<picture>https://anotherserver.com/image2.jpg</picture>
</offer>
<offer id = "2117">
<picture>https://anotherserver.com/image3.jpg</picture>
<picture>https://anotherserver.com/image4.jpg</picture>
</offer>
...
Я хочу сохранить эти изображения на узле <picture> локально.
Есть про 9000 предложений и про 14 000 изображений.
Когда я просматриваю их, я вижу, что изображения копируются с этого другого сервера, но в какой-то момент он дает 504 Gateway Timeout.
Дело в том, что иногда ошибка выдается после 2000 изображений, иногда более или менее.
Я пытался получить с этого сервера только одно изображение 12000 раз (т.е. только https://anotherserver.com/image3.jpg), но он все равно выдавал ту же ошибку.
Как я читал, другой сервер блокирует мои запросы после некоторого количества.
Я пробовал использовать PHP sleep(20) после каждого сотого изображения, но он все равно выдавал ту же ошибку (sleep(180) - same). Когда я попробовал локальный образ, но с полным путем, он не дал никаких ошибок. Пробовал второй сервер (не локальный), то же самое.
Я использую функцию PHP copy() для перемещения изображения с этого сервера.
Я только что использовал file_get_contents() для тестирования, но получил ту же ошибку.
у меня есть
set_time_limit(300000);
ini_set('default_socket_timeout', 300000);
также, но не повезло.
Есть ли способ сделать это без запросов на фрагменты?
Эта ошибка возникает на каком-то одном изображении? Было бы здорово поймать эту ошибку или просто отслеживать задержку ответа, чтобы отправить другой запрос через некоторое время, если это можно сделать?
Есть ли какое-то постоянное время в секундах, которое мне нужно подождать, чтобы выполнить эти запросы?
И, пожалуйста, дайте мне ответы без скручивания, если это возможно.
UPDATE
Curl и exec (wget) тоже не работали. Они оба совершили одну и ту же ошибку.
Можно ли настроить удаленный сервер так, чтобы он не блокировал меня? (Если это так).
p.s. если я сделаю: echo "<img src = 'https://anotherserver.com/image1.jpg'" /> в цикле для всех 12000 изображений, они будут отображаться нормально.
Обычно я обхожу подобные вещи с помощью прокси, таким образом вы можете распределять запросы по нескольким IP-адресам. Но это And pls give me non-curl answers if possible.






Поскольку вы получаете доступ к контенту на сервере, который не можете контролировать, только администраторы сервера знают действующие правила блокировки.
Но у вас есть несколько вариантов, а именно:
Пользовательский агент не помог. Пакеты по 1000 штук не будут есть, потому что ждать несколько часов - не вариант. Когда я пытаюсь сохранить файлы, возникает ошибка, но когда я просто echo "<img src='https://anotherserver.com/image3.jpg'>", она появляется на странице браузера. Думаю, я мог бы попытаться просмотреть их все через javascript, получить base64 изображений и сохранить эти данные в виде файла изображения? Или мне не хватает чего-то очень важного?
Мне любопытно, почему curl вам не подходит? Будет ли он отображать ВСЕ изображения в браузере? Недавно я сделал проект, в котором я использовал wget для получения десятков тысяч HTML-страниц с одного сайта. Но это был не php, я запускал его как сценарий оболочки.
Итак, я мог бы выполнить exec (), запустить wget и передать URL-адреса изображений в переменных, и все будет работать правильно? Я никогда не использовал wget, могу я его так использовать? Мне нужно, чтобы это работало как можно быстрее, и, поскольку я читал, CURL намного медленнее.
Дайте мне несколько, и я продезинфицирую скрипт, который использовал, и вставлю его в ответ. (это слишком долго для комментария).
Я запустил другой сценарий для входа в систему и сохранения файла cookie, но вот пример. Однако он захватил целые html-страницы ... #! / Bin / bash m = 1 while [$ m -lt 20350]; do wget --load-cookies cookies.txt \ --header = "Accept: text / html" \ --user-agent = "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko ) Chrome / 69.0.3497.100 Safari / 537.36 "\ somewebsite.com/editcontactform.cfm?id=$m let m = m + 1 sleep .25 done
У меня есть wget -P --cut-dirs=3 -np -nH /home/subd.mywebsite.com/images/ -A jpeg,jpg,bmp,gif,png https://anotherdomain.com/images/detailed/27/image3.png, и это создает папки. Я хочу сохранить файл изображения только в моем каталоге. Я не знаю, какие параметры мне для этого использовать. Я добавил параметры, которые нашел в stackoverflow. Ничего не работает. А также, при сохранении файла, могу ли я переименовать изображение и назвать его как захочу?
Да, вы можете переименовывать изображения, как хотите.
Ты почти спас мне день. Я имею в виду, что у меня есть еще одна проблема. exec(wget) или exec(/usr/bin/wget) работают. Когда я запускаю ту же команду в терминале, изображение сохраняется должным образом. Но с exec я не могу запустить ни одну команду, я думаю. Вы тоже можете на это ответить? Или мне задать новый вопрос?
Я запускал его как команду оболочки, а не в PHP. Может, это поможет.
У меня было хорошее предчувствие по этому поводу. Но это не сработало. с wget возникает такая же ошибка. Есть другие предложения?
Я ничего не могу придумать, кроме как использовать несколько компьютеров (IP-адресов) и делать это партиями. Сколько вы получаете за раз? Между партиями может потребоваться всего 30 минут, трудно сказать.
Вот в чем дело. Один раз я просто выполнил сценарий, и все прошло хорошо. Все изображения были скопированы. Думаю, я буду использовать несколько IP-адресов. Я отправлю ответ, когда он у меня будет. Только почему изображения отображаются, когда я помещаю эхо "<img src>"? Это какой-то другой запрос? Это все еще просьба, и все равно их 12 000 ...
@temo вы исключили, что echo <img src> "работал в приватном режиме? Возможно, это сработало только потому, что в вашем браузере хранился файл cookie сеанса. Если это так, вы должны иметь возможность использовать этот файл cookie с curl / wget
Я бы посоветовал вам попробовать следовать 1. повторно использовать ранее открытое соединение с помощью CURL
$imageURLs = array('https://anotherserver.com/image1.jpg', 'https://anotherserver.com/image2.jpg', ...);
$notDownloaded = array();
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
foreach ($imageURLs as $URL) {
$filepath = parse_url($URL, PHP_URL_PATH);
$fp = fopen(basename($filepath), "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_URL, $URL);
curl_exec($ch);
fclose($fp);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) == 504) {
$notDownloaded[] = $URL;
}
}
curl_close($ch);
// check to see if $notDownloaded is empty
Я попробую.
Я пробовал это, когда вы писали, но не повезло. Я перешел в другие сегменты проекта и скоро должен вернуться к этому. Надеюсь, к тому времени я получу какой-нибудь ответ.
if I do: echo "<img src = 'https://anotherserver.com/image1.jpg'" />PS здесь неверные цитаты. У вас есть двойная кавычка в атрибуте src, а не одна в конце строки, что является синтаксической ошибкой. Полагаю, это, наверное, опечатка в вопросе.