【问题标题】:Webscraping images in python with selenium and beautifulsoup from an AJAX website使用来自 AJAX 网站的 selenium 和 beautifulsoup 在 python 中抓取图像
【发布时间】:2019-06-25 16:28:30
【问题描述】:

我花了很长时间尝试浏览 html、javascript、网络流量等,并学习了很多关于 javascript、blob、base64 图像解码/编码的知识,但我似乎仍然无法弄清楚如何从本网站提取这些视频中的图像:https://www.jamesallen.com/loose-diamonds/all-diamonds/

这是我所知道的: 每个视频实际上是一组最多 512 张图像,这些图像是通过名为 setX.bin(X 是一个数字)的文件从服务器检索的。然后通过一个 int 数组将它们解析为一个 blob 对象(还有一些 base64,但我忘记了在哪里),以某种方式转换为图像。

跟踪源代码非常困难,因为它是特意写成意大利面条代码的。

如何高效地提取每颗钻石的图像?

我的一个解决方案是:

我可以很容易地获取 setX.bin 文件,如果我只是以某种方式将它们“传递”到 javascript 函数中,那么我应该会很好。

我的第二个解决方案是:

手动旋转每个钻石并从缓存中提取图像或类似的东西。

我想用 python 来做这个。

编辑: 我在 SO 上找到了 javascript,它确实给出了“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文件。

【问题讨论】:

  • 你使用的是python或javascript
  • 我正在使用 Python 3
  • 在哪一行出现错误
  • var imgURL = canvasElement.toDataURL(MIME_TYPE);

标签: javascript python ajax selenium web-scraping


【解决方案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 特定格式的文件通常在其前导字节中具有唯一的signatures,以便识别它们。这就是file 命令的工作原理。
  • 非常感谢您的解决方案!这非常适合我的需求。我也学到了一些新东西!
  • 我希望您能查看 this post 以提供任何解决方案 @cody。提前致谢。
  • 抱歉没及时发现,看来你有办法了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多