数据采集之登录那些事

一、前言

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

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

二、string与byte[]互转出错

在反序列化将MemoryStream转化为CookieContainer时出错:

System.OutOfMemoryException”的异常。

代码大约如下:

MemoryStreammemoryStream =newMemoryStream();

BinaryFormatterformatter =newBinaryFormatter();

formatter.Serialize(memoryStream, myCookieContainer);

byte[] bytes = memoryStream.ToArray();

stringserializeCookie =Encoding.Default.GetString(bytes);

//...存储到数据库或文件

MemoryStreamdeserializeMs =newMemoryStream(Encoding.Default.GetBytes(serializeCookie));

CookieContainerdeCookie = (CookieContainer)formatter.Deserialize(deserializeMs);

在反序列化时就报了“OutOfMemoryException”异常了。

三、什么会出现OutOfMemoryException?

经过一番的研究,发现在string类型与byte[]类型转换之间出现问题,主要体现在原byte[]数据的长度与转成string再生成byte[]的不一致,即以下转换存在问题:

byte[] bytes = memoryStream.ToArray();

stringserializeCookie =Encoding.Default.GetString(bytes);

Encoding.Default.GetBytes(serializeCookie);

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

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

四、解决方案

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

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

//将byte[]转为string

stringstr =Convert.ToBase64String(bytes);

//将string转为byte[]

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

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

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

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180502G1J09W00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券