数据采集之登录那些事
数据采集之登录那些事
一、前言
最近笔者正在研究数据采集,大家知道部分网站是不对外公开的,需要你登录之后才能正常浏览,也就是所谓的[凭证]。简单粗暴的想法就是,在该网站注册个账号,登录后记录cookie信息,并将已登录的cookie信息持久化到文件、数据库,以便在采集数据时可以将cookie信息还原成网站登录的状态;
采集的流程大约是:1.获取cookie;2.将cookie转化为CookieContainer;3.将CookieContainer序列化并持久化;4.将持久化的CookieContainer反序列化;5、模拟登录信息去采集数据;
二、string与byte[]互转出错
在反序列化将MemoryStream转化为CookieContainer时出错:
System.OutOfMemoryException”的异常。
代码大约如下:
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, myCookieContainer);
byte[] bytes = memoryStream.ToArray();
string serializeCookie = Encoding.Default.GetString(bytes);
//...存储到数据库或文件
MemoryStream deserializeMs = new MemoryStream(Encoding.Default.GetBytes(serializeCookie));
CookieContainer deCookie = (CookieContainer)formatter.Deserialize(deserializeMs);
在反序列化时就报了“OutOfMemoryException”异常了。
三、什么会出现OutOfMemoryException?
经过一番的研究,发现在string类型与byte[]类型转换之间出现问题,主要体现在原byte[]数据的长度与转成string再生成byte[]的不一致,即以下转换存在问题:
byte[] bytes = memoryStream.ToArray();
string serializeCookie = Encoding.Default.GetString(bytes);
Encoding.Default.GetBytes(serializeCookie);
为什么会出现转换后不一致的情况?
答:这主要是图片数据、文件数据或序列化后的二进制数据,这些是不遵循任何语言的编码规则,在转换过程中会丢弃一些不符合编码的数据,所以无论是用gb2312、uft8或其它编码转换后都会出现问题。
四、解决方案
综上所述,如果有将图片、文件等二进制数据保存到数据库,建议使用byte[]类型进行保存,对应的数据库类型为varbinary(MAX);
但,你要是想将其保存为string类型则需要将byte[]以Base64进行转换,具体代码如下:
//将byte[]转为string
string str = Convert.ToBase64String(bytes);
//将string转为byte[]
byte[] transferBytes = Convert.FromBase64String(str);
五、延展话题-哪些场景还会用到Base64
1、微信公众号开发中,调用带参数二维码接口可以得到二维码的Base64字符串;
2、在H5或Native App开发中,需要上传图片、拍照等并上传到服务器中,一般也是将其转换成Base64;
3、模板登录,使用Cookie转换成Base64字符串;
-------------
欢迎关注[技术宅爸]公众号: