標籤:

Matlab如何爬蟲知乎

這大半年來,寫了些許帖子,而其中有幾篇帖子,自己很喜歡,不過在知乎上卻無人問津。有幾個稍熟的知乎朋友打趣說,零贊慘案。

再加上有一個問題,我至今仍然沒有想明白,為什麼我的收藏次數4733次,點贊數只有1768次?

因此,很長一段時間,我都想了解一下,我的關注者們,他們都關注了誰,對什麼問題比較感興趣?

於是,周末,我寫了一個爬蟲腳本,爬取了我所有關注者的數據,並對這部分數據進行一個較為簡易的分析。而在這篇帖子的後半部分,我會聊一聊,在爬蟲過程中,如何應對網站的反爬蟲機制。

1. 打浦橋程序員關注者排行榜

先來看一下「打浦橋程序員關注者排行榜」,各位可以看看自己有沒有上榜。

關注人數最多:Sisi (ID: hans-48-17),關注了4839個人

被關注人數最多:河馬老師 (ID: hippoh),被98975個人關注

獲贊最多:果大叔 (ID: guo-zi-26),獲得39225次贊

感謝最多:果大叔 (ID: guo-zi-26),獲得8994次感謝

被收藏最多:果大叔 (ID: guo-zi-26),獲得33090次收藏

回答最多:可愛多 (ID: stonegu),回答了1080次問題。這哥們不是之前公眾號中獎的那個哥們嗎!

提問最多:劉超 (ID: liu-chao-67-68),提問了38次

關注的問題最多:Sisi (ID: hans-48-17),關注了15874個問題

2. 我的關注者們都還關注了誰

截止目前,我的所有關注者們一共關注了18萬8139人,去除重複關注,一共關注了6萬3060人。

在這6萬多人中,被關注人數最多的是vczh (ID: excited-vczh),我的關注者中有319位關注了輪子哥。而輪子哥的關注者一共將近60萬。

排第二位的是Patrick Zhang (ID: patrick-zhang-3),我的關注者中有314位關注了他,而Patrick Zhang的關注者有將近15萬。

排第三位的是張佳瑋 (ID: zhang-jia-wei),我的關注者中有290位關注了他,而張佳瑋的關注者有142萬。

3. 我的關注者們都關注了什麼問題

所有關注者們一共關注了26萬41個問題,去除重複關注,一共關注了12萬4519個問題。接下來看一下,最受關注的10個問題分別是:

1. 有哪些軟體堪稱「神器」,卻不為大眾所知? (230人關注)

2. MATLAB 中有哪些命令,讓人相見恨晚?(151人關注)

3. 你寫論文時發現了哪些神網站? (142人關注)

4. MATLAB 到底有多厲害?(124人關注)

5. 最良心的軟體可以良心到什麼程度?(123人關注)

6. 如何在論文中畫出漂亮的插圖?(119人關注)

7. Excel 有哪些可能需要熟練掌握而很多人不會的技能?(107人關注)

8. MATLAB 有什麼奇技淫巧?(105人關注)

9. 你有什麼道理後悔沒有早點知道?(103人關注)

10. 哪些東西買了之後,會讓人因生活質量和幸福感提升而感覺相見恨晚?(100人關注)

前八個問題可以看得出來,主要是圍繞Matlab,軟體等問題展開的,很合理,因為在知乎上,我一直只寫關於Matlab的帖子,關注者們關注最多的這些問題從側面上也定義了我所寫的公眾號的定位。

以上就是一個簡單的數據分析,還有更多的現象可以通過這部分數據去分析。接下來就聊一聊在這次知乎爬蟲過程中,我關注更多的幾點問題。

之前嘗試過使用Matlab進行爬蟲的朋友,相信應該會碰到一個問題,就是爬著爬著,然後就報錯了。歇一段時間,相同的代碼就又能跑了,不過也持續不了多久。

其實這並不是你代碼的問題,而是網站為了防止爬蟲而建立的反爬蟲機制。在觸髮網站的反爬蟲機制時,有一個很明顯的共性是,所讀取的字元串中顯示「Unhuman」,也就是網站識別到,此次讀取網頁為機器操作。那麼,我們就可以從「Unhuman」這個字元串開始做文章了。

Matlab反爬蟲的策略有很多,也包括使用代理器,修改IP地址進行網頁讀取。不過,今天先介紹一種最簡單的策略,通俗的講就是,網站不讓我讀取信息,那我就等,直到網站再次許可我讀取信息為止。這種策略的一個弊端就是,耗時相對比較長,從技術層面上而言,屬於無腦爬蟲,技術相對較低。但是如果不考慮時間成本的話,這種方法是可以滿足自身需求的。讓Matlab一直運算,直到爬完所有信息。

在先前的兩篇爬蟲帖子中,我介紹了urlread函數,但是有一個細節我並未提及,也就是函數的輸出參數。

1. text = urlread(path)

這種讀取方式,輸出參數text為網頁的字元串信息。但是,一旦網頁出現超時或者是其他形式的不響應是,這條命令就會出現報錯,爬蟲的程序進而並終止。

那麼可以考慮使用下面一種方式:

2. [text, valid] = urlread(path)

對於這種讀取方式,text同樣為網頁的字元串信息,不過另一個輸出參數valid表示當前讀取網頁動作的有效性。如果為有效讀取,那麼valid輸出為1。如果出現超時等故障是,valid輸出為0。對此可以通過一個if語句的判斷,如果出現故障,那麼就進行重新讀取。通過這種方式,可以避免爬蟲程序的終止。

回到先前提到的反爬蟲機制這個問題上來,如果網站識別到位機器讀取的話,valid的輸出依舊為1,是有效讀取網頁的動作,不過text輸出的網頁字元串信息無效,其中並沒有包含你所需要的信息。正如我之前所提到的關鍵詞「Unhuman」,對此不妨使用while循環,如果網頁信息中始終包含「Unhuman」該關鍵詞,那麼進行重新讀取,直到讀取到真正有效的網頁信息。在這裡需要注意的一點是,根據不同的網站,不一定所有關鍵詞均為「Unhuman」,不過策略上大致是相似的。同時,為了避免有效網頁信息中本來就含有「Unhuman」的信息,有必要對該關鍵加以拓展,比如「<div class="Unhuman">」,以避免對有效信息的誤殺。

最後一個針對反爬蟲機制的建議是,嘗試變頻讀取。所謂變頻讀取,就是不要以等時長形式進行讀取或者是不間斷進行讀取,對時間間隔稍加修飾。對於時間間隔的命令,很容易就能聯想到pause的函數。而變頻的話,可以考慮對時長進行隨機選取,而隨機數的選取就可以考慮使用rand函數。

這種功能,同樣可以應用到先前「Unhuman」的while循環等待讀取網頁信息中。因為不間斷的去讀取網頁,往往會加大程序的運算量,那麼大可以選取20秒內的隨機時長進行等待。

通過上述所聊的幾點,就可以實現睡前運行爬蟲程序,睡醒就能拿到所有數據。

再次申明一下,謝謝Python粉絲的閱讀,請不要再在帖子下留言「Python更牛逼,你寫的所有帖子Python都能做」,然後人就跑了。關於爬蟲,我從來沒有宣揚Matlab比Python牛逼,我也承認Python在爬蟲這方面比Matlab更好,但是,請你注意,並不是所有我寫的帖子,Python都能做。請抱有問題解答多樣性以及探索Matlab解決問題的拓展性的心態來讀我的帖子,我真心沒有想與你們PK個高下,請見諒。

祝大家新的一周,工作順利!

以上

如果你有興趣,歡迎關注我的微信公眾號「打浦橋程序員」,謝謝


推薦閱讀:

如何用matlab畫天線的三維方向圖?
對函數的輸入進行檢查和解析
用matlab實現樂曲演奏的難度?在網上聽到一首用matlab編寫的卡農,求分析一下實現及難度所在?
為什麼很多計算機專業碩士生論文編程都是用MATLAB做的,僅僅是科學計算方面的優勢嗎?
數學建模一般用哪種軟體比較好?MATLAB是否有局限性?

TAG:MATLAB |