如果 URL 以“blob:”开头,如何使用 Python 3/Selenium 下载图像?

2024-01-12

使用 web.whatsapp.de 时,可以看到收到的图像的链接可能如下所示:

blob:https://web.whatsapp.com/3565e574-b363-4aca-85cd-2d84aa715c39

如果链接被复制到地址窗口,它将打开图像,但是 - 如果省略“blob” - 它只会打开一个新的 Web Whatsapp 窗口。

我正在尝试下载此链接显示的图像。

但是使用常见的技术,例如使用 request、urllib.request 甚至 BeautifulSoup 总是会遇到一个问题:url 开头的“blob”会抛出错误。

这些答案使用 Python 从 Blob URL 下载文件 https://stackoverflow.com/questions/39517522/download-file-from-blob-url-with-python将抛出错误

URLError: <urlopen error unknown url type: blob>

或错误

InvalidSchema: No connection adapters were found for 'blob:https://web.whatsapp.com/f50eac63-6a7f-48a4-a2b8-8558a9ffe015'

(使用美丽汤)

使用本机方法,例如:

import requests

url = 'https://web.whatsapp.com/f50eac63-6a7f-48a4-a2b8-8558a9ffe015'
fileName = 'test.png'
req = requests.get(url)
file = open(fileName, 'wb')
for chunk in req.iter_content(100000):
    file.write(chunk)
file.close()

只会导致与使用 BeautifulSoup 相同的错误。

我在 Python 中使用 Selenium 控制 Chrome,但是我无法使用提供的链接正确下载图像。


Blob 是浏览器存储的原始数据的类似文件对象。

您可以在以下位置查看它们:chrome://blob-internals/

可以通过脚本注入使用 Selenium 获取 blob 的内容。但是,您必须通过在创建 blob 的页面/域上运行脚本来遵守跨源策略:

def get_file_content_chrome(driver, uri):
  result = driver.execute_async_script("""
    var uri = arguments[0];
    var callback = arguments[1];
    var toBase64 = function(buffer){for(var r,n=new Uint8Array(buffer),t=n.length,a=new Uint8Array(4*Math.ceil(t/3)),i=new Uint8Array(64),o=0,c=0;64>c;++c)i[c]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charCodeAt(c);for(c=0;t-t%3>c;c+=3,o+=4)r=n[c]<<16|n[c+1]<<8|n[c+2],a[o]=i[r>>18],a[o+1]=i[r>>12&63],a[o+2]=i[r>>6&63],a[o+3]=i[63&r];return t%3===1?(r=n[t-1],a[o]=i[r>>2],a[o+1]=i[r<<4&63],a[o+2]=61,a[o+3]=61):t%3===2&&(r=(n[t-2]<<8)+n[t-1],a[o]=i[r>>10],a[o+1]=i[r>>4&63],a[o+2]=i[r<<2&63],a[o+3]=61),new TextDecoder("ascii").decode(a)};
    var xhr = new XMLHttpRequest();
    xhr.responseType = 'arraybuffer';
    xhr.onload = function(){ callback(toBase64(xhr.response)) };
    xhr.onerror = function(){ callback(xhr.status) };
    xhr.open('GET', uri);
    xhr.send();
    """, uri)
  if type(result) == int :
    raise Exception("Request failed with status %s" % result)
  return base64.b64decode(result)

bytes = get_file_content_chrome(driver, "blob:https://developer.mozilla.org/7f9557f4-d8c8-4353-9752-5a49e85058f5")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 URL 以“blob:”开头,如何使用 Python 3/Selenium 下载图像? 的相关文章

随机推荐

  • 为什么 vim 中有些命令需要冒号而有些则不需要?

    vim 中的一些命令是通过首先键入冒号 给出的 例如 wq 用于保存文件并退出 虽然某些命令不需要冒号 例如替换命令 R 我想知道这两种方法有什么区别 对于哪些需要冒号而哪些不需要冒号有什么具体规则吗 你必须调查六的历史 http en w
  • WCF MaxItemsInObjectGraph 设置不起作用

    我在尝试访问我的 WCF 服务时遇到以下错误 对象图中可以序列化或反序列化的最大项目数为 65536 更改对象图或增加 MaxItemsInObjectGraph 配额 做了一些研究 看起来我需要做的就是将此设置更新为更高的值 这就是我想要
  • 如何从 SVG 文件制作可点击的地图?

    目前我正在学习Javascript 我正在尝试制作一张显示数据的德国可点击地图 就像this https www amcharts com demos us heat map Amchart 提供德国地图 https www amchart
  • 如何使用函数“get_data_struct”

    我尝试使用函数 get data struct 但收到如下错误 有人知道如何修复它吗 先感谢您 获取数据结构 DUR D data frame data struct concepts 中的错误 尝试从不是 S4 对象的对象 类 data
  • PHP:在谷歌云存储中保存“动态文本或pdf内容”?

    运行时 php GCS文件上传流程 storage new StorageClient file fopen source r bucket storage gt bucket bucketName object bucket gt upl
  • 从 Android 自己的自定义活动中关闭底部表单对话框

    我在 Chintan Khetiya 的回答的帮助下创建了一个自定义底表 Android 对话 如何在android中创建自定义对话框 https stackoverflow com questions 13341560 how to cr
  • WordPress 自定义 URL 路由

    我要求所有网址末尾都有一个变量 并且全部解析为相同的控制器 视图 例如我们有以下 URL http example com users joe http example com users sam http example com user
  • 导入 CV2 时收到来自 lingnutls/'Hogweed' 的错误

    我从未见过这样的错误 不知道从哪里开始 我安装了 opencv conda install opencv 我正在使用名为 fpn 的 conda 环境运行 Ubuntu Linux 18 04 我应该如何解决这个问题 Traceback m
  • 如何在活动中创建覆盖视图

    我有一个要求 我有一个活动显示 Facebook feed 等项目列表 当单击其中一个列表项中的按钮时 必须弹出一个对话框 其中将显示该项目的评论 我正在查看文档并发现我们必须创建一个对话框片段 http developer android
  • 代码点火器文件上传

    我正在执行以下操作来使用 codeigniter 上传文件 图像 我想要做的是修改错误消息 以便明显地看出错误与哪个字段相关 因为页面上有多个上传选项 下面是我的上传代码 config upload path media uploads u
  • Android 从剪贴板管理器复制/粘贴

    是否可以发送过去的命令 以便将文本粘贴到当前聚焦的编辑文本中 设想 后台服务监听通知 完成 收到通知后 需要将文本复制到剪贴板 完成 将文本粘贴到任何当前聚焦的字段 如果不可能 则放弃粘贴命令 我知道如何复制文本ClipboardManag
  • 在 Firebase 数据库规则上创建自定义验证

    我想使用 firebase 实时数据库创建一个聊天应用程序 我已经拥有自己的服务器以及我自己的用户和收件人身份验证 所以基本上我想做的是 我希望我的服务器能够生成房间及其房间密钥 因此仅向我共享密钥的人可以访问房间 进行读写 也许流程是这样
  • 更快(最快?)的方法来获取包含超过 200,000 个文件的目录中的文件数

    我有一些包含测试数据的目录 通常每个目录有超过 200 000 个小 4k 文件 我使用以下 C 代码来获取目录中的文件数 int fileCount System IO Directory GetFiles C SomeDirectory
  • 在 Python 中传递带有空格的命令行参数

    我试图传递带有空格的命令行参数 但是sys argv 1 strip 只给我论点的第一个词 import sys os docname sys argv 1 strip e g python myscript py argument wit
  • 我如何获取本地变更列表并将其发送给 Perforce 中的其他人?

    我如何获取本地变更列表并将其发送给 Perforce 中的其他人 更具体地说 我想将未提交的更改从本地待定更改列表发送到另一个用户的待定更改列表 set P4DIFF C cygwin bin diff exe p4 diff du c 1
  • 无法下载 CentOs 8 的 RemiRepo

    当我尝试安装 Remi 存储库来下载 php 时 我遇到了麻烦 当我使用命令时 dnf install https rpms remirepo net enterprise remi release 8 rpm 我有一个错误 Error P
  • 关闭 Chrome 中的 Silverlight 插件警告

    我正在使用 Silverlight 3 应用程序并使用 Chrome 作为我的测试浏览器 在调试时 我不断收到弹出消息 插件无响应 以下插件无响应 未知 你想阻止我吗 Yes No 如何在 Chrome 中关闭此功能 VS可以设置为只在调试
  • 使用 next-redux-wrapper 时访问 React 外部的 Redux 存储

    我有一个 NextJS React 应用程序 它使用 next react wrapper 基本上是一个 HOC app tsx像这样 app tsx import withRedux from next redux wrapper cla
  • 要求 IntelliJ IDEA 将构建的工件安装到 maven 本地存储库中

    标题总结如下 我正在寻找一种方法来构建 jar 文件并将其安装到 IntelliJ IDEA 中我的计算机上的 Maven 本地存储库中 而无需每次都转到命令提示符并发出mvn install install file命令 最重要的是我希望
  • 如果 URL 以“blob:”开头,如何使用 Python 3/Selenium 下载图像?

    使用 web whatsapp de 时 可以看到收到的图像的链接可能如下所示 blob https web whatsapp com 3565e574 b363 4aca 85cd 2d84aa715c39 如果链接被复制到地址窗口 它将