上一篇介紹瞭如何在電腦的瀏覽器裏自動爬wb的評論樓層到最早的評論,這裏單獨把代碼拿出來給出每行代碼的意義,儘量證明這不是一段惡意代碼(╥╯^╰╥)
代碼的邏輯總結如下:
通過定時器每1s觸發一次自動點擊“獲取更多”按鈕,以獲取新的15條微博。
當wb服務器返回錯誤的的數據的時候,評論列表的dom的子元素數目會小於等於上次自動點擊時的數目,所以將上次的“獲取更多”按鈕插入到dom中,然後繼續自動點擊。
當找不到“獲取更多”按鈕,並且點擊前的子元素數目小於點擊後時,可以判斷爲wb返回的數據中有評論,但沒有獲取更多按鈕,即翻到沙發了。當然,也在上篇文章中給出了手動判斷是不是沙發的方法。
//下面這行是用來標記當前查詢了幾次
var i = 0;//定義標記當前查詢了幾次的變量
var getMoreButton = document.getElementsByClassName("WB_cardmore")[0]//定義變量存放獲取“加載更多”按鈕
var newGetMoreButton//定義變量存放新的“加載更多”按鈕
var timeId //定義定時器
var stopFlag = 0//定義是否停止定時查詢的變量
var listBox = document.getElementsByClassName("list_box")[0]//定義評論列表的父容器的變量
var commitNumber = listBox.children[0].childElementCount//定義存儲當前評論列表父容器有多少子元素
//定義清空評論的方法
function clearCommit() {
var getMoreButton = document.getElementsByClassName("WB_cardmore")[0]//獲取最新的“加載更多”按鈕
if (!getMoreButton) {//如果沒有加載更多按鈕
console.log("請重新輸入一次clearCommit()")//提示用戶重新運行
return//跳出方法,不清空,以防止判斷是否加載到沙發的邏輯失效
}
var newContent = document.createElement("div")//創建一個div元素
newContent.setAttribute('node-type', "comment_list")//爲div元素添加node-type屬性
newContent.setAttribute('class', "list_ul")//爲div元素添加class屬性,這兩個屬性即評論列表父容器下第一層子容器的屬性。
listBox.removeChild(listBox.children[0])//將評論列表父容器清空
newContent.appendChild(getMoreButton)//爲div元素添加“加載更多”按鈕,因爲上面清空評論列表父容器,把按鈕也去掉了,這裏加回來
listBox.appendChild(newContent)//將這個div元素給評論列表父容器作子元素
console.log("清理完成")//提示用戶清理完成
}
//定義自動點擊的方法,接受參數爲加載更多按鈕的dom
function getMore(newButton) {
getMoreButton = newButton//更新getMoreButton爲接受的參數。
i++;//次數加1
getMoreButton.click();//點擊"加載更多"按鈕
window.scrollTo({ top: document.body.scrollHeight, behavior: "smooth" });//自動滾動到底部
console.log("第" + i + "次");//提醒用戶現在是第幾次自動查詢
}
//定義定時拉評論的方法
function begin() {
stopFlag = 0//將停止變量置爲初始值
timeId = setInterval(() => {//定義定時器
if (stopFlag) {//在定時器裏,如果停止變量爲1了
clearInterval(timeId);//停止定時器
}
newGetMoreButton = document.getElementsByClassName("WB_cardmore")[0]//獲取最新的加載更多按鈕
if (!newGetMoreButton) {//當找不到加載更多按鈕時
//重新獲取評論列表父容器有多少子元素,如果比上一次自動點擊加載更多時少/一樣,說明wb服務器返回有問題,需要重新再來一次
if (commitNumber >= listBox.children[0].childElementCount) {
continueRun()//執行出錯之後恢復查詢的方法
} else {//否則就是真的翻到沙發了
clearInterval(timeId);//取消定時
console.log("找不到加載更多按鈕"); //提示用戶找不到加載更多按鈕了
}
} else {//當找得到加載更多按鈕時,說明上一次的自動點擊“加載更多”拿到了新的數據
commitNumber = listBox.children[0].childElementCount//更新當前評論列表的子元素數目
getMore(newGetMoreButton)//執行一次自動點擊的方法
}
}, 1000); //每1000毫秒重複一次定時器裏的行爲
}
//定義當出錯之後,手動繼續的方法
function continueRun() {
console.log("繼續");//提醒用戶程序有執行這個方法
clearInterval(timeId);//停止原來的定時器
listBox.children[0].appendChild(getMoreButton)//恢復上一次的“加載更多”按鈕
getMore(getMoreButton)//執行一次自動點擊的方法
begin()//開啓定時器
}
//定義停止運行的方法
function stop() {
stopFlag = 1//將停止運行變量賦值爲1
}
//運行開始定時拉評論
begin()