前言
我承認我太無聊了。不對,我有的是干不完的活,只不過不想干,於是刷刷朋友圈,剛好看到一個妹子曬了一張知乎的截圖,還特意把知乎昵稱打了碼。最最要命的是妹紙居然說就是不想讓人知道自己的昵稱。於是我心底無限的好奇心被激發得像脫韁的二狗了。。。
方案
其實要找到妹紙不難,思路很簡單。找到截圖上的問題,然后遍歷問題下所有的答案,然后在答案中尋找關鍵字就可以定位到妹紙了。
-
方案一
當然是萬能的python啊。不過我最近懶癌犯了,不想查資料。 -
方案二
JavaScript 這是一門神奇的語言,剛好我會寫一點。那就這么干了。
搞事情
經過分析,知乎的網頁上沒有jQuery,我需要用ajax方法,於是Google之,找到一個封裝比較好的ajax方法,如下
參考 https://www.cnblogs.com/Webcom/p/3415295.html
function Ajax(type, url, data, success, failed){
// 創建ajax對象
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject('Microsoft.XMLHTTP')
}
var type = type.toUpperCase();
// 用於清除緩存
var random = Math.random();
if(typeof data == 'object'){
var str = '';
for(var key in data){
str += key+'='+data[key]+'&';
}
data = str.replace(/&$/, '');
}
if(type == 'GET'){
if(data){
xhr.open('GET', url + '?' + data, true);
} else {
xhr.open('GET', url + '?t=' + random, true);
}
xhr.send();
} else if(type == 'POST'){
xhr.open('POST', url, true);
// 如果需要像 html 表單那樣 POST 數據,請使用 setRequestHeader() 來添加 http 頭。
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(data);
}
// 處理返回數據
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
success(xhr.responseText);
} else {
if(failed){
failed(xhr.status);
}
}
}
}
}
其實需要做的事情是分析拉取答案的請求,然后構造下一頁的請求去拉數據。遍歷數據找目標關鍵字,如果找到了就結束,沒找到就繼續拉取下一頁的數據。
PS:需要先登錄知乎,然后在知乎頁面的console里搞事情。。。
拉取答案的url如下
var s = "https://www.zhihu.com/api/v4/questions/29998237/answers?sort_by=default&include=data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,upvoted_followees;data[*].mark_infos[*].url;data[*].author.follower_count,badge[?(type=best_answerer)].topics&limit=20&offset=23"
接下來需要給ajax定義兩個回調函數
var e = function(error){
console.log(error);
}
var f = function(data){
data = eval('(' + data + ')');
for(var i = 0; i < data.data.length; i++){
if (data.data[i].content.indexOf("93在思維貧乏的時候") >= 0){
console.log(data.data[i].content);
break;
}
if (i == data.data.length - 1) {
var page = data.paging;
if (!page.is_end){
var next = page.next;console.log(next);
next = "https:" + next.split(":")[1];
console.log("翻頁:" + next);
Ajax('get', next, {}, f, e);
}
}
}
}
最后啟動函數
Ajax('get', s, {}, f, e);
觀察控制台,一直在進行ajax請求,在network中也可以看到請求的返回值。不一會兒,在茫茫的答案中找到了妹紙~~~
感嘆:Chrome真TM好用。