• 数据采集之登录那些事


    数据采集之登录那些事

    一、前言

    最近笔者正在研究数据采集,大家知道部分网站是不对外公开的,需要你登录之后才能正常浏览,也就是所谓的[凭证]简单粗暴的想法就是,在该网站注册个账号,登录后记录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字符串;

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

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

     

  • 相关阅读:
    distributed caching for .net applications
    Linux_18/ mysql
    找到一本不错的Linux电子书,附《Linux就该这么学》章节目录。
    LinuxProbe/ 疑问ABC
    Linux_15/ autofs, DNS
    Linux_14/ SAMBA, NFS
    Linux_13/ 虚拟网站主机功能,Vsftpd
    Linux_12/ Apache, SELinux
    Linux_11/ firewalld-config, SSH, bounding
    Linux_10/ iptables & firewalld
  • 原文地址:https://www.cnblogs.com/samlin/p/CookieOfWebSite.html
Copyright © 2020-2023  润新知