當前位置:
首頁 > 最新 > 數據採集之登錄那些事

數據採集之登錄那些事

一、前言

最近筆者正在研究數據採集,大家知道部分網站是不對外公開的,需要你登錄之後才能正常瀏覽,也就是所謂的[憑證]。簡單粗暴的想法就是,在該網站註冊個賬號,登錄後記錄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字元串;


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 技術宅爸 的精彩文章:

TAG:技術宅爸 |