数据采集之登录那些事

数据采集之登录那些事

 

一、前言

最近笔者正在研究数据采集,大家知道部分网站是不对外公开的,需要你登录之后才能正常浏览,也就是所谓的[凭证]简单粗暴的想法就是,在该网站注册个账号,登录后记录cookie信息,并将已登录的cookie信息持久化到文件、数据库,以便在采集数据时可以将cookie信息还原成网站登录的状态;

采集的流程大约是:1.获取cookie2.cookie转化为CookieContainer3.CookieContainer序列化并持久化;4.将持久化的CookieContainer反序列化;5、模拟登录信息去采集数据;

二、stringbyte[]互转出错

在反序列化将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);

为什么会出现转换后不一致的情况?

答:这主要是图片数据、文件数据或序列化后的二进制数据,这些是不遵循任何语言的编码规则,在转换过程中会丢弃一些不符合编码的数据,所以无论是用gb2312uft8或其它编码转换后都会出现问题。

四、解决方案

综上所述,如果有将图片、文件等二进制数据保存到数据库,建议使用byte[]类型进行保存,对应的数据库类型为varbinary(MAX)

但,你要是想将其保存为string类型则需要将byte[]Base64进行转换,具体代码如下:

//byte[]转为string

 string str = Convert.ToBase64String(bytes);

//string转为byte[]

 byte[] transferBytes = Convert.FromBase64String(str);

 

五、延展话题-哪些场景还会用到Base64

1、微信公众号开发中,调用带参数二维码接口可以得到二维码的Base64字符串;

2、在H5Native App开发中,需要上传图片、拍照等并上传到服务器中,一般也是将其转换成Base64

3、模板登录,使用Cookie转换成Base64字符串;

 -------------

欢迎关注[技术宅爸]公众号:

 

posted @ 2018-05-02 20:12  Sam Lin  阅读(711)  评论(0编辑  收藏  举报