搬迁到语雀啦,地址在这
上一篇介绍了如何在电脑的浏览器里自动爬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//定义存储当前评论列表父容器有多少子元素
var audio = new Audio("https://t.cn/A6Ag3iqY");//这里是结束后播放的音乐链接,《好运来》
//定义清空评论的方法
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(() => {//定义定时器
newGetMoreButton = document.getElementsByClassName("WB_cardmore")[0]//获取最新的加载更多按钮
if (!newGetMoreButton) {//当找不到加载更多按钮时
if (commitNumber > listBox.children[0].childElementCount) {//重新获取评论列表父容器有多少子元素,如果比上一次自动点击加载更多时少,说明wb服务器返回有问题,需要重新再来一次
continueRun()//执行出错之后恢复查询的方法
} else {//否则就是真的翻到沙发了
clearInterval(timeId);//取消定时
console.log("找不到加载更多按钮,看看是不是翻到沙发啦?"); //提示用户找不到加载更多按钮了
audio.play();//播放提示音乐
}
} else {//当找得到加载更多按钮时,说明上一次的自动点击“加载更多”拿到了新的数据
commitNumber = listBox.children[0].childElementCount//更新当前评论列表的子元素数目
getMore(newGetMoreButton)//执行一次自动点击的方法
}
if (stopFlag) {//在定时器里,如果停止变量为1了
clearInterval(timeId);//停止定时器
}
}, 1000); //每1000毫秒重复一次定时器里的行为
}
//定义当出错之后,手动继续的方法
function continueRun() {
console.log("继续");//提醒用户程序有执行这个方法
i--;//使计数器的值不算上这次查询
clearInterval(timeId);//停止原来的定时器
listBox.children[0].appendChild(getMoreButton)//恢复上一次的“加载更多”按钮
getMore(getMoreButton)//执行一次自动点击的方法
begin()//开启定时器
}
//定义停止运行的方法
function stop() {
stopFlag = 1//将停止运行变量赋值为1
}
//定义停止提示音乐的方法
function stopMusic() {
audio && audio.pause();//停止播放提示音乐
}
//运行开始定时拉评论
begin()