- GitHub文檔鏡像
- 歡迎使用Hawk
- 快速教程
- 主要組件介紹
- 核心功能:
- [模塊和算子]
- 常見問題
- 更新日志作者和捐贈(zèng)列表
- 專題:
- 案例:
- 發(fā)布文章:
- 故事:
常見問題
1.網(wǎng)頁采集器
1.1.自動(dòng)嗅探失敗
網(wǎng)頁采集器具備自動(dòng)嗅探功能驰贷,本質(zhì)上是替換掉了底層的代理乾蓬。因此崎岂,所有的請求都通過Hawk內(nèi)部瘫辩,自然就能根據(jù)需求篩選出所需的請求。
1.2.被封鎖問題
被封鎖有幾個(gè)原因:
被網(wǎng)站識別為非瀏覽器
出現(xiàn)這種情況的原因是請求參數(shù)為空府喳,沒有模擬為瀏覽器(user-agent)针姿,如大眾點(diǎn)評只防此類爬蟲。
最新改進(jìn)的版本中相恃,Hawk默認(rèn)請求參數(shù)已經(jīng)加入了user-agent,因此能解決掉一大部分初級問題辜纲。
頻繁訪問
這取決于網(wǎng)站如何認(rèn)定是同一個(gè)使用者。
- 有的網(wǎng)站認(rèn)為同一臺機(jī)器的不同瀏覽器也是不同的用戶拦耐。
- 有的網(wǎng)站認(rèn)為只要IP相同耕腾,則使用者一定相同
對前一種情況,可以隨機(jī)在一大批User-agent列表中挑選一條杀糯,模擬為不同的瀏覽器扫俺,就能大大降低被PB的概率。典型的例子如豆瓣固翰。
對后一種情況狼纬,很不幸需要使用真正的代理,或使用分布式方案骂际。免費(fèi)代理通常都不穩(wěn)定疗琉,而付費(fèi)代理則需要付費(fèi),很少有人愿意為了爬蟲付錢(一臉黑線)歉铝。
因此盈简,Hawk會(huì)考慮提供第一種情況的解決方案,但不會(huì)自動(dòng)開啟太示,而是在用戶需要的時(shí)候手工開啟送火。
而自動(dòng)代理切換,目前Hawk不會(huì)提供支持先匪。原因更多考慮的是技術(shù)之外的因素种吸。
1.3.抓取動(dòng)態(tài)請求
這是被問的最多的問題。加載一個(gè)完整的網(wǎng)頁呀非,可能需要幾十次請求坚俗,不少請求是ajax和動(dòng)態(tài)的,而不少數(shù)據(jù)都保存在這些請求之中岸裙。
最早版本的Hawk內(nèi)置了一個(gè)IE內(nèi)核的瀏覽器猖败,后來取消了這個(gè)功能。原因很簡單:
- 內(nèi)置瀏覽器降允,導(dǎo)致過分復(fù)雜
- 無法多線程抓取
- 大量無用的請求恩闻,導(dǎo)致抓取速度變慢
- 即使內(nèi)置瀏覽器,也不見得能抓取所有動(dòng)態(tài)請求
因此剧董,純HttpClient能夠精確并只抓取你想要的內(nèi)容幢尚,只要正確構(gòu)造它即可破停。
如何使用?你需要配置一個(gè)網(wǎng)頁采集器尉剩。
將它的行為真慢,模擬到和瀏覽器一致。
第一種方法理茎,查看瀏覽器的請求黑界,參考 ,將Http請求詳情復(fù)制過來皂林,注意選擇GET和POST朗鸠。
之后,將嗅探到的地址拷貝到網(wǎng)頁采集器的URL輸入框中础倍,查看是否能正確獲取內(nèi)容烛占。
如果是POST請求,就更復(fù)雜一些著隆。在數(shù)據(jù)清洗模塊中扰楼,網(wǎng)頁采集器拖入的列需要是對應(yīng)的URL,你還需要構(gòu)造出每次訪問的post數(shù)據(jù)美浦,單獨(dú)作為一列弦赖。在網(wǎng)頁采集器中如下配置:
注意列名需要用方括號括起來,否則每次POST數(shù)據(jù)都會(huì)是所填的數(shù)據(jù)浦辨。
1.4.驗(yàn)證碼問題
這也是問的非常多的問題蹬竖,很不幸,不支持流酬。驗(yàn)證碼各種各樣币厕,簡單到純數(shù)字,復(fù)雜到12306芽腾,圖像轉(zhuǎn)文本涉及到太多的不確定因素旦装。
解決方案也有,一些網(wǎng)站提供識別驗(yàn)證碼的接口API摊滔,因此你可以讓Hawk去模擬網(wǎng)站的API阴绢,將圖片地址傳遞過去,API會(huì)自動(dòng)返回驗(yàn)證碼艰躺。壞消息是這個(gè)一般需要收費(fèi)呻袭。
不過,能配置Hawk去做這樣的請求的人腺兴,一定也能夠?qū)慞ython了左电,算了,他還是去寫Python吧,別跳Hawk這個(gè)坑了篓足。
1.5.Path搜索相關(guān)問題
網(wǎng)頁采集器中段誊,填寫關(guān)鍵字,卻發(fā)現(xiàn)無法找到XPath纷纫。
可能的原因:
網(wǎng)頁是動(dòng)態(tài)網(wǎng)頁
因此本鏈接不包含該關(guān)鍵字枕扫,建議考慮使用嗅探方案
關(guān)鍵字太長
是文本中包含不可見字符時(shí)經(jīng)常出現(xiàn)陪腌。例如 340[制表符]萬辱魁,但用戶可能會(huì)直接輸入340萬。Hawk搜索是按照嚴(yán)格字符串匹配的诗鸭,就會(huì)匹配不成功染簇,因此輸入短一些,如340
和 Chrome等瀏覽器得到的XPath不同
一方面强岸,XPath的表示方法有很多種锻弓,這和正則類似◎蚬浚可能看起來不一樣的XPath指代的都是同一個(gè)節(jié)點(diǎn)青灼。
另一方面,Chrome會(huì)執(zhí)行js代碼妓盲,而js可能會(huì)改變網(wǎng)頁的結(jié)構(gòu)杂拨,因此XPath也就對應(yīng)地發(fā)生變化了。這會(huì)通常會(huì)導(dǎo)致從Chrome拷貝出來的XPath在Hawk中不能使用悯衬。
Hawk未來不會(huì)考慮支持加入執(zhí)行js代碼的功能弹沽,因此,如果搜索XPath筋粗,還請以Hawk得到的結(jié)果為準(zhǔn)策橘。多搜多看,通常就能建立感覺娜亿。
1.6.手氣不錯(cuò)的問題
很多人使用手氣不錯(cuò)會(huì)失敗丽已。這是因?yàn)椋?/p>
不是所有的網(wǎng)頁都支持直接點(diǎn)擊【手氣不錯(cuò)】
手氣不錯(cuò)需要特定的網(wǎng)頁結(jié)構(gòu)(列表),如果整個(gè)網(wǎng)頁沒有顯著的列表節(jié)點(diǎn)买决,則搜索失敗沛婴,此時(shí)就會(huì)提示 手氣不錯(cuò)失敗。
手氣不錯(cuò)會(huì)自動(dòng)規(guī)約父節(jié)點(diǎn)
使用手氣不錯(cuò)后策州,嗅探器會(huì)找到列表節(jié)點(diǎn)的父節(jié)點(diǎn)瘸味,以及掛載在父節(jié)點(diǎn)上的多個(gè)子節(jié)點(diǎn),從而形成一個(gè)樹狀結(jié)構(gòu):
- 父節(jié)點(diǎn)(/html/div[2]/div[3]/div[4])
- 子節(jié)點(diǎn)1(/a[1])
- 子節(jié)點(diǎn)2(/a[2]/@href)
- 其他省略 有時(shí)候够挂,父節(jié)點(diǎn)的xpath是不穩(wěn)定的旁仿,舉個(gè)例子,北京上海的二手房頁面,上海會(huì)在列表上面增加一個(gè)廣告banner枯冈,從而真正的父節(jié)點(diǎn)就會(huì)發(fā)生變化毅贮。為了應(yīng)對這種變化,通常的做法是手工修改【父節(jié)點(diǎn)XPath】尘奏,繼續(xù)舉例子滩褥,父節(jié)點(diǎn)的id為
house_list
,且在網(wǎng)頁中全局唯一炫加,你就可以使用另外一種父節(jié)點(diǎn)表示法//*[@id='house_list']
(寫法可以參考其他XPath教程)瑰煎,而子節(jié)點(diǎn)表達(dá)式不變。
Hawk在【手氣不錯(cuò)】得到【確定】后俗孝,會(huì)詢問是否提取父節(jié)點(diǎn)XPath酒甸,此時(shí)Hawk會(huì)自動(dòng)提取【父節(jié)點(diǎn)XPath】到屬性對話框中,從而方便修改赋铝。
1.7.獲得的頁面與瀏覽器上不一樣插勤?
這非常常見,考慮到速度革骨,Hawk不會(huì)動(dòng)態(tài)執(zhí)行js請求农尖。而瀏覽器會(huì)大量執(zhí)行js加載圖片等,獲得的源碼可能有所不同良哲,更不用說搜索得到的XPath了盛卡。但這樣能獲得百倍于瀏覽器的執(zhí)行速度,因此這個(gè)缺點(diǎn)是值得的臂外。
那如何抓取動(dòng)態(tài)頁面呢窟扑?對于這種情況,參考動(dòng)態(tài)嗅探章節(jié)漏健。
即使是同樣的頁面嚎货,用Hawk得到的XPATH與瀏覽器不一致,為什么呢蔫浆?
一方面殖属,XPath的表示方法有很多種,這和正則類似瓦盛∠聪裕可能看起來不一樣的XPath指代的都是同一個(gè)節(jié)點(diǎn)。另一方面原环,Chrome會(huì)執(zhí)行js代碼挠唆,而js可能會(huì)改變網(wǎng)頁的結(jié)構(gòu),因此XPath也就對應(yīng)地發(fā)生變化了嘱吗。這有可能會(huì)導(dǎo)致從Chrome拷貝出來的XPath在Hawk中不能使用玄组。
Hawk未來不會(huì)考慮支持加入執(zhí)行js代碼的功能,因此,如果搜索XPath俄讹,還請以Hawk得到的結(jié)果為準(zhǔn)哆致。多搜多看,通常就能建立感覺患膛。
1.8.一個(gè)網(wǎng)站要設(shè)置好多個(gè)頁面摊阀,配置太繁瑣!
可在系統(tǒng)狀態(tài)視圖
中踪蹬,將網(wǎng)頁采集器拖到下面的復(fù)制
圖標(biāo)上胞此,即可復(fù)制多個(gè)采集器。這樣可一定程度上簡化操作延曙。
當(dāng)一組采集器需要同一組請求參數(shù)時(shí)豌鹤,可設(shè)置共享源
自動(dòng)同步亡哄,參考3.2采集器高級用法
的最后一節(jié)枝缔。
2.數(shù)據(jù)清洗
2.1.拖入從爬蟲轉(zhuǎn)換
后沒有任何數(shù)據(jù)。
從爬蟲轉(zhuǎn)換
實(shí)際上搭建了采集器與數(shù)據(jù)清洗的橋梁蚊惯,它要選擇對應(yīng)的網(wǎng)頁采集器才行愿卸,
2.2.拖入從爬蟲轉(zhuǎn)換
后,數(shù)據(jù)有了截型,但之前的列消失了
參考 4.3轉(zhuǎn)換器
中UDAF的特別說明
.
3.編譯與運(yùn)行問題
雖然在GitHub上是最新的代碼趴荸,最新代碼是可以成功編譯的。但不能保證用戶是否clone的是早期版本的代碼宦焦,因此此處羅列可能的編譯錯(cuò)誤发钝。
3.1.編譯問題
- 從GitHub上拉回來的代碼,默認(rèn)啟動(dòng)路徑是
Hawk.Core
波闹,這導(dǎo)致編譯成功酝豪,但運(yùn)行時(shí)提示“無法直接啟動(dòng)帶有類庫輸出類型的項(xiàng)目”: 將Hawk設(shè)置為解決方案的啟動(dòng)項(xiàng)目,參考這里:https://jingyan.baidu.com/article/4e5b3e1934c2fc91901e2426.html
因?yàn)楣こ?code>Hawk.csproj包含的兩個(gè)圖片文件不存在導(dǎo)致精堕,在這些文件圖標(biāo)上點(diǎn)擊右鍵孵淘,選擇'排除出項(xiàng)目',即可正常編譯歹篓。
找不到項(xiàng)目
System.Windows.???.WPFPropertyGrid.csproj
項(xiàng)目瘫证,有兩種方法,一種是從作者的GitHub上clone對應(yīng)的項(xiàng)目庄撮,并添加項(xiàng)目引用背捌,另外一種做法是,刪除項(xiàng)目引用洞斯,添加外部dll引用毡庆,所有的外部dll,都能在Include文件夾中找到。大量的庫找不到扭仁,幾百個(gè)報(bào)錯(cuò):
Hawk編譯用了不少第三方類庫垮衷,因此需要配置nuget,它是微軟技術(shù)棧的pip乖坠,能自動(dòng)安裝所需的依賴搀突,配置可參考這里:
3.2.啟動(dòng)后軟件只有外邊框,沒有其他任何顯示
老版本的Hawk(小于1.2)在Win7和Win8下的兼容性不佳熊泵,請升級最新版本的Hawk.
3.3.不小心關(guān)掉了某個(gè)側(cè)邊欄
Hawk采用了Visual Stuido風(fēng)格的Dock系統(tǒng)仰迁,所有的布局都可以調(diào)節(jié)大小,設(shè)定位置顽分,常見的錯(cuò)誤是徐许,不小心關(guān)閉了某個(gè)面板。如何恢復(fù)呢卒蘸? 對于任務(wù)的窗口雌隅,雙擊任務(wù)應(yīng)該就能恢復(fù),如果是日志邊欄缸沃,不好意思恰起,恢復(fù)不了,重啟軟件吧趾牧。
4.宏觀問題
和具體使用無關(guān)检盼,主要涉及對一些吐槽的回答
4.1.為什么只支持Windows?
筆者曾是微軟技術(shù)棧的粉絲翘单,因此C#,WPF成了設(shè)計(jì)首選吨枉,如今雖然技術(shù)棧大大擴(kuò)展,但用Js或其他語言重寫成本太高哄芜,因此依然只提供Windows版本貌亭。 雖然筆者平時(shí)也只用MAC了...
4.2.為什么不提供更強(qiáng)的代理?
爬蟲是一種灰色的應(yīng)用忠烛,雖然作為Hawk的設(shè)計(jì)者属提,但我依然不得不這么說。
各大網(wǎng)站都在收集和整理數(shù)據(jù)上花費(fèi)了大量的精力美尸,因此抓取的數(shù)據(jù)應(yīng)當(dāng)僅僅作為科學(xué)研究使用冤议。作者對Hawk的使用者的行為,不承擔(dān)任何連帶責(zé)任师坎。
建議您理性使用爬蟲恕酸,在不影響網(wǎng)站正常運(yùn)營的情況下抓取數(shù)據(jù)。Hawk的好處是胯陋,較大地降低了爬蟲的開發(fā)成本蕊温,能讓普通用戶也能使用袱箱。在這一理念下,我們僅僅提供最為實(shí)用的功能义矛,而更多高級的功能則不會(huì)提供发笔。比如代理切換和驗(yàn)證碼識別。
在并行模式下凉翻,僅提供單機(jī)并行了讨,而分布式并行也不會(huì)提供。盡管如此制轰,我們還是會(huì)簡單討論如何驗(yàn)證碼識別,代理和并行的問題前计。
代理實(shí)現(xiàn)并不復(fù)雜,在代碼層面上只需要幾行代碼垃杖。但基于之前提過的原因男杈,開源版本不提供代理的支持。
4.3.驗(yàn)證碼識別调俘?
驗(yàn)證碼識別確實(shí)有難度伶棒,因?yàn)楦鞔缶W(wǎng)站都不相同,簡單的如普通四位數(shù)字驗(yàn)證碼脉漏,難的如12306的變態(tài)驗(yàn)證碼苞冯。因此提供通用的識別幾乎是不可能的。
如果您愿意付費(fèi)侧巨,并使用第三方的圖形驗(yàn)證碼服務(wù),則可以將其配置為一個(gè)網(wǎng)頁采集器鞭达,再調(diào)用之司忱。
4.4.為什么只支持MongoDB和Sqlite?
Hawk在設(shè)計(jì)之初,就是以弱schema風(fēng)格定義的畴蹭。沒有嚴(yán)格的列名和列屬性坦仍。用C#這樣的靜態(tài)強(qiáng)類型語言編寫Hawk,其實(shí)并不方便叨襟。但弱schema讓Hawk變得更靈活更強(qiáng)大繁扎。
因此,Hawk雖然之前支持各種數(shù)據(jù)庫連接器糊闽,而目前只支持MongoDB這樣的文檔型數(shù)據(jù)庫梳玫。之所以不支持傳統(tǒng)SQL,是因?yàn)楂@取的數(shù)據(jù)可能并不滿足這些SQL數(shù)據(jù)庫的約束:如列的順序右犹,列的字段類型提澎,是否為空...很容易導(dǎo)致插入失敗。使用Hawk的一般不是程序員念链,我不想給普通人挖這樣的坑盼忌。
當(dāng)然积糯,從各類SQL數(shù)據(jù)庫中讀入數(shù)據(jù)也是可以的,但既然沒有提供寫入谦纱,我們也就索性不提供讀入了嘉栓。需要的話,你可以自己擴(kuò)展其他數(shù)據(jù)庫連接器究履。
不過唯绍,簡單的才是最好的,以作者的經(jīng)驗(yàn)偿荷,使用MongoDB這樣的數(shù)據(jù)庫來應(yīng)對爬蟲已經(jīng)足夠了:不需事先建表窘游,高性能,低成本跳纳,低維護(hù)忍饰。我們也不可能一次性就把數(shù)據(jù)規(guī)約成你想要的形式,之后完全可以用其他工具和代碼寺庄,再將MongoDB的數(shù)據(jù)導(dǎo)出來艾蓝,寫入到目標(biāo)數(shù)據(jù)庫。