段子手与神编剧共存,矫情文艺与励志故事齐飞前端
用户热评是网易云音乐除智能推荐外的第二法宝算法
语料库是全部天然语言处理模型的知识基础,甚至决定了模型的适应范围,毕竟 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