python selenium的webdriver操作浏览器显示某图片,如何直接将图片加载到内存

[复制链接]
查看11 | 回复7 | 2021-1-27 06:48:27 | 显示全部楼层 |阅读模式
1.不能使用src地址重下载方法。因为图片的src获取的是一个动态图片,每次获取得到的是当前时间的时间戳,所以每次请求的图片都是不一样的
2.不能使用截图方法,因为原始图片分辨率是800*800像素的图片,而在浏览器中这个图片显示在一个50*50的框架中,所以截图只能得到50*50的分辨率,不能满足分辨率的需求
请牛人指教

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:48:27 | 显示全部楼层
问题很难吗?
回复

使用道具 举报

千问 | 2021-1-27 06:48:27 | 显示全部楼层
这样的话只能使用requests或selenium爬取了,就是发送请求后对于返回的图片链接通过src值下载(浏览器就是这样工作的,根据返回的内容中的链接再次发送请求),这样一来下载的图片就是第一次显示的图片,而不是浏览器显示图片后再发请求重新下载(这是第二次请求这个图片)。第1条中提到的动态图片,如果是只gif的话可以通过工具将gif中每帧图片都提取出来,看看哪个是你需要的,如果是只后台对于每次请求都轮流提供一个图片,那可以分析一下每次都提供哪个图片,然后发送多次请求只保存对应的那次请求的图片。直接加载到内存的话,看看python中没有直接从url加载图片的库吧。
回复

使用道具 举报

千问 | 2021-1-27 06:48:27 | 显示全部楼层
引用2楼雁丘1990的回复:这样的话只能使用requests或selenium爬取了,就是发送请求后对于返回的图片链接通过src值下载(浏览器就是这样工作的,根据返回的内容中的链接再次发送请求),这样一来下载的图片就是第一次显示的图片,而不是浏览器显示图片后再发请求重新下载(这是第二次请求这个图片)。第1条中提到的动态图片,如果是只gif的话可以通过工具将gif中每帧图片都提取出来,看看哪个是你需要的,如果是只后台对于每次请求都轮流提供一个图片,那可以分析一下每次都提供哪个图片,然后发送多次请求只保存对应的那次请求的图片。直接加载到内存的话,看看python中没有直接从url加载图片的库吧。
你说的办法不行。例如
src为https://login.sina.com.cn/cgi/pin.php?r=10914609&s=0&p=tc-495d730ab3f1cd4ac64bfdb958f210a54f13
src没有改变,但是每次请求回来的图片都是不同的
回复

使用道具 举报

千问 | 2021-1-27 06:48:27 | 显示全部楼层
引用3楼小小爱好者的回复:Quote: 引用2楼雁丘1990的回复:
这样的话只能使用requests或selenium爬取了,就是发送请求后对于返回的图片链接通过src值下载(浏览器就是这样工作的,根据返回的内容中的链接再次发送请求),这样一来下载的图片就是第一次显示的图片,而不是浏览器显示图片后再发请求重新下载(这是第二次请求这个图片)。第1条中提到的动态图片,如果是只gif的话可以通过工具将gif中每帧图片都提取出来,看看哪个是你需要的,如果是只后台对于每次请求都轮流提供一个图片,那可以分析一下每次都提供哪个图片,然后发送多次请求只保存对应的那次请求的图片。直接加载到内存的话,看看python中没有直接从url加载图片的库吧。

你说的办法不行。例如
src为https://login.sina.com.cn/cgi/pin.php?r=10914609&s=0&p=tc-495d730ab3f1cd4ac64bfdb958f210a54f13
src没有改变,但是每次请求回来的图片都是不同的

这个是因为返回的内容是通过base64编码了,在服务器端动态生成图片,经过base64加密后变为字符串随html文档一起发送到客户端,然后浏览器会自动解码显示,所以src虽然一样,但显示内容不一样(每次都动态生成)。
你可以通过F12开发人员工具中的Source窗口看到每次返回的字符串都不一样,我用这个在线工具http://imgbase64.duoshitong.com/解码看了一下,和页面显示的图片一样,注意需要添加前缀data:image/png;base64,。

这样的话你可以尝试读取html文档中这个图片的base64编码然后解码(python好像自带这个解码包),不要通过浏览器,用requests包来获取response,response中的内容是原始内容,里面会包含这个图片的编码。另外,你发的这个新浪验证码例子可能不太合适,因为验证码毕竟很小,base64编码不大,而且动态生成也很容易,如果是照片等大图片,服务器不能随机生成啊,最多是后台随机选择照片然后base64编码一下发送。

回复

使用道具 举报

千问 | 2021-1-27 06:48:27 | 显示全部楼层
引用4楼雁丘1990的回复:Quote: 引用3楼小小爱好者的回复:
Quote: 引用2楼雁丘1990的回复:
这样的话只能使用requests或selenium爬取了,就是发送请求后对于返回的图片链接通过src值下载(浏览器就是这样工作的,根据返回的内容中的链接再次发送请求),这样一来下载的图片就是第一次显示的图片,而不是浏览器显示图片后再发请求重新下载(这是第二次请求这个图片)。第1条中提到的动态图片,如果是只gif的话可以通过工具将gif中每帧图片都提取出来,看看哪个是你需要的,如果是只后台对于每次请求都轮流提供一个图片,那可以分析一下每次都提供哪个图片,然后发送多次请求只保存对应的那次请求的图片。直接加载到内存的话,看看python中没有直接从url加载图片的库吧。

你说的办法不行。例如
src为https://login.sina.com.cn/cgi/pin.php?r=10914609&s=0&p=tc-495d730ab3f1cd4ac64bfdb958f210a54f13
src没有改变,但是每次请求回来的图片都是不同的

这个是因为返回的内容是通过base64编码了,在服务器端动态生成图片,经过base64加密后变为字符串随html文档一起发送到客户端,然后浏览器会自动解码显示,所以src虽然一样,但显示内容不一样(每次都动态生成)。
你可以通过F12开发人员工具中的Source窗口看到每次返回的字符串都不一样,我用这个在线工具http://imgbase64.duoshitong.com/解码看了一下,和页面显示的图片一样,注意需要添加前缀data:image/png;base64,。

这样的话你可以尝试读取html文档中这个图片的base64编码然后解码(python好像自带这个解码包),不要通过浏览器,用requests包来获取response,response中的内容是原始内容,里面会包含这个图片的编码。另外,你发的这个新浪验证码例子可能不太合适,因为验证码毕竟很小,base64编码不大,而且动态生成也很容易,如果是照片等大图片,服务器不能随机生成啊,最多是后台随机选择照片然后base64编码一下发送。

请问如何将这个base64的字符串加载到内存
回复

使用道具 举报

千问 | 2021-1-27 06:48:27 | 显示全部楼层
引用5楼小小爱好者的回复:Quote: 引用4楼雁丘1990的回复:
Quote: 引用3楼小小爱好者的回复:
Quote: 引用2楼雁丘1990的回复:
这样的话只能使用requests或selenium爬取了,就是发送请求后对于返回的图片链接通过src值下载(浏览器就是这样工作的,根据返回的内容中的链接再次发送请求),这样一来下载的图片就是第一次显示的图片,而不是浏览器显示图片后再发请求重新下载(这是第二次请求这个图片)。第1条中提到的动态图片,如果是只gif的话可以通过工具将gif中每帧图片都提取出来,看看哪个是你需要的,如果是只后台对于每次请求都轮流提供一个图片,那可以分析一下每次都提供哪个图片,然后发送多次请求只保存对应的那次请求的图片。直接加载到内存的话,看看python中没有直接从url加载图片的库吧。

你说的办法不行。例如
src为https://login.sina.com.cn/cgi/pin.php?r=10914609&s=0&p=tc-495d730ab3f1cd4ac64bfdb958f210a54f13
src没有改变,但是每次请求回来的图片都是不同的

这个是因为返回的内容是通过base64编码了,在服务器端动态生成图片,经过base64加密后变为字符串随html文档一起发送到客户端,然后浏览器会自动解码显示,所以src虽然一样,但显示内容不一样(每次都动态生成)。
你可以通过F12开发人员工具中的Source窗口看到每次返回的字符串都不一样,我用这个在线工具http://imgbase64.duoshitong.com/解码看了一下,和页面显示的图片一样,注意需要添加前缀data:image/png;base64,。

这样的话你可以尝试读取html文档中这个图片的base64编码然后解码(python好像自带这个解码包),不要通过浏览器,用requests包来获取response,response中的内容是原始内容,里面会包含这个图片的编码。另外,你发的这个新浪验证码例子可能不太合适,因为验证码毕竟很小,base64编码不大,而且动态生成也很容易,如果是照片等大图片,服务器不能随机生成啊,最多是后台随机选择照片然后base64编码一下发送。

请问如何将这个base64的字符串加载到内存

你在response中读取这个字符串时(将它赋值给一个变量)这个字符串就在内存中了啊,其实response的整个内容都是在内存中的。你将这个字符串解码后还是在内存中,除非你将它保存到文件中,这样才会写回磁盘。这个链接https://www.jianshu.com/p/30f8b1e69b5a里面写了一段代码图片和字符串互相转换。
回复

使用道具 举报

千问 | 2021-1-27 06:48:27 | 显示全部楼层
我也遇到这个问题,不能用requests来获取图片,因为尽管相同的cookie,返回的图片也不一样。请问你是怎么解决的呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行