跳到主要內容

發表文章

Rust - 給我一塊小餅乾;淺談 reqwest 裡的 Cookies 操作

緣起 這陣子利用 Rust 開發了一個爬蟲程式,上網抓取一些網路資料,無意間發現對方的系統竟然會記錄且驗證 Session ID。在架構微服務化、API 無狀態化的風潮下,這樣的實作方式已經很少看到了(至少在我寫爬蟲、撈資料的這近十年間)。為了解決這個問題,我重啟了我對 Cookies 塵封已久的記憶,尋找處理 Session ID 對應的解決方案。 在Rust語言裡有許多 HTTP/HTTPS Client 的 Crate, reqwest [1][ 2 ] 應該是比較常見的一個套件。它是一個基於 hyper [3][ 4 ] Crate 的高階封裝實作,簡化了 Rust 在 HTTP/HTTPS 上的操作。同時,它支援了各種常見的 HTTP 方法(GET、POST、PUT、DELETE等)、使用者定義的標頭、Query String、POST Form 及 JSON Body 等操作,以及對應的 Response 處理。 看似功能完整、內容豐富的 reqwest Crate,在原生的功能實作中,竟然沒有 Cookies 操作的對應模組及功能?!這當下可讓我吃驚了,怎麼會這樣?提供 Cookies 的操作,這不是一個 HTTP/HTTPS Client 所應該具備的標配功能嗎?難道說真的是太少人使用,所以乾脆就不提供了? 面對這樣的狀況,那可真是令人苦惱啊!我可不想為了這件事,還要自已刻一個 Cookies 的操作處理器。 本文開始 關於這個問題,我在網路上花了不少的時間做了研究。其實要處理 Cookies 不外乎有兩個途徑,第一是使用者自己客製化、以手動的方式處理;顯然這個對我們來說,並不是一個最好的選項(尤其對於一個「站在巨人的肩膀上 [ 5 ][6] 」哲學信仰者的我來說…);第二種方法則是尋找是否有現成的套件可以使用,以有效縮短我們的開發時間。我相信這個應該會是大部分開發者所傾向使用的一種開發方式。  雖然在 reqwest 的套件裡,並沒有直接支援 Cookies 的操作功能,但是它還是為這個部分保留了一些彈性的空間。在 reqwest 裡頭宣告了幾個與 Cookie 操作相關的 Trait,例如 C...
最近的文章

Trip for Google Cloud Next '24

Google Cloud Next '24 has a packed schedule. As Google Cloud experts shared incisive speeches and held some brief discussions with them, we deeply felt that artificial intelligence is being further integrated into our daily life and work. (It is really tiring after flying more then 10 hours...)

Rust - 以 JSON 為資料來源建立 Polars DataFrame

緣起 在科技的蓬勃發展中,資料處理和分析變得愈發重要。Rust 語言的 Polars 框架為我們提供了一個強大的工具,讓資料操作變得更加容易且高效。這個框架支援以 JSON 格式匯入資料並建立 Dataframe,為我們提供了一個直觀且方便的方式來操作資料。 本文開始 本文的目的,為使用 JSON 為資料來源,在 Rust 中建立 Polars 的 Dataframe。在以下的文章裡,我們將在 Cargo.toml 中,使用如下的設定: [dependencies] polars = { version = "0.36.2", features = ["json"] } 撰文的當下,Polars 的最新版本為 0.36.2。參考 Polars 的 官方文件 ,它提供了以下的程式碼段落,以匯入 JSON 檔案內容: use polars :: prelude :: * ; let mut file = std :: fs :: File :: open ( "docs/data/path.json" ) . unwrap (); let df = JsonReader :: new ( & mut file ) . finish () . unwrap (); 到這裡,就能輕鬆的利用一個 JSON 檔案的內容,建立出 Dataframe 物件。 好了,故事結束,收工。 . . . . . 如果故事真的就這麼簡單,我想也就沒有撰寫這篇文章的必要了。 想想上面程式段落的例子,過程裡需要透過一個存在於檔案系統中的 JSON 檔案為媒介,儲存我們要處理的資料,再透過「JsonReader」讀入的 Dataframe 中處理。如果這些資料是從網路上取得(例如呼叫RESTful API),以字串變數的形式存在於系統之中,例如下面的內容: let msg = r#"[     {"id": 1, "name": "A", "age": 10},     {"id": 2, "name": "B", "age": 20} ]...

Rust - Polars 資料欄位型態轉換,從 str 變 Date

緣起 Polars 是一個以 Rust 語言開發的 「DataFrame」 新興套件,它可以同時在 Rust 及 Python 中使用。Polars 憑藉著 Rust 的執行速度為基礎,讓它在資料處理的領域中, 逐漸流行起來。 但正由於它還在發展初期,目前網路上的參考文章相對較少,中文的內容更是稀有;所以整理了一下這週末的一些研究心得,一來避免自己忘記,二來也在網路上與大家分享,希望慢慢的能讓 Rust 的中文資源可以越來越完整,有朝一日可以在華人世界中流行起來。 本文開始 本週研究的主題是 Polars 裡,對「DataFrame」某個「str」欄位,進行資料型別轉換為「Date」或「Datetime」。資料的轉換可以有多種方式,應該不只限於接下來提到的方法。 建立第一個資料集 為了開始這個操作,我們需要先建立起一個「DataFrame」。 let date = Series :: new ( "trans_date" , & [ "2023-05-01" , "2023-05-02" , "2023-05-03" , "2023-05-04" , "2023-05-05" , ]); let df = DataFrame :: new ( vec ! [ date ]); println ! ( " { } " , df . clone () . collect () ? );   執行後, 可以看到以下的結果:  shape: (5, 1) ┌────────────┐ │ trans_date │ │ ---        │ │ str        │ ╞════════════╡ │ 2023-05-01 │ │ 2023-05-02 │ │ 2023-05-03 │ │ 2023-05-04 │ │ 2023-05-05 │ └────────────┘ 從執行的結果中,我們可以清楚的看到,目前所建立的「DataFrame」,在「trans_date」的欄位中,...