Webscraping изображения в питоне с селеном и BeautifulSoup с веб-сайта AJAX - PullRequest
0 голосов
/ 01 февраля 2019

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

Вот что я знаю: Каждое видео на самом деле представляет собой набор из 512 изображений, которые извлекаются с сервера с помощью файлов с названием setX.bin (Х это число).Затем они анализируются с помощью массива 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.log(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-файлов.

1 Ответ

0 голосов
/ 06 февраля 2019

Похоже, что файлы .bin содержат jpegs, объединенные вместе с некоторыми ведущими метаданными.Вы можете просто перебирать байты файла в поисках сигнатур 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

Результат:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...