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