Python爬虫实践:如何优雅地删除豆瓣小组的帖子

前言

文章起源于自己的一个需求:想要删除掉自己的若干个小号在豆瓣小组上的发帖及回复记录。这是一件看似简单的事情,但是一遍一遍的重复操作实在让我感到非常绝望,特别是删除自己的回复时,有时候回复的帖子的回复有好几十页,得一页一页的翻。于是就想到用脚本来代替人力操作。对于一名职业为前端工程师的人而言,最容易想到的方法就是打开DevTools发个Ajax请求直接搞定了。不过经历过几次之后发现这种方法很难沉淀下来,于是就想能不能写到脚本里面。一开始依旧想到的是用NodeJS来实现,但是由于最近由于接触程序化交易比较多,发现如果再不温习一下Python大蟒蛇又要忘光了,于是就想借机同时练练Python。

结果

先说结果

安装

两种方式:

  1. 源代码已放到github,可自行查看下载:https://github.com/acrazing/dbapi
git clone https://github.com/acrazing/dbapi.git
cd dbapi
# 安装依赖
pip install -r requirements.txt
  1. 包已发布到pip,可自行安装:
pip install dbapi

使用

首先得安装,然后:

  1. 登录客户端:因为客户端有缓存Session,所以你只需要登录一次,在命令行中:
    python -m dbapi.DoubanAPI test_client login "username" "password"
    
  2. 删除自己回复过的帖子:因为要删除自己发的帖子实际上是要删除掉所有自己在帖子下的回复,如果回复非常多不知道自己回复的在哪一页或者自己的回复非常多,操作起来会比较恶心
    python -m dbapi.DoubanAPI test_api remove_commented_topic "topic_id"
    # topic_id 可以通过下面这个命令拿到:
    python -m dbapi.DoubanAPI test_api list_commented_topics
    # 这个命令会返回所有自己回复过的帖子
    
  3. 删除自己发的帖子:因为要先删除所有的回复,所以也很恶心
    python -m dbapi.DoubanAPI test_api remove_topic "topic_id"
    # topic_id 可以通过下面这个命令拿到:
    python -m dbapi.DoubanAPI test_api list_user_topics
    # 这个命令会返回所有自己发布的帖子
    

需求分析

  1. 首先需求很明确:快速删除掉在豆瓣小组内的发帖和回复记录
  2. 要访问自己的豆瓣小组,需要登录帐号获取会话信息,其中一个关键的信息会话IDdbcl2设置了HttpOnly,此外还需要一个动态idck。当然这些问题都可以通过把所有的Cookie添加到客户端搞定。
  3. 要删除发帖记录,需要先删除掉贴子下的所有回复,在删除别人的回复时,需要调用管理员权限并提交理由
  4. 要删除掉回复记录,需要删除掉所有的自己的回复,但是别人的引用是无法删除的,所以最后要真正隐藏掉记录,需要注销帐号。
  5. 登录是敏感操作,频繁登录很容易触发机器人,需要缓存会话信息
  6. 访问频率过高也会触发机器人,需要做访问限制

接口列表

通过浏览器抓包发现,相关操作主要有几下几个接口:

  • 登录账号:POST https://www.douban.com/accounts/login,登录前需要先获取bid等信息,登录时如果不设置redir_url,会自动跳转到豆瓣首页,如果登录失败,则不会跳转,可以据此判断登录是否成功,或者也可以用Cookie信息进行判断。跳转完成后会拿到所有会话所需要的Cookie信息,所以需要跟踪跳转
  • 登出账号:GET https://www.douban.com/accounts/logout?source=group&ck=%s,这里的ck就是会话中的ck
  • 获取自己发的帖子列表:GET https://www.douban.com/group/people/%s/publish,有翻页
  • 获取自己回复过的帖子列表:GET https://www.douban.com/group/people/%s/reply,有翻页
  • 删除自己的回复:POST https://www.douban.com/j/group/topic/%s/remove_comment
  • 删除自己发的帖子下的别人的回复:POST https://www.douban.com/group/topic/%s/remove_comment

此外还有一些已实现但是与此无关的接口,可以到代码中dbapi/endpoints.py中查看

接口设计

  • 为了方便扩展,封装了一层基础的API SDK:只是对单个页面进行请求及信息提取,所有的其它上层操作都基于这个SDK,比如删除发帖记录等
  • 为了方便扩展,对接口进行了模块化处理:比如豆瓣小组Group,用户People等模块等
  • 为了方便调用,封装了一个统一的出口类DoubanAPI,对会话缓存,登录登出等操作进行统一管理,并引入了各个模块
  • 对于每个网络请求,需要用到公共头及会话信息,所以封装了一个基类BaseAPI统一网络请求,并且返回数据有可能是html或者json,所以提供了三个相关接口,同时部分接口需要显式调用ck,所以提供了相关接口

依赖

  • 网络请求由requests实现
  • 大部分read接口返回的数据都是html格式,这里使用lxmlxpath进行读取
  • 使用logging输出日志

代码分析

略,请参考源代码

其它

除了小组相关API外,还实现了用户People相关的部分API,可以实现获取用户profile,关注用户及关注者,代码在dbapi/People.py中。利用这几个API设计了一个多线程爬虫,用来爬取豆瓣上的热门用户,代码在test/relation.py中,爬取的结果放在__relation__.json中。目前我注册了4个豆瓣账号,开了4个线程进行爬取。最开始由一个种子用户sevear,爬取其关注的用户中关注者大于100的用户,然后逐渐将关注者最小值加到现在的10000。目前已发布到Github的结果中,已经爬取了33599个用户,其中1069个用户的关注者超过了10000。发现了一些比较有趣用户,比如熊阿姨等;也发现热门的用户大多都会贴上自己的微信公众号,微博等信息;还有很多从05年就开始使用豆瓣的重度用户,也有很多注销了的账号。虽然我也很多年前就注册了豆瓣,但是一直没有发现除了发租房贴,看电影评价,听FM(现在已经不用了)之外还有什么其它价值。也许这些人可以给我答案。

总结

  • 因为之前对Python的了解仅限于语法层面,未接触过相应的生态,比如pip包管理,setuptools等,并且不熟悉相关的基础包。所以几乎得从零开始,是件很头疼的事情,所幸的是Python的包都比较有名气,包管理等网络上也有很多教程,查找起来都比较容易。感谢互联网~
  • 通过test/relation.py测试发现,目前存在内存泄漏问题,但是捣鼓了半天没有查到问题所在,已经没有兴趣继续花时间了~
  • 同上,访问频率过高有可能会触发IP封禁,出现Please try later以及检测到你的IP有非正常请求发出balabala提示~
  • 同上,现在4个线程中每个请求之前间隔时间调整到了3秒,再也没有出现IP封禁的提示~
  • 客户端架构存在很大问题:比如无法动态更新会话信息,频繁获取模块有额外的性能开销等,需要重新设计整体架构,同样已经没有兴趣了,等以后有心情再更新吧~
  • 分不清账号帐号, 帖子贴子,求语文老师
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容