Hawk使用補充說明



軟件在發布后,收到了各方朋友的反饋和提問。此處統一對一部分問題作出回復。

感謝你使用Hawk,軟件是我寫的,坑是我挖的。做爬蟲本來就比較復雜,一些公司有專門的程序員做爬蟲工程師。因此如果你很沮喪,很有可能是網站做了不少策略,確實很難爬。哎,這也是沒有辦法的事情。
閑話不說,進入正題。

1.自動嗅探失敗

網頁采集器具備自動嗅探功能,本質上是替換掉了底層的代理。因此,所有的請求都通過Hawk內部,自然就能根據需求篩選出所需的請求。

但有些系統中安裝了類似360等工具,會拒絕這類操作。導致嗅探失敗。目前原因還沒有找到。一些網站做了加密,因此即使輸入檢索字段,內容也不一定能檢索得到。

即使嗅探失敗也沒有關系,如果你使用Chrome等瀏覽器,進入開發者工具(F12):
image_1ao1q9le113a01mn4scu1q22g7mm.png-118.2kB

選擇最上角的network卷展欄,之后刷新網頁,chrome會列出所有的請求,一般最上面的就是真實請求:
image_1ao1qf5fo1geqsf13be1mpi1lia9.png-68.5kB
點擊view source,將所有文本,拷貝到網頁采集器,對應的高級設置-請求參數里即可。其實,Hawk做的也是類似的操作。

2.被封鎖問題

被封鎖有幾個原因:

2.1 被網站識別為非瀏覽器

出現這種情況的原因是請求參數為空,沒有模擬為瀏覽器(user-agent),如大眾點評只防此類爬蟲。

最新改進的版本中,Hawk默認請求參數已經加入了user-agent,因此能解決掉一大部分初級問題。

2.2 頻繁訪問

這取決於網站如何認定是同一個使用者。

  • 有的網站認為同一台機器的不同瀏覽器也是不同的用戶。
  • 有的網站認為只要IP相同,則使用者一定相同

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

對后一種情況,很不幸需要使用真正的代理,或使用分布式方案。免費代理通常都不穩定,而付費代理則需要付費,很少有人願意為了爬蟲付錢(一臉黑線)。

因此,Hawk會考慮提供第一種情況的解決方案,但不會自動開啟,而是在用戶需要的時候手工開啟。

而自動代理切換,目前Hawk不會提供支持。原因更多考慮的是技術之外的因素。

3.抓取動態請求

這是被問的最多的問題。加載一個完整的網頁,可能需要幾十次請求,不少請求是ajax和動態的,而不少數據都保存在這些請求之中。

最早版本的Hawk內置了一個IE內核的瀏覽器,后來取消了這個功能。原因很簡單:

  • 內置瀏覽器,導致過分復雜
  • 無法多線程抓取
  • 大量無用的請求,導致抓取速度變慢
  • 即使內置瀏覽器,也不見得能抓取所有動態請求

因此,純HttpClient能夠精確並只抓取你想要的內容,只要正確構造它即可。
如何使用?你需要配置一個網頁采集器
將它的行為,模擬到和瀏覽器一致。

第一種方法,查看瀏覽器的請求,參考本文的第一條方法,將請求詳情復制過來,注意選擇GET和POST。

之后,將嗅探到的地址拷貝到網頁采集器的URL輸入框中,查看是否能正確獲取內容。
如果是POST請求,就更復雜一些。在數據清洗模塊中,網頁采集器拖入的列需要是對應的URL,你還需要構造出每次訪問的post數據,單獨作為一列。在網頁采集器中如下配置:
image_1ao1rk5bb1am4pl31j2l1a0l1otpm.png-18.7kB
注意列名需要用方括號括起來,否則每次POST數據都會是所填的數據。

第二種方法,自動嗅探,下一篇文章我們去抓淘寶,該文章會詳細介紹如何使用自動嗅探來模擬動態請求。

4.分布式方案

真正的爬蟲是分布式的。用客戶端去抓取,只適合於小打小鬧的場合。后來的實際情況也證明了這點,分布式能夠充分利用網絡帶寬,將任務分配到不同地域的計算機上,還能避免被封鎖。

Hawk當然沒有支持分布式方案,但我完成的etlpy已經初步具備了這個功能。但是因為惱人的Python和C#的XPath兼容性問題,我一直不能保證Hawk生成的xml一定被etlpy解析。

同樣,etlpy做了非常大的變動,之前為了節省幾行代碼而使用的詭異的FP的風格被我改成了OO。etlpy是我重點發展的方向,Hawk在未來的發展並不明朗,也許不會繼續做大的維護了。因為目前來看,C#可能在我之后的工作生涯中都不會使用了。

5.驗證碼問題

這也是問的非常多的問題,很不幸,不支持。驗證碼各種各樣,簡單到純數字,復雜到12306,圖像轉文本涉及到太多的不確定因素。

解決方案也有,一些網站提供識別驗證碼的接口API,因此你可以讓Hawk去模擬網站的API,將圖片地址傳遞過去,API會自動返回驗證碼。壞消息是這個一般需要收費。
不過,能配置Hawk去做這樣的請求的人,一定也能夠寫Python了,算了,他還是去寫Python吧,別跳Hawk這個坑了。

6.XPath搜索相關問題

網頁采集器中,填寫關鍵字,卻發現無法找到XPath。
可能的原因:

網頁是動態網頁

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

關鍵字太長

是文本中包含不可見字符時經常出現。例如 340[制表符]萬,但用戶可能會直接輸入340萬。Hawk搜索是按照嚴格字符串匹配的,就會匹配不成功,因此輸入短一些,如340

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

一方面,XPath的表示方法有很多種,這和正則類似。可能看起來不一樣的XPath指代的都是同一個節點。
另一方面,Chrome會執行js代碼,而js可能會改變網頁的結構,因此XPath也就對應地發生變化了。這會通常會導致從Chrome拷貝出來的XPath在Hawk中不能使用。
Hawk未來不會考慮支持加入執行js代碼的功能,因此,如果搜索XPath,還請以Hawk得到的結果為准。多搜多看,通常就能建立感覺。

7. 手氣不錯的問題

很多人使用手氣不錯會失敗。這是因為:

不是所有的網頁都支持直接點擊【手氣不錯】

手氣不錯需要特定的網頁結構(列表),如果整個網頁沒有顯著的列表節點,則搜索失敗,此時就會提示 手氣不錯失敗。

手氣不錯會自動規約父節點

使用手氣不錯后,嗅探器會找到列表節點的父節點,以及掛載在父節點上的多個子節點,從而形成一個樹狀結構

  • 父節點(/html/div2/div3/div[4])
    • 子節點1(/a1)
    • 子節點2(/a2/@href)
    • 其他省略

有時候,父節點的xpath是不穩定的,舉個例子,北京上海的二手房頁面,上海會在列表上面增加一個廣告banner,從而真正的父節點就會發生變化。為了應對這種變化,通常的做法是手工修改【父節點XPath】,繼續舉例子,父節點的id為house_list,且在網頁中全局唯一,你就可以使用另外一種父節點表示法//*[@id='house_list'](寫法可以參考其他XPath教程),而子節點表達式不變。
Hawk在【手氣不錯】得到【確定】后,會詢問是否提取父節點XPath,此時Hawk會自動提取【父節點XPath】到屬性對話框中,從而方便修改。

8.下一步計划

  • 在右側界面右鍵添加連接器,如果配置不正確可能會造成閃退,已經修復。
  • 增加自動切換User-agent的功能
  • 優化用戶體驗設計。

有任何問題,歡迎郵箱聯系buptzym@qq.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM