抓取網易雲音樂用戶評論

段子手與神編劇共存,矯情文藝與勵志故事齊飛前端

用戶熱評是網易雲音樂除智能推薦外的第二法寶算法

語料庫是全部天然語言處理模型的知識基礎,甚至決定了模型的適應範圍,畢竟 Garbage in, garbage out 在 NLP 領域也一樣適用。常見的中文語料庫包括中文維基百科、人民日報文本等,這些語料庫的特色很明顯:詞法、語法嚴謹流暢,出現歧義的可能性很小。在通常的 NLP 任務中它們是很是好的選擇,不過互聯網上通常用戶(網友)的討論、留言,所用的詞彙、語法每每並不遵循這樣的特色。大量的「流行詞」被賦予了全新的含義,有時候還會故意製造歧義來表達幽默、諷刺等特定意圖。後端

選擇網易雲音樂的用戶熱評做爲一種特定的網絡交流環境下的語料庫,除了開頭提到的緣由以外,還由於雲村評論的點贊機制很大程度上能夠做爲一種篩選機制,咱們能夠假設,點贊數量超過 1k 的「熱評」,屬於被大衆承認、可以引發共鳴、表意明確的內容(不管是純粹的段子仍是歌手粉絲的留言)。服務器

網頁版的網易雲音樂是 Single-Page App 的典範,前端作了層層加密,要抓取它的數據並不像通常網站那麼簡單。不過具體的加密算法網上也有不少破解說明,畢竟只是前端加密。固然,除了前端加密,後端也設置了層層反爬蟲機制。假裝 Request Headers 就不用說了,無論面對的是什麼網站,這屬於對後端工程師最基本的尊重^_^。接下來就是防止爬蟲 IP 被封,開始沒有注意,尚未抓徹底站歌手的 TOP50 熱門歌曲,服務器 IP 就上了雲村黑名單,並調皮地吐回錯誤代碼:網絡

{"code": -460, "msg": "Cheating"}
複製代碼

因爲咱們並不知道後端的反爬蟲策略——實際上也不須要知道,以不變應萬變,只要讓爬蟲的行爲儘量看起來像人類行爲便可:session

  • 維護一個可用的代理池,每次請求隨機切換代理地址;
  • 一次代理請求失敗,短暫的暫停一點時間再從新請求。

若是要抓取的內容不須要登陸,也就是不須要考慮 IP 變化帶來的 Cookie 變化,通常狀況下上面兩步就足夠用了。如下是示例代碼片斷:dom

good_proxies = ['110.179.67.*:*',
 '114.215.95.*:*',
 '119.28.152.*:*',
 '123.161.16.*:*',
 '139.224.80.*:*',
 '202.38.92.*:*',
 '218.20.54.*:*',
 '112.250.65.*:*',
 '120.77.254.*:*',
 '122.72.18.*:*',
 '221.228.17.*:*',
 '124.237.83.*:*',
 '123.138.89.*:*',
 '121.234.34.*:*',
 '115.213.63.*:*',
 '121.201.33.*:*']

import time
import random
import requests

class B:
    proxies = good_proxies
    UA = ["UA_1", "UA_2"]
    
    def __init__(self):
        self.headers = {}
        self.sess = requests.session()
        
    def _choose_randomly(self, l):
        random.shuffle(l)
        return l[0]
        
    def fetch(self, url, n=10):
        while n > 0:
            self.headers["User-Agent"] = self._choose_randomly(self.UA)
            proxy = self._choose_randomly(self.proxies)
            try:
                res = self.sess.GET(url,
                    headers = self.headers,
                    proxies = {"http": "http://{}".format(proxy)})
                n = 0
            except:
                time.sleep(random.random()*3)
                n -= 1
        return res
複製代碼

查看原文fetch

相關文章
相關標籤/搜索