- 接着上次讲,上一节我们只获取了单个视频的评论地址,接下来我们要讲怎么获取任意视频的评论。首先把视频链接地址和评论链接地址有什么联系。
视频地址:http://v.youku.com/v_show/id_XMzExMTM5ODI5Ng==.html?spm=a2h0j.8191423.chasing.1~3~A
评论地址:http://p.comments.youku.com/ycp/comment/pc/commentList?jsoncallback=n_commentList&app=100-DDwODVkv&objectId=777849574&objectType=1&listType=0¤tPage=3&pageSize=30&sign=b9af46b6d144f789b44c615f0f4984a9&time=1509695827
看上去没有什么关联。这时我们把视频地址中?后面的字符串删掉,在浏览器中访问发现一样可以访问到对应的视频。而且视频评论正常显示,也就是我们只需要http://v.youku.com/v_show/id_XMzExMTM5ODI5Ng==.html 这个视频链接地址就行。接着分析评论地址,评论地址中参数较多,我们肯定会注意objectId这个东西,这个东西是什么呢?给个视频的评论标识吗?我们把视频地址中的“id_XMzExMTM5ODI5Ng==”换成“id_777849574”,然后在浏览器访问(http://v.youku.com/v_show/id_777849574.html):
我列个擦,居然也能正常访问,这是发现新大陆了。难道。。。于是我又邪恶的把评论请求换成了http://p.comments.youku.com/ycp/comment/pc/commentList?jsoncallback=n_commentList&app=100-DDwODVkv&objectId=XMzExMTM5ODI5Ng==&objectType=1&listType=0¤tPage=3&pageSize=30&sign=b9af46b6d144f789b44c615f0f4984a9&time=1509695827;然后在浏览器中访问。
好吧,一样能正常访问。聪明的小伙伴看到这里估计应该知道怎么去实现根据任意的视频地址获取评论了。我们可以将视频链接中id_后面的字符串截取出来,传给评论列表的请求地址,替换objectId后面的数字串。我这里没有用正则截取,只是简单截取,代码如下:
getVid: function(url) { if(url.startsWith('http://v.youku.com/v_show/')) { var arr = url.split('.html')[0].split('/'); return arr[arr.length - 1].replace('id_', ''); } else { return ""; } }
接着,我们要分析评论请求中其他参数了,像jsoncallback,app,objectType等,我们多找几个视频,只改变objectId的值,发现一样可以获取到视频的评论。这里特别说明一下参数sign和time的联系,我通过在控制台断点发现sigh的生成规则是:MD5(当前毫秒/1000-取整+appId+appSecret);如下图:
所以,只要sign和time是一对就不会请求出错。
2.接下来还要获取当前视频的所有评论,这就需要动态的传入currentPage这个参数了,我们首先想到的就是for循环,但是循环多少次,这时我们再看一下请求后,给我们返回的有哪些参数;
上图,我们发现会把当前评论的总页数返回给我们。所以我们循环的次数就是totalPage。下面是我的部分主要代码:
getAllData: function(totalPage) { var _this = this; var objId = this.getVid($('#vid').val()); for(let i = 1; i <= totalPage; i++) { var sign = yk_sign(); var time = ~~(Date.now() / 1e3); var _url = this.baseUrl + "objectId=" + objId + "¤tPage=" + i + "&sign=" + sign + "&time=" + time; $.ajax({ type: "get", url: _url, dataType: "jsonp", jsonp: "jsoncallback", // jsonpCallback:"n_commentList", }).done(function(res) { console.log("currentPage== " + i); var data = res['data']['comment']; // console.log(JSON.stringify(data) ); // _this.sendData(data); }); } }, getTotalPage: function() { var _this = this; var objId = this.getVid($('#vid').val()); if(objId == '' || objId == 'undefined') { alert('视频url输入格式不正确!'); return false; } else { var time = ~~(Date.now() / 1e3); var sign = yk_sign(time); var _url = this.baseUrl + "objectId=" + objId + "¤tPage=1&sign=" + sign + "&time=" + time; $.ajax({ type: "get", url: _url, dataType: "jsonp", jsonp: "jsoncallback", // jsonpCallback:"n_commentList", }).done(function(res) { var totalPage = res["data"]["totalPage"]; console.log("总页数:" + totalPage); _this.getAllData(totalPage); }); } },
至此,优酷的评论爬取到此结束。下期将继续其他网站的爬取,有不足之处,欢迎大家一起探讨学习
谢谢!!