2018-03-21昨天調整了整個lib.rs的函式結構,除了資料庫的儲存沒做好,其它都通過執行了
有900行**了,感覺太亂,太雜,想分開檔案來做,檢視了一下別人的rust檔案的mod和檔案系統
想模仿一下,分開管理。
箱和模組
模組系統
2018-03-27終於改好了第乙個分工程模組的爬蟲版本,很粗糙。
src資料夾的檔案如下:
│ lib.rs
│ main.rs
│└─ crawler_mov
config.rs
crawler.rs
database.rs
data_structur
mod.rs
scraper.rs
spider.rs
設計是這樣的:
lib.rs是已經實現了完整的抓取搜尋網頁結果,info的json和相關資源及其json,
初步的資料庫連線和建立各種表。就不去動lib.rs了,現在是重構lib.rs
lib.rs實現的是單執行緒做法,考慮到以後會使用gui,網頁,cli等客戶端,還是需要用多執行緒來跑搜尋,
爬蟲放出去,能不斷返回爬取到的結果,客戶端收到訊息就可以重新整理介面,也能發控制命令例如停止命令給爬蟲。
spider是專職的對於乙個型別的鏈結進行爬取,爬完單個網頁,如果鏈結裡還有自己可以處理的型別,就一直爬取下去,直至沒有就停止爬取;
scraper是對於spider爬取到的內容進行提取處理結構化,返回給spider,spider集合起來,返回給crawler。
確定了這些,就是要用通道channel來進行訊息傳送了,用delegate或trait對於多執行緒資料的傳送都不是那麼理想。
瞎設計的結論是:crawler,spider,都是乙個函式搞定,引數給與返回結果的通道和接收命令的通道。
由呼叫者決定是否新開執行緒執行函式。
因此,最簡單的只爬取搜尋結果頁面的所有id的分模組是:
scraper.rs 的功能:把傳送進來的 document 內容進行查詢需要的節點,把內容提取出來,返回給 spider;
spider.rs 的功能:1,把傳送進來的 url 和 頁面序號組合後獲取網頁document,讓scraper提取裡面的id列表,傳送給通道傳送給crawler;2,把頁面序號加一,繼續步驟1,迴圈爬取,直至獲取到的網頁提取不到id出來才停止;
crawler.rs 的功能:把傳送進來的關鍵字,型別,排序條件組合成url,開通道和執行緒,呼叫spider去爬取id列表;
迴圈讀取通道內容,直至收到乙個內容為空的列表才停止;
main.rs 的功能: 開啟執行緒,呼叫crawler爬取id列表;
迴圈讀取通道內容,把讀到的內容讓乙個函式進行處理;
直至收到乙個內容為空的列表才停止;
也可通過通道傳送乙個true值,作為停止命令,讓crawler中止執行。
拆分了模組:
data_stucture.rs
負責資料結構
database.rs
負責資料庫相關
config.rs
負責程式的引數設定
插個話題:
rust語言怎麼把已經列印出來的文字覆蓋掉?
做好 doc 做好 test,
database.rs 要做好工作,把功能用trait的方式做出來,要用 enum的形式固定sql的型別,根據型別和版本來獲取sql語句
data_structur.rs 要提供元祖,把固定的東西直接pub 提供出來,對應enum static提供出來
第一次重構
乙個新專案 訂單有八個狀態,已編制,已派發,已接單,已停單,已出庫,已上車,已卸貨,已完結 要求我根據每個狀態的查詢都寫乙個介面,並且返回的訂單資訊要過濾,而不是需要什麼在set到返回物件中。這需要我寫乙個訂單基本資訊的類orderinfo,然後根據訂單流程,不斷繼承與orderinfo或者orde...
第一次筆記
引用資料在記憶體中儲存的資料 a 100 a 是指向100的乙個引用 print id a 互動模式和直接引用的區別直接引用 a 367b 367print id a 2429337035888 每次執行結果會變 print id b 2429337035888 每次執行結果會變 print a i...
我的第一次
第一次寫部落格,把握以前的自傳寫上吧 袁傑,河南唐河人,1984年的臘月出生在乙個普通的小農家庭裡。然後就上幼兒園 家鄉叫育紅班 上小學,上初中。我是順著無數個前人走過的路走過來的,而且肯定還會有許多會順著我走過的路一直走下去。這期間,幾乎沒有什麼可以值得懷念的事,如果硬要說出一點什麼來,那就是成績...