前情提要
最近由于转租房子的事情,搞得很疲惫,前期没考虑好就换了新的住处,导致需要自己转租以前的房子,不然房东不退押金啊;怎么办,转租呗,抄起家伙就是干,以前用过豆瓣小组转过房子,这次也是一样(我不是做广告的,别打我!),拼命发帖,拼命自己顶帖啊,加了一二十个小组,发了一二十个贴子,本来想写个脚本定时顶帖呢,可无奈还需要搞验证码,工作事情多,没时间做了,全自动顶帖的就人工代替了,偶尔一两个小时顶一次;
前两天刚转租出去,本来想去豆瓣把帖子删了,因为帖子中有太多的个人信息,一个一个清空太麻烦。无奈看了一遍没有删帖的地方,后来才知道原来豆瓣删帖必须是没有评论的帖子才可以删除,我看了一下我的帖子,瞬间石化,我自己的回复都已经有上百条了,一个一个删要到什么时候啊;本能的我开始研究豆瓣删除评论的接口调用规律,发现了规律后就撸起袖子干;
豆瓣接口
由于豆瓣中的一些相关操作都是需要认证的,所以我们需要提前用浏览器登录进行操作,取到Cookie 和一个ck值,ck值具体什么作用不是很清楚,不过大部分的操作都需要这个参数,这个参数的值基本没有变化,很容易找到,最好删帖前自己操作一下删除评论就可以获取到ck值,cid值就是评论的编号值,后续代码中有介绍相关参数获取方式;
技术选型
以前做过node爬虫工具,这次也一样,不过这个相对更简单点,只有两个依赖包,一个是
superagent
一个是 cheerio
,这两个是爬虫工具经常使用的,我就不详细介绍了,不知道的可以去搜索看一下介绍;
主要代码
思路:
主要的代码内容很简单,主要就是先获取个人发帖列表,然后模拟访问所有的帖子列表,获得每个帖子的html文本,接着去爬取每篇帖子的评论id号,获取到id号后就进行删帖操作;
注意事项
这里值得注意的是,当执行完删除评论以后,你会发现还存在一部分评论,因为对于自己的评论是可以直接调用接口删除的,但是对于别人的评论,需要调用另外一个接口才能删除,并且需要填写删除原因,所以第一步操作是删除自己所有的评论,然后第二步是删除其他人所有的评论;最后一步才是删除所有帖子;
目录结构
就是最简单的目录结构,直接在一个项目文件夹中执行npm init
然后创建一个douSpider.js文件,npm 安装 superagent
和 cheerio
代码
douSpider.js
//豆瓣删帖
var superagent = require('superagent');//引入superagent 插件
var cheerio = require('cheerio');//引入cheerio
//Cookie
var Cookie='填写你的Cookie值';
//host
var host ='www.douban.com';
//Origin
var Origin ='https://www.douban.com';
//Referer
var Referer = 'https://www.douban.com/group/';
//参数ck
var ck ='填写你的ck值';
//获取个人帖子列表
getTopic =function () {
//这里需要注意的是需要点击到小组,你发布的列表
var url = 'https://www.douban.com/group/people/1732*****(填入自己的url)/publish';
superagent
.get(url)
.set('Cookie',Cookie)
.set('Host',host)
.set('Referer',Referer)
.end(function (err,res) {
if(err){
return err
}
var $=cheerio.load(res.text);
var urlList=[];
$('.title a').each(function (index,element) {
var $element = $(element);
var href =$element.attr('href');
var href_item = href.split('/');
urlList.push(href_item[5]);
});
for(var i =0;i<urlList.length;i++){
console.log('正在处理第'+i+'帖子');
spider(urlList[i]);
// 第三执行删帖操作
//removeTopic(urlList[i]);
}
})
};
//获取指定帖子的cid
spider = function (topic) {
var url = 'https://www.douban.com/group/topic/'+topic+'/';
superagent
.get(url)
//请求结束后的操作
.end(function (err, res) {
if (err) {
console.log(err);
return err;
}
//解析请求后得到的body数据
var $=cheerio.load(res.text);
var cid=[];
$('#comments li').each(function (index,element) {
var $element = $(element);
cid.push($element.attr('data-cid'));
});
for(let i=0;i<cid.length;i++){
console.log('正在删除第'+topic+'帖子的第'+i+'条评论');
// 第一次执行删除自己的回复
removeComment(topic,cid[i]);
// 第二次执行删除其他人的回复
// removeOtherComment(topic,cid[i]);
}
});
};
//删除帖子
removeTopic =function (topic) {
var url3='https://www.douban.com/group/topic/'+topic+'/remove?ck='+ck;
superagent
.get(url3)
.set('Cookie',Cookie)
.set('Host',host)
.set('Referer',Referer+'topic/'+topic+'/')
.end(function (err,res) {
if(err){
console.log(err);
return err
}
console.log('成功删帖');
})
};
//删除其他人评论
removeOtherComment=function (topic,cid) {
var url2 ='https://www.douban.com/group/topic/'+topic+'/remove_comment?cid='+cid;
superagent
.post(url2)
.send({'cid':cid,'ck':ck,'reason':'other_reason','submit':'确定'})
.set('Cookie',Cookie)
.set('Host',host)
.set('Origin',Origin)
.set('Content-Type','application/x-www-form-urlencoded')
.set('Referer',Referer+'topic/'+topic+'/remove_comment?cid='+cid)
.end(function (err,res) {
if(err){
console.log(err);
return err
}
console.log('成功删除');
})
};
//删除自己评论
removeComment =function (topic,cid) {
var url1 = 'https://www.douban.com/j/group/topic/'+topic+'/remove_comment'; //移除评论接口
superagent
.post(url1)
.send({'cid':cid,'ck':ck})
.set('Cookie',Cookie)
.set('Host',host)
.set('Origin',Origin)
.set('Content-Type','application/x-www-form-urlencoded')
.set('Referer',Referer+'topic/'+topic+'/')
.end(function (err,res) {
if(err){
console.log(err);
return err
}
console.log('成功删除');
})
};
getTopic();
复制代码
使用
此脚本已经放在了我个人git上,有兴趣的可以fork一下,或者给个star,不胜感激;
使用方法,git上也有,我相信大家应该都会的;直接node 脚本名.js
问题
目前本删帖脚本只适用于删除所有帖子的评论,所以请慎用,我因为所有的帖子都是转租信息,所以可以一键放心删除,如果你有重要信息,请注意可以调用部分函数,填入你的指定帖子ID值进行删除;