- GitHub文檔鏡像
- 歡迎使用Hawk
- 快速教程
- 主要組件介紹
- 核心功能:
- [模塊和算子]
- 常見問題
- 更新日志作者和捐贈列表
- 專題:
- 案例:
- 發(fā)布文章:
- 故事:
數(shù)據(jù)清洗
數(shù)據(jù)清洗是一種任務(wù)矢劲,包括幾十個子模塊鲜棠, 這些子模塊包含四類:生成, 轉(zhuǎn)換涯呻, 過濾和執(zhí)行砰识。
在輸出的文檔中,點擊單元格颗味,可以放大和顯示該單元格的文本內(nèi)容(相比于Hawk早期版本,這實在太實用了):
1.快速使用說明
數(shù)據(jù)清洗可以通過組合多個不同的子模塊,生成多樣的功能猛蔽,通過拖拽構(gòu)造出一個工作流,它能夠產(chǎn)生一個有限或無限的文檔序列灵寺。比如下面:
1.1.基本操作
- 左側(cè)是所有模塊列表曼库,分為生成,轉(zhuǎn)換略板,過濾和執(zhí)行四種類型毁枯,可通過名稱和拼音首字母快速檢索。順序組合可構(gòu)成復(fù)雜任務(wù)叮称。
- 右側(cè)是數(shù)據(jù)預(yù)覽种玛,可將左側(cè)選中的模塊拖入到右側(cè)對應(yīng)列上。 雙擊每個列上面的模塊對其配置瓤檐。將鼠標(biāo)吐冈希靠字段上可查看使用介紹
- 預(yù)覽時,處理是串行的挠蛉,數(shù)據(jù)不會被寫入祭示,有緩存,調(diào)試所見即所得谴古。 只有在執(zhí)行模式下才會并行快速執(zhí)行绍移。
- 執(zhí)行器可看做帶有副作用(如寫入文件)的轉(zhuǎn)換器,只有在執(zhí)行時才會運行
- 生成器通常位于任務(wù)開頭讥电,可從文本蹂窖,文件,數(shù)據(jù)庫讀取數(shù)據(jù)恩敌。生成器也能位于流的中間瞬测,通過多種模式與已有數(shù)據(jù)流組合
- 下方菜單欄可點擊刷新,前后單步,可通過采樣量來修改預(yù)覽的數(shù)據(jù)量月趟。配置完畢無誤后灯蝴,左側(cè)面板點擊執(zhí)行即可。
- 很多問題來自于模塊順序不對孝宗,任何步驟錯誤穷躁,會導(dǎo)致連鎖的問題,因此有必要使用單步調(diào)試因妇,在調(diào)試到某步時问潭,拖入的模塊會插入到所在位置。
1.2.高級功能和技巧
- 輸入列一般不用配置婚被,需要時可下拉選擇狡忙,也可手工輸入文本。列名不要為純數(shù)字址芯,否則無法正常顯示灾茁。
- 關(guān)于Python轉(zhuǎn)換器:最后一行必須是可求值的表達式。例如有兩列a,b,轉(zhuǎn)換器輸出列為c谷炸,表達式為a+b北专,則c列內(nèi)容就是a+b。但表達式不能寫c=a+b旬陡; Python是強類型語言逗余,輸入的數(shù)據(jù)可能是字符串或數(shù)字,因此必要時需要做類型轉(zhuǎn)換季惩;通過填寫庫路徑录粱,可讓轉(zhuǎn)換器調(diào)用第三方模塊。
- 可在任務(wù)的各個位置拖入多個執(zhí)行器(如【寫入數(shù)據(jù)表】)画拾,它保存的是當(dāng)前狀態(tài)的數(shù)據(jù)啥繁。
- 子任務(wù):任務(wù)可互相調(diào)用,功能非常強大青抛,可用于處理多次跳轉(zhuǎn)旗闽,詳情頁還包含列表的問題,比較復(fù)雜蜜另,需參考相關(guān)文檔适室。
2.幾種模塊的介紹
2.1.轉(zhuǎn)換器
轉(zhuǎn)換器是最為常用的一種類型,當(dāng)然它的使用也是最復(fù)雜的举瑰。
轉(zhuǎn)換器有三種子類型:
- ColumnUDF: 單文檔: 只對一個列有效捣辆,如
提取數(shù)字
, - UDF: 單文檔:如刪除該列,它僅涉及文檔內(nèi)部的修改此迅,可能會影響多個列
- UDAF: 多文檔:典型的如 多文檔模式下從爬蟲轉(zhuǎn)換汽畴,每一行url都可能生成20個甚至更多的文檔旧巾,它的行為cross(交叉)模式下的生成器。
ColumnUDF是UDF的特例忍些, UDF是UDAF的特例(只產(chǎn)生一種)
絕大多數(shù)轉(zhuǎn)換器都是UDF類型鲁猩。但同一個轉(zhuǎn)換器在不同的配置下,可能會有多種行為罢坝,例如從爬蟲轉(zhuǎn)換
廓握,如果選擇的 網(wǎng)頁采集器 為單文檔(單文檔)模式,則該轉(zhuǎn)換器為UDF模式嘁酿,若為 多文檔模式隙券,則為UDAF模式。
- 輸入列: 就是要輸入這個模塊的列痹仙,(Hawk1時代也稱作原列名);
- 輸出列: 則指的是模塊輸出的列是尔。 UDF模式下殉了,如果新列名為空开仰,則新列名等于原列名,直接修改在原始列上薪铜。
2.2.關(guān)于UDAF的必要說明
當(dāng)你使用多文檔模式的爬蟲众弓,或單轉(zhuǎn)多時,雖然生成了多個文檔隔箍,但原始的數(shù)據(jù)(如URL)不見了谓娃。這是因為Hawk丟棄了這些列。
經(jīng)過大量實踐蜒滩,如果不這么做滨达,每個新數(shù)據(jù)后面,都會跟上原始的老數(shù)據(jù)俯艰,如果1轉(zhuǎn)20捡遍,則老數(shù)據(jù)會重復(fù)生成20次,這是沒有必要的竹握。有時不得不拖入大量的刪除該列
來處理画株。
當(dāng)然,有時轉(zhuǎn)換時需要包含原始數(shù)據(jù)的部分列啦辐,則可在轉(zhuǎn)換器的新列名
中填寫要鯉魚跳龍門
的列的名稱谓传,中間用空格分割。
- 在Hawk3中芹关,還支持在新列名中輸入
*
號续挟,此時所有的原始列都會添到新的文檔之中。 - 注意侥衬,UDAF的新列可能會覆蓋掉原始列的數(shù)據(jù)庸推,因此多檢查列名常侦,避免意料之外的覆蓋
轉(zhuǎn)換器有幾種工作模式:
- 多文檔 :生成多條數(shù)據(jù)(文檔)
- 單文檔 : 單文檔
- 不進行轉(zhuǎn)換: 按照原始數(shù)據(jù)返回
2.3.過濾器
過濾器可以在流中贬媒,過濾掉不符合條件的文檔(也就是橫向過濾)聋亡。
- 可勾選
反向
,此時只會留下不符合條件的文檔际乘。即對原始結(jié)果做了取反坡倔。 - 如何對列過濾? 目前Hawk并未提供該功能脖含,可通過拖入多個刪除該列來實現(xiàn)
Hawk3的過濾器還支持幾種不同的行為罪塔,即過濾模式,分別是:
- 按行過濾
- 成功后通過之后的所有行
- 失敗后通過之后所有行
2.4.執(zhí)行器
執(zhí)行器是負責(zé)將Hawk的結(jié)果傳送到外部環(huán)境的工具养葵。
你可以寫入數(shù)據(jù)表征堪,數(shù)據(jù)庫,甚至執(zhí)行某個特定的動作关拒,或是生成文件等等佃蚜。
在調(diào)試模式下,執(zhí)行器都是不工作的着绊。這是為了避免產(chǎn)生副作用谐算。否則,每刷新一遍數(shù)據(jù)归露,就會向數(shù)據(jù)庫中寫入洲脂,這顯然是不可接受的。
只有在運行模式下剧包,才會使執(zhí)行器生效恐锦。
2.5.生成器
顧名思義,生成器就是通過一定的參數(shù)疆液,生成一個文檔列表的組件一铅。生成器通常位于任務(wù)開頭,可從文本枚粘,文件馅闽,數(shù)據(jù)庫讀取數(shù)據(jù)。 或者從一個區(qū)間內(nèi)生成縱向的數(shù)字和時間馍迄。
它與轉(zhuǎn)換器有很多相似之處福也,但是明顯不同:
- 轉(zhuǎn)換器必須有輸入,而生成器不需要攀圈。生成器一般需要輸出列暴凑,來保存其輸出的數(shù)據(jù)。
- 生成器輸出的數(shù)據(jù)可以與原始數(shù)據(jù)進行橫向/縱向/交叉拼接赘来,這遠比轉(zhuǎn)換器靈活
- 生成器的參數(shù)都支持方括號語法现喳,但轉(zhuǎn)換器只有部分支持
當(dāng)生成器生成數(shù)據(jù)后凯傲,如何與原始的數(shù)據(jù)組合呢?有四種模式:
- 按行縱向合并
- 笛卡爾交叉
- 交錯交叉
- 按列橫向合并
拖入的模塊順序是非常重要的嗦篱,一個常見問題是順序不對冰单,導(dǎo)致生成的數(shù)據(jù)不符合預(yù)期。數(shù)據(jù)清洗可通過 從爬蟲轉(zhuǎn)換 來調(diào)用 網(wǎng)頁采集器 灸促,也可以通過子任務(wù)
來調(diào)用其他數(shù)據(jù)清洗诫欠,是組合各種模塊和任務(wù)的工廠。
Hawk的各類模塊中包含大量配置浴栽,其寫法統(tǒng)一總結(jié)如下:
- 具體數(shù)值荒叼,直接填入配置框即可
- 涉及到輸入多個列名,多個分隔符等典鸡,都默認用空格分割被廓,例如
a b c
- 當(dāng)希望從本
數(shù)據(jù)清洗
中讀取其他列的數(shù)據(jù)到本參數(shù),使用方括號表達式萝玷,例如[col]
- 當(dāng)希望從全局配置中讀取特定字段時嫁乘,使用大括號表達式,例如
{YOUR_CONFIG}
- 希望將多個列的數(shù)據(jù)合并作為參數(shù)時间护,可先使用
合并多列
亦渗,再使用對應(yīng)的表達式 - 配置子任務(wù)的模塊范圍時:
1:100
表示從1到100挖诸,2:-2
表示從第2個模塊到倒數(shù)第二個模塊汁尺,可參考Python的slice寫法 - 配置子任務(wù)的字段映射時,可以用
a:b c:d
表示a列映射到b列多律,以此類推痴突。
3.超級拷貝
Hawk3.5增強了對拷貝功能的支持,使得操作更加簡便狼荞。
不論是數(shù)據(jù)表列表辽装,任務(wù),模塊或工作線程列表,都可以使用windows鍵盤快捷鍵shift+鼠標(biāo)來多選相味,或使用ctrl+a全選拾积,選擇后即可執(zhí)行刪除和暫停等操作。
對于最常用的模塊列表丰涉,右鍵即可拷貝當(dāng)前所選的模塊拓巧。已拷貝的模塊支持如下功能:
- 可以直接粘貼到任何文本編輯器中,這在手動編輯xml工程文件時很有用一死。
- 拷貝到本任務(wù)或其他任務(wù)的任一模塊的上側(cè)或下側(cè)
這帶來了顯著的好處肛度,任務(wù)間能夠更方便地共享配置和參數(shù),方便重用投慈。你亦可將配置拷貝到GitHub或其他社群中承耿,方便他人定位問題冠骄。
4.線程管理
不論是調(diào)試還是執(zhí)行模式,系統(tǒng)都會在任務(wù)管理視圖中增加一個或多個線程加袋。
你可以勾選凛辣,或取消勾選部分或全部線程,暫椭吧眨或取消它們蟀给。當(dāng)網(wǎng)站限制抓取時,可以暫停所有線程阳堕,等恢復(fù)后再次執(zhí)行跋理。
右下角分別是暫停,繼續(xù)和刪除任務(wù)恬总。
注意:
- 當(dāng)工作流有誤時(比如該列所有數(shù)據(jù)都空前普,卻在該列添加了 空對象過濾器,那么所有數(shù)據(jù)都會被過濾)可能不會產(chǎn)生任何數(shù)據(jù)輸出壹堰。此時進度條并不會向前推進拭卿,產(chǎn)生卡死的假象。此時可強行將其刪除
- 線程刪除的流程是:先安全將其取消贱纠,如果線程無響應(yīng)峻厚,則會直接將其殺死
4.1.單步調(diào)試
Hawk模仿了播放器和調(diào)試器,在調(diào)試模式下有步
的概念谆焊,例如所在位置是6/20惠桃, 則說明總共有20個模塊,只生效前面6個模塊辖试。 可以通過左右單擊辜王,或直接回退到開頭、末尾來進行調(diào)試罐孝。
左側(cè)顯示了當(dāng)前所有的模塊呐馆,順序和它們的輸入輸出列,雙擊上面的模塊可對其進行配置莲兢,右鍵可刪除汹来。單選列表上的任一模塊t,系統(tǒng)就會只仿真前t步的效果改艇。 本質(zhì)上收班,單步調(diào)試只是提取了工作流的一部分進行操作。 你可以在單步調(diào)試中遣耍,拖入新的模塊闺阱。模塊會自動插入在工作流中間。
有時為了在單步調(diào)試過程中查看模塊的屬性舵变,可勾選界面右下角的調(diào)試詳情
酣溃,此時可直接顯示當(dāng)前模塊的屬性瘦穆。
當(dāng)模塊有正常產(chǎn)出時, 模塊的標(biāo)志會變成藍色赊豌,因此從上到下扛或,第一個不是藍色的模塊,就有可能是有問題的模塊碘饼。
5.運行模式
5.1.調(diào)試模式
在編輯任務(wù)的過程中熙兔,處于調(diào)試模式,它具備如下特點:
- 所有執(zhí)行器都不工作艾恼,避免副作用
- 點擊下方中間的刷新按鈕住涉,或修改配置,展示的數(shù)據(jù)會自動刷新
- 只能運行在串行模式上
- 所見即所得钠绍,只顯示一定數(shù)量的數(shù)據(jù)(通過采樣量修改)
- 可以禁用或啟用某些模塊舆声,觀察效果
- 會加入web請求和讀取文件的緩存, 來提升預(yù)覽速度(可能會導(dǎo)致一些問題)
- 輸入列和輸出列會用不同的顏色進行表示
在調(diào)試時柳爽,從爬蟲轉(zhuǎn)換模塊可能會請求web數(shù)據(jù)媳握,為了提升性能,該模塊對請求做了緩存磷脯。保證數(shù)據(jù)只需獲取一次蛾找,如果想強制刷新數(shù)據(jù),將從爬蟲轉(zhuǎn)換模塊禁用赵誓,再啟用打毛,原始緩存數(shù)據(jù)就會被擦除。
Hawk支持兩種執(zhí)行模式:
5.2.串行模式
只有點擊執(zhí)行時架曹,才會切換到執(zhí)行模式隘冲。執(zhí)行時闹瞧,可工作在串行模式/并行模式
在串行模式下绑雄, 所有任務(wù)串行執(zhí)行,速度慢奥邮,但對網(wǎng)站壓力小万牺,不容易被封鎖。為了進一步降低執(zhí)行速度洽腺,可以設(shè)置延時時間脚粟,此時每次網(wǎng)絡(luò)請求前,都會延時一定時間蘸朋。
注意:
- 當(dāng)執(zhí)行器包含類似"向文件中追加內(nèi)容"的操作時核无,強烈建議使用串行模式,因為Hawk沒有加入多線程鎖藕坯,有可能會導(dǎo)致沖突团南。
- 建議完成爬蟲設(shè)計后噪沙,先進行串行模式,初步觀察是否正確吐根,之后再設(shè)置并行模式大量抓取正歼。
5.3.并行模式
極大地加快了抓取速度,但很容易被封鎖拷橘。 Hawk使用了線程池的機制局义,可以設(shè)置最大工作線程數(shù),只有之前的工作線程完成工作冗疮,才會填入新的任務(wù)萄唇。否則過多的線程會迅速占用所有系統(tǒng)資源。
相比于Hawk2, Hawk3會自動分析可以并行的位置术幔,因此多數(shù)情況下穷绵,直接運行就可以了。但是如果你想自定義并行化的行為特愿,就需要閱讀下面的內(nèi)容仲墨。
5.4.并行化的原理
在調(diào)試模式下,所有獲取都是串行的揍障。而執(zhí)行模式下目养,執(zhí)行器才會執(zhí)行。為了更好地理解并行化毒嫡,強烈建議閱讀下面的內(nèi)容癌蚁。
最簡單的并行化
我們以抓取某個網(wǎng)站的100個頁面為例,第一個模塊生成區(qū)間數(shù)
,可以生成1-100的頁面兜畸,自然地努释,就可以創(chuàng)建100個任務(wù),分別抓取了咬摇。
但是伐蒂,但如果隊首的生成器只生成了很少的元素,每個元素在后期肛鹏,又會轉(zhuǎn)換為大量的元素逸邦,那么這種方法就非常低下了。極端情況下隊首生成器只生成一個元素在扰,則并行化就毫無意義:
改進的并行
一種非常簡單的思路缕减,是將其切成兩個任務(wù),并行在任務(wù)中完成芒珠。
我們將其看成兩個任務(wù)桥狡,第一個任務(wù),負責(zé)產(chǎn)生出一堆種子任務(wù)出來,并加入到任務(wù)隊列裹芝,之后再在這些種子的基礎(chǔ)上呈宇,再分別調(diào)用第第二個任務(wù)。
如何切分任務(wù)局雄?取決于你在任務(wù)中插入的啟動并行
的位置甥啄。這個位置就是切分為兩個任務(wù)的“切割點”。
以大眾點評為例炬搭, 北京有14個區(qū)縣蜈漓,有30種美食類型,如果直接在區(qū)縣后插入并行宫盔,則只有14個子任務(wù)融虽,任務(wù)數(shù)量太少:那么先通過任務(wù)1,獲取420個元素,再以420個元素的基礎(chǔ)上灼芭,插入并行有额,這樣速度就快很多了。你也可以在14個區(qū)縣之后插入并行化彼绷,那么就有14個子任務(wù)巍佑。
反過來,如果每個任務(wù)的工作量太少寄悯,比如只訪問一次網(wǎng)站內(nèi)容萤衰,則這樣的種子創(chuàng)建并行就顯得成本高昂,因此可以填寫分組并行數(shù)量猜旬,比如10脆栋,那么Hawk就會以10個元素為一組,創(chuàng)建任務(wù)洒擦。
Hawk自動分析并行點
Hawk除了手工設(shè)置并行點椿争,還能自動分析并行點,那么并行點是不是越靠后越好呢熟嫩?不是的拷沸,這樣分的太細蔑赘,每個任務(wù)要處理的數(shù)據(jù)特別少:依賴于批量執(zhí)行的模塊會有性能損失: 例如寫入數(shù)據(jù)庫,批量插入100條數(shù)據(jù)速度很快余指,但按條插入就不快了毡熏。
但若盡量靠前,則任務(wù)分得特別粗倦蚪,在斷點續(xù)跑時,任務(wù)需要更多的時間達到相同的位置(這點不夠直觀边苹,可以理解為層級越多陵且,則進行查找所需的步數(shù)越少)
目前Hawk采用了盡量靠后的策略,未來可能會在這方面變得更加智能。