Задать вопрос
@khodos_dmitry

Как скачать картинку со страницы в php webdriver?

Допустим, я нашел src картинки на странице. Как мне ее сохранить к себе теперь? Интересует использование именно webdriver, а не получить полный урл и скачать http запросом.
Проблема: нужно скачать картинки с сайта, но сайт защищен cloudflare. curl не проходит javascript-тест. Отдельно взять и скачать каждую картинку при помощи selenium тоже не выходит, видимо идет проверка по referer или как-то еще. Нужно открыть страницу и сохранить оттуда картинки.
Пытался так это реализовать (открыть картинку в новой вкладке и скачать оттуда):
$crawler = $client->request('GET', $url);

    $client->waitFor('html');

    $imgs = $client->findElements(WebDriverBy::cssSelector('img'));

    foreach ($imgs as $img) {
        $img_url = $img->getAttribute('src');
        $client->executeScript("window.open('$img_url');");
    }

    $windows = $client->getWindowHandles();

    $visitedWindows[] = $client->getWindowHandle();

    foreach ($windows as $window) {
        if (in_array($window, $visitedWindows, true)) {
            continue;
        } else {
            $client->getWebDriver()->switchTo()->window($window);
        }
    }

Но получаю ошибку: stale element reference: element is not attached to the page document (Session info: headless chrome=88.0.4324.104)
При том, что скрипт выше все урлы картинок находит правильно.
  • Вопрос задан
  • 422 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@0ffff0
curl -Ls -o file.jpg
Ответ написан
Методом executeScript создаём ссылку на странице в href которой помещаем ObjectURL картинки. Далее делаем клик по нашей ссылке и картинка в папке загрузок.
js для получения картинки будет примерно такой:

async function fetchImage(url){
  const data = await fetch(url, {credentials: 'include'});
  const contentType = data.headers.get('content-type');
  const buffer = await data.arrayBuffer();
  const blob = new Blob([buffer], { type: contentType});
  return blob;
}
async function createLinkImage(url){
    var blob =  await fetchImage(url);
    var link = document.createElement('a');
    link.id = 'saveImageLink'; 
    link.href = URL.createObjectURL(blob);
    link.download = "image.jpg"; //желательно подставлять расширение из contentType картинки
    link.innerHTML = 'скачать image';
    document.body.append(link);
}
createLinkImage('https://site.site/picture.jpg');

Для загрузки нескольких картинок с одной страницы, необходимо подправить скрипт, чтобы исключить повтор элемента на странице с одинаковым id
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы