Веб-скрейпинг изображений на питоне с помощью селена и BeautifulSoup с веб-сайта AJAX

Я потратил много времени, пытаясь просмотреть html, javascript, сетевой трафик и т. д., и многое узнал о javascript, blobs, декодировании/кодировании изображений base64, но я до сих пор не могу понять, как извлечь изображения в этих видео с этого сайта: https://www.jamesallen.com/loose-diamonds/all-diamonds/

Вот что я знаю: Каждое видео на самом деле представляет собой набор из 512 изображений, которые извлекаются с сервера через файлы с названием setX.bin (где X — число). Затем они анализируются через массив int в объект blob (есть еще base64, но я забыл где), который каким-то образом преобразуется в изображение.

Следовать исходному коду очень сложно, так как он намеренно написан в виде спагетти-кода.

Как я могу извлечь изображения каждого бриллианта и сделать это эффективно?

Мое единственное решение:

Я могу очень легко получить файлы setX.bin, и если я просто каким-то образом «передам» их в функции javascript, тогда все будет хорошо.

Мое второе решение:

вращать каждый ромб вручную и извлекать изображения из кеша или что-то в этом роде.

Я хотел бы использовать python для этого.

Обновлено: Я нашел javascript здесь, на SO, который выдает «SecurityError: операция небезопасна». Вот:

function exportCanvasAsPNG(id, fileName) {

    var canvasElement = document.getElementById(id);
    canvasElement.crossOrigin = "anonymous";
    var MIME_TYPE = "image/png";

    var imgURL = canvasElement.toDataURL(MIME_TYPE);
    window.console.info(canvasElement);
    var dlLink = document.createElement('a');
    dlLink.download = fileName;
    dlLink.href = imgURL;
    dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');

    document.body.appendChild(dlLink);
    dlLink.click();
    document.body.removeChild(dlLink);
}

exportCanvasAsPNG("canvas-key-_w5qzvdqpl",'asdf.png');

Я запустил его из консоли Firefox. Когда я запустил аналогичный скрипт выполнения в python, у меня возникла та же проблема.

Я хочу иметь возможность очищать все изображения на 360 градусов для каждого холста.

Edit2: чтобы упростить этот вопрос, я знаю, как получить файлы setX.bin, но я не знаю, как преобразовать эту коллекцию изображений из bin в jpg. Каждый файл bin представляет собой несколько файлов jpg.

вы используете python или javascript

akshay patil 01.02.2019 10:51

Я использую Python 3

Monty 01.02.2019 11:13

в какой строке вы получаете ошибку

akshay patil 01.02.2019 11:47

var imgURL = canvasElement.toDataURL(MIME_TYPE);

Monty 01.02.2019 11:59

Давайте продолжить обсуждение в чате.

akshay patil 01.02.2019 12:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
518
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Файлы .bin, по-видимому, содержат только файлы jpeg, соединенные вместе с некоторыми ведущими метаданными. Вы можете просто перебирать байты файла в поисках сигнатур файлов jpeg (0xFFD8) и вырезать каждое изображение:

JPEG_MAGIC = b"\xff\xd8"

with open("set0.bin", "rb") as f:
    s = f.read()

i = 0
start_index = s.find(JPEG_MAGIC)

while True:
    end_index = s.find(JPEG_MAGIC, start_index + 1)

    if end_index == -1:
        end_index = len(s)

    with open(f"out{i:03}.jpg", "wb") as out:
        out.write(s[start_index:end_index])

    if end_index == len(s):
        break

    start_index = end_index

    i += 1

Результат:

Просто сверяюсь с несколькими другими наборами, но я думаю, что вы поняли. Я назначу награду, когда проверю их. Большое тебе спасибо! Как вы узнали, что нужно искать эту подпись?

Monty 05.02.2019 23:40

@Monty Файлы определенного формата обычно имеют уникальный подписи в своих начальных байтах, что позволяет их идентифицировать. Вот как работает команда файл.

cody 05.02.2019 23:56

Большое спасибо за ваше решение! Это очень хорошо работает для моих нужд. Я тоже узнал кое-что новое!

Monty 06.02.2019 08:00

Я надеюсь, что вы заглянете в эта почта, чтобы предложить какое-либо решение @cody. Заранее спасибо.

robots.txt 11.02.2019 09:52

Извините, я не заметил этого вовремя, но, похоже, у вас есть решение!

Monty 02.03.2019 00:10

Другие вопросы по теме