Hawk教程- 常見問(wèn)題

常見問(wèn)題

1.網(wǎng)頁(yè)采集器

1.1.自動(dòng)嗅探失敗

網(wǎng)頁(yè)采集器具備自動(dòng)嗅探功能,本質(zhì)上是替換掉了底層的代理。因此,所有的請(qǐng)求都通過(guò)Hawk內(nèi)部,自然就能根據(jù)需求篩選出所需的請(qǐng)求。

1.2.被封鎖問(wèn)題

被封鎖有幾個(gè)原因:

被網(wǎng)站識(shí)別為非瀏覽器

出現(xiàn)這種情況的原因是請(qǐng)求參數(shù)為空,沒有模擬為瀏覽器(user-agent),如大眾點(diǎn)評(píng)只防此類爬蟲。

最新改進(jìn)的版本中,Hawk默認(rèn)請(qǐng)求參數(shù)已經(jīng)加入了user-agent,因此能解決掉一大部分初級(jí)問(wèn)題。

頻繁訪問(wèn)

這取決于網(wǎng)站如何認(rèn)定是同一個(gè)使用者。

  • 有的網(wǎng)站認(rèn)為同一臺(tái)機(jī)器的不同瀏覽器也是不同的用戶。
  • 有的網(wǎng)站認(rèn)為只要IP相同,則使用者一定相同

對(duì)前一種情況,可以隨機(jī)在一大批User-agent列表中挑選一條,模擬為不同的瀏覽器,就能大大降低被PB的概率。典型的例子如豆瓣。

對(duì)后一種情況,很不幸需要使用真正的代理,或使用分布式方案。免費(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)請(qǐng)求

這是被問(wèn)的最多的問(wèn)題。加載一個(gè)完整的網(wǎng)頁(yè),可能需要幾十次請(qǐng)求,不少請(qǐng)求是ajax和動(dòng)態(tài)的,而不少數(shù)據(jù)都保存在這些請(qǐng)求之中。

最早版本的Hawk內(nèi)置了一個(gè)IE內(nèi)核的瀏覽器,后來(lái)取消了這個(gè)功能。原因很簡(jiǎn)單:

  • 內(nèi)置瀏覽器,導(dǎo)致過(guò)分復(fù)雜
  • 無(wú)法多線程抓取
  • 大量無(wú)用的請(qǐng)求,導(dǎo)致抓取速度變慢
  • 即使內(nèi)置瀏覽器,也不見得能抓取所有動(dòng)態(tài)請(qǐng)求

因此,純HttpClient能夠精確并只抓取你想要的內(nèi)容,只要正確構(gòu)造它即可。
如何使用?你需要配置一個(gè)網(wǎng)頁(yè)采集器。
將它的行為,模擬到和瀏覽器一致。

第一種方法,查看瀏覽器的請(qǐng)求,參考 ,將Http請(qǐng)求詳情復(fù)制過(guò)來(lái),注意選擇GET和POST。

之后,將嗅探到的地址拷貝到網(wǎng)頁(yè)采集器的URL輸入框中,查看是否能正確獲取內(nèi)容。
如果是POST請(qǐng)求,就更復(fù)雜一些。在數(shù)據(jù)清洗模塊中,網(wǎng)頁(yè)采集器拖入的列需要是對(duì)應(yīng)的URL,你還需要構(gòu)造出每次訪問(wèn)的post數(shù)據(jù),單獨(dú)作為一列。在網(wǎng)頁(yè)采集器中如下配置:

注意列名需要用方括號(hào)括起來(lái),否則每次POST數(shù)據(jù)都會(huì)是所填的數(shù)據(jù)。

1.4.驗(yàn)證碼問(wèn)題

這也是問(wèn)的非常多的問(wèn)題,很不幸,不支持。驗(yàn)證碼各種各樣,簡(jiǎn)單到純數(shù)字,復(fù)雜到12306,圖像轉(zhuǎn)文本涉及到太多的不確定因素。

解決方案也有,一些網(wǎng)站提供識(shí)別驗(yàn)證碼的接口API,因此你可以讓Hawk去模擬網(wǎng)站的API,將圖片地址傳遞過(guò)去,API會(huì)自動(dòng)返回驗(yàn)證碼。壞消息是這個(gè)一般需要收費(fèi)。
不過(guò),能配置Hawk去做這樣的請(qǐng)求的人,一定也能夠?qū)慞ython了,算了,他還是去寫Python吧,別跳Hawk這個(gè)坑了。

1.5.Path搜索相關(guān)問(wèn)題

網(wǎng)頁(yè)采集器中,填寫關(guān)鍵字,卻發(fā)現(xiàn)無(wú)法找到XPath。
可能的原因:

網(wǎng)頁(yè)是動(dòng)態(tài)網(wǎng)頁(yè)

因此本鏈接不包含該關(guān)鍵字,建議考慮使用嗅探方案

關(guān)鍵字太長(zhǎng)

是文本中包含不可見字符時(shí)經(jīng)常出現(xiàn)。例如 340[制表符]萬(wàn),但用戶可能會(huì)直接輸入340萬(wàn)。Hawk搜索是按照嚴(yán)格字符串匹配的,就會(huì)匹配不成功,因此輸入短一些,如340

和 Chrome等瀏覽器得到的XPath不同

一方面,XPath的表示方法有很多種,這和正則類似??赡芸雌饋?lái)不一樣的XPath指代的都是同一個(gè)節(jié)點(diǎn)。
另一方面,Chrome會(huì)執(zhí)行js代碼,而js可能會(huì)改變網(wǎng)頁(yè)的結(jié)構(gòu),因此XPath也就對(duì)應(yīng)地發(fā)生變化了。這會(huì)通常會(huì)導(dǎo)致從Chrome拷貝出來(lái)的XPath在Hawk中不能使用。
Hawk未來(lái)不會(huì)考慮支持加入執(zhí)行js代碼的功能,因此,如果搜索XPath,還請(qǐng)以Hawk得到的結(jié)果為準(zhǔn)。多搜多看,通常就能建立感覺。

1.6.手氣不錯(cuò)的問(wèn)題

很多人使用手氣不錯(cuò)會(huì)失敗。這是因?yàn)椋?/p>

不是所有的網(wǎng)頁(yè)都支持直接點(diǎn)擊【手氣不錯(cuò)】

手氣不錯(cuò)需要特定的網(wǎng)頁(yè)結(jié)構(gòu)(列表),如果整個(gè)網(wǎng)頁(yè)沒有顯著的列表節(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è)例子,北京上海的二手房頁(yè)面,上海會(huì)在列表上面增加一個(gè)廣告banner,從而真正的父節(jié)點(diǎn)就會(huì)發(fā)生變化。為了應(yīng)對(duì)這種變化,通常的做法是手工修改【父節(jié)點(diǎn)XPath】,繼續(xù)舉例子,父節(jié)點(diǎn)的id為house_list,且在網(wǎng)頁(yè)中全局唯一,你就可以使用另外一種父節(jié)點(diǎn)表示法//*[@id='house_list'](寫法可以參考其他XPath教程),而子節(jié)點(diǎn)表達(dá)式不變。
    Hawk在【手氣不錯(cuò)】得到【確定】后,會(huì)詢問(wèn)是否提取父節(jié)點(diǎn)XPath,此時(shí)Hawk會(huì)自動(dòng)提取【父節(jié)點(diǎn)XPath】到屬性對(duì)話框中,從而方便修改。

1.7.獲得的頁(yè)面與瀏覽器上不一樣?

這非常常見,考慮到速度,Hawk不會(huì)動(dòng)態(tài)執(zhí)行js請(qǐng)求。而瀏覽器會(huì)大量執(zhí)行js加載圖片等,獲得的源碼可能有所不同,更不用說(shuō)搜索得到的XPath了。但這樣能獲得百倍于瀏覽器的執(zhí)行速度,因此這個(gè)缺點(diǎn)是值得的。

那如何抓取動(dòng)態(tài)頁(yè)面呢?對(duì)于這種情況,參考動(dòng)態(tài)嗅探章節(jié)。

即使是同樣的頁(yè)面,用Hawk得到的XPATH與瀏覽器不一致,為什么呢?

一方面,XPath的表示方法有很多種,這和正則類似。可能看起來(lái)不一樣的XPath指代的都是同一個(gè)節(jié)點(diǎn)。另一方面,Chrome會(huì)執(zhí)行js代碼,而js可能會(huì)改變網(wǎng)頁(yè)的結(jié)構(gòu),因此XPath也就對(duì)應(yīng)地發(fā)生變化了。這有可能會(huì)導(dǎo)致從Chrome拷貝出來(lái)的XPath在Hawk中不能使用。

Hawk未來(lái)不會(huì)考慮支持加入執(zhí)行js代碼的功能,因此,如果搜索XPath,還請(qǐng)以Hawk得到的結(jié)果為準(zhǔn)。多搜多看,通常就能建立感覺。

1.8.一個(gè)網(wǎng)站要設(shè)置好多個(gè)頁(yè)面,配置太繁瑣!

可在系統(tǒng)狀態(tài)視圖中,將網(wǎng)頁(yè)采集器拖到下面的復(fù)制圖標(biāo)上,即可復(fù)制多個(gè)采集器。這樣可一定程度上簡(jiǎn)化操作。

當(dāng)一組采集器需要同一組請(qǐng)求參數(shù)時(shí),可設(shè)置共享源自動(dòng)同步,參考3.2采集器高級(jí)用法的最后一節(jié)。

2.數(shù)據(jù)清洗

2.1.拖入從爬蟲轉(zhuǎn)換后沒有任何數(shù)據(jù)。

從爬蟲轉(zhuǎn)換實(shí)際上搭建了采集器與數(shù)據(jù)清洗的橋梁,它要選擇對(duì)應(yīng)的網(wǎng)頁(yè)采集器才行,

2.2.拖入從爬蟲轉(zhuǎn)換后,數(shù)據(jù)有了,但之前的列消失了

參考 4.3轉(zhuǎn)換器UDAF的特別說(shuō)明.

3.編譯與運(yùn)行問(wèn)題

雖然在GitHub上是最新的代碼,最新代碼是可以成功編譯的。但不能保證用戶是否clone的是早期版本的代碼,因此此處羅列可能的編譯錯(cuò)誤。

3.1.編譯問(wèn)題

  1. 從GitHub上拉回來(lái)的代碼,默認(rèn)啟動(dòng)路徑是Hawk.Core,這導(dǎo)致編譯成功,但運(yùn)行時(shí)提示“無(wú)法直接啟動(dòng)帶有類庫(kù)輸出類型的項(xiàng)目”: 將Hawk設(shè)置為解決方案的啟動(dòng)項(xiàng)目,參考這里:https://jingyan.baidu.com/article/4e5b3e1934c2fc91901e2426.html
  1. 因?yàn)楣こ?code>Hawk.csproj包含的兩個(gè)圖片文件不存在導(dǎo)致,在這些文件圖標(biāo)上點(diǎn)擊右鍵,選擇'排除出項(xiàng)目',即可正常編譯。

  2. 找不到項(xiàng)目System.Windows.???.WPFPropertyGrid.csproj項(xiàng)目,有兩種方法,一種是從作者的GitHub上clone對(duì)應(yīng)的項(xiàng)目,并添加項(xiàng)目引用,另外一種做法是,刪除項(xiàng)目引用,添加外部dll引用,所有的外部dll,都能在Include文件夾中找到。

  3. 大量的庫(kù)找不到,幾百個(gè)報(bào)錯(cuò):

Hawk編譯用了不少第三方類庫(kù),因此需要配置nuget,它是微軟技術(shù)棧的pip,能自動(dòng)安裝所需的依賴,配置可參考這里:

https://docs.nuget.org/

3.2.啟動(dòng)后軟件只有外邊框,沒有其他任何顯示

老版本的Hawk(小于1.2)在Win7和Win8下的兼容性不佳,請(qǐng)升級(jí)最新版本的Hawk.

3.3.不小心關(guān)掉了某個(gè)側(cè)邊欄

Hawk采用了Visual Stuido風(fēng)格的Dock系統(tǒng),所有的布局都可以調(diào)節(jié)大小,設(shè)定位置,常見的錯(cuò)誤是,不小心關(guān)閉了某個(gè)面板。如何恢復(fù)呢? 對(duì)于任務(wù)的窗口,雙擊任務(wù)應(yīng)該就能恢復(fù),如果是日志邊欄,不好意思,恢復(fù)不了,重啟軟件吧。

4.宏觀問(wèn)題

和具體使用無(wú)關(guān),主要涉及對(duì)一些吐槽的回答

4.1.為什么只支持Windows?

筆者曾是微軟技術(shù)棧的粉絲,因此C#,WPF成了設(shè)計(jì)首選,如今雖然技術(shù)棧大大擴(kuò)展,但用Js或其他語(yǔ)言重寫成本太高,因此依然只提供Windows版本。 雖然筆者平時(shí)也只用MAC了...

4.2.為什么不提供更強(qiáng)的代理?

爬蟲是一種灰色的應(yīng)用,雖然作為Hawk的設(shè)計(jì)者,但我依然不得不這么說(shuō)。

各大網(wǎng)站都在收集和整理數(shù)據(jù)上花費(fèi)了大量的精力,因此抓取的數(shù)據(jù)應(yīng)當(dāng)僅僅作為科學(xué)研究使用。作者對(duì)Hawk的使用者的行為,不承擔(dān)任何連帶責(zé)任。

建議您理性使用爬蟲,在不影響網(wǎng)站正常運(yùn)營(yíng)的情況下抓取數(shù)據(jù)。Hawk的好處是,較大地降低了爬蟲的開發(fā)成本,能讓普通用戶也能使用。在這一理念下,我們僅僅提供最為實(shí)用的功能,而更多高級(jí)的功能則不會(huì)提供。比如代理切換和驗(yàn)證碼識(shí)別。

在并行模式下,僅提供單機(jī)并行,而分布式并行也不會(huì)提供。盡管如此,我們還是會(huì)簡(jiǎn)單討論如何驗(yàn)證碼識(shí)別,代理和并行的問(wèn)題。

代理實(shí)現(xiàn)并不復(fù)雜,在代碼層面上只需要幾行代碼。但基于之前提過(guò)的原因,開源版本不提供代理的支持。

4.3.驗(yàn)證碼識(shí)別?

驗(yàn)證碼識(shí)別確實(shí)有難度,因?yàn)楦鞔缶W(wǎng)站都不相同,簡(jiǎn)單的如普通四位數(shù)字驗(yàn)證碼,難的如12306的變態(tài)驗(yàn)證碼。因此提供通用的識(shí)別幾乎是不可能的。

如果您愿意付費(fèi),并使用第三方的圖形驗(yàn)證碼服務(wù),則可以將其配置為一個(gè)網(wǎng)頁(yè)采集器,再調(diào)用之。

4.4.為什么只支持MongoDB和Sqlite?

Hawk在設(shè)計(jì)之初,就是以弱schema風(fēng)格定義的。沒有嚴(yán)格的列名和列屬性。用C#這樣的靜態(tài)強(qiáng)類型語(yǔ)言編寫Hawk,其實(shí)并不方便。但弱schema讓Hawk變得更靈活更強(qiáng)大。

因此,Hawk雖然之前支持各種數(shù)據(jù)庫(kù)連接器,而目前只支持MongoDB這樣的文檔型數(shù)據(jù)庫(kù)。之所以不支持傳統(tǒng)SQL,是因?yàn)楂@取的數(shù)據(jù)可能并不滿足這些SQL數(shù)據(jù)庫(kù)的約束:如列的順序,列的字段類型,是否為空...很容易導(dǎo)致插入失敗。使用Hawk的一般不是程序員,我不想給普通人挖這樣的坑。

當(dāng)然,從各類SQL數(shù)據(jù)庫(kù)中讀入數(shù)據(jù)也是可以的,但既然沒有提供寫入,我們也就索性不提供讀入了。需要的話,你可以自己擴(kuò)展其他數(shù)據(jù)庫(kù)連接器。

不過(guò),簡(jiǎn)單的才是最好的,以作者的經(jīng)驗(yàn),使用MongoDB這樣的數(shù)據(jù)庫(kù)來(lái)應(yīng)對(duì)爬蟲已經(jīng)足夠了:不需事先建表,高性能,低成本,低維護(hù)。我們也不可能一次性就把數(shù)據(jù)規(guī)約成你想要的形式,之后完全可以用其他工具和代碼,再將MongoDB的數(shù)據(jù)導(dǎo)出來(lái),寫入到目標(biāo)數(shù)據(jù)庫(kù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 上網(wǎng)原理 1、爬蟲概念 爬蟲是什麼? 蜘蛛,蛆,代碼中,就是寫了一段代碼,代碼的功能從互聯(lián)網(wǎng)中提取數(shù)據(jù) 互聯(lián)網(wǎng): ...
    riverstation閱讀 8,621評(píng)論 1 2
  • HTTP基本原理 URI、URL、URN(Uninform Resource) URI(Identifier):統(tǒng)...
    GHope閱讀 2,280評(píng)論 2 26
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,802評(píng)論 1 45
  • 爬蟲概述 1. 目錄清單 爬蟲簡(jiǎn)介 通用爬蟲和聚焦爬蟲 網(wǎng)絡(luò)請(qǐng)求那些事兒 網(wǎng)絡(luò)數(shù)據(jù)抓包分析 2. 章節(jié)內(nèi)容 2.1...
    小皇帝s閱讀 732評(píng)論 0 1
  • 今天是什么日子 任務(wù)清單 周目標(biāo)·完成進(jìn)度 學(xué)習(xí)·信息·閱讀 健康·飲食·鍛煉 人際·家人·朋友 今晚,同事們狠狠...
    朋友zcl閱讀 189評(píng)論 0 2

友情鏈接更多精彩內(nèi)容