爬虫软件python彻底卸载_Python爬虫实践:如何优雅地删除豆瓣小组的帖子
前言
文章起源于自己的一個(gè)需求:想要?jiǎng)h除掉自己的若干個(gè)小號(hào)在豆瓣小組上的發(fā)帖及回復(fù)記錄。這是一件看似簡(jiǎn)單的事情,但是一遍一遍的重復(fù)操作實(shí)在讓我感到非常絕望,特別是刪除自己的回復(fù)時(shí),有時(shí)候回復(fù)的帖子的回復(fù)有好幾十頁,得一頁一頁的翻。于是就想到用腳本來代替人力操作。對(duì)于一名職業(yè)為前端工程師的人而言,最容易想到的方法就是打開DevTools發(fā)個(gè)Ajax請(qǐng)求直接搞定了。不過經(jīng)歷過幾次之后發(fā)現(xiàn)這種方法很難沉淀下來,于是就想能不能寫到腳本里面。一開始依舊想到的是用NodeJS來實(shí)現(xiàn),但是由于最近由于接觸程序化交易比較多,發(fā)現(xiàn)如果再不溫習(xí)一下Python大蟒蛇又要忘光了,于是就想借機(jī)同時(shí)練練Python。
結(jié)果
先說結(jié)果
安裝
兩種方式:
源代碼已放到github,可自行查看下載:https://github.com/acrazing/dbapigit clone https://github.com/acrazing/dbapi.git
cd dbapi
# 安裝依賴
pip install -r requirements.txt
包已發(fā)布到pip,可自行安裝:pip install dbapi
使用
首先得安裝,然后:
登錄客戶端:因?yàn)榭蛻舳擞芯彺鍿ession,所以你只需要登錄一次,在命令行中:python -m dbapi.DoubanAPI test_client login "username" "password"
刪除自己回復(fù)過的帖子:因?yàn)橐獎(jiǎng)h除自己發(fā)的帖子實(shí)際上是要?jiǎng)h除掉所有自己在帖子下的回復(fù),如果回復(fù)非常多不知道自己回復(fù)的在哪一頁或者自己的回復(fù)非常多,操作起來會(huì)比較惡心python -m dbapi.DoubanAPI test_api remove_commented_topic "topic_id"
# topic_id 可以通過下面這個(gè)命令拿到:
python -m dbapi.DoubanAPI test_api list_commented_topics
# 這個(gè)命令會(huì)返回所有自己回復(fù)過的帖子
刪除自己發(fā)的帖子:因?yàn)橐葎h除所有的回復(fù),所以也很惡心python -m dbapi.DoubanAPI test_api remove_topic "topic_id"
# topic_id 可以通過下面這個(gè)命令拿到:
python -m dbapi.DoubanAPI test_api list_user_topics
# 這個(gè)命令會(huì)返回所有自己發(fā)布的帖子
需求分析
首先需求很明確:快速刪除掉在豆瓣小組內(nèi)的發(fā)帖和回復(fù)記錄
要訪問自己的豆瓣小組,需要登錄帳號(hào)獲取會(huì)話信息,其中一個(gè)關(guān)鍵的信息會(huì)話IDdbcl2設(shè)置了HttpOnly,此外還需要一個(gè)動(dòng)態(tài)idck。當(dāng)然這些問題都可以通過把所有的Cookie添加到客戶端搞定。
要?jiǎng)h除發(fā)帖記錄,需要先刪除掉貼子下的所有回復(fù),在刪除別人的回復(fù)時(shí),需要調(diào)用管理員權(quán)限并提交理由
要?jiǎng)h除掉回復(fù)記錄,需要?jiǎng)h除掉所有的自己的回復(fù),但是別人的引用是無法刪除的,所以最后要真正隱藏掉記錄,需要注銷帳號(hào)。
登錄是敏感操作,頻繁登錄很容易觸發(fā)機(jī)器人,需要緩存會(huì)話信息
訪問頻率過高也會(huì)觸發(fā)機(jī)器人,需要做訪問限制
接口列表
通過瀏覽器抓包發(fā)現(xiàn),相關(guān)操作主要有幾下幾個(gè)接口:
登錄賬號(hào):POST https://www.douban.com/accounts/login,登錄前需要先獲取bid等信息,登錄時(shí)如果不設(shè)置redir_url,會(huì)自動(dòng)跳轉(zhuǎn)到豆瓣首頁,如果登錄失敗,則不會(huì)跳轉(zhuǎn),可以據(jù)此判斷登錄是否成功,或者也可以用Cookie信息進(jìn)行判斷。跳轉(zhuǎn)完成后會(huì)拿到所有會(huì)話所需要的Cookie信息,所以需要跟蹤跳轉(zhuǎn)
登出賬號(hào):GET https://www.douban.com/accounts/logout?source=group&ck=%s,這里的ck就是會(huì)話中的ck
獲取自己發(fā)的帖子列表:GET https://www.douban.com/group/people/%s/publish,有翻頁
獲取自己回復(fù)過的帖子列表:GET https://www.douban.com/group/people/%s/reply,有翻頁
刪除自己的回復(fù):POST https://www.douban.com/j/group/topic/%s/remove_comment
刪除自己發(fā)的帖子下的別人的回復(fù):POST https://www.douban.com/group/topic/%s/remove_comment
此外還有一些已實(shí)現(xiàn)但是與此無關(guān)的接口,可以到代碼中dbapi/endpoints.py中查看
接口設(shè)計(jì)
為了方便擴(kuò)展,封裝了一層基礎(chǔ)的API SDK:只是對(duì)單個(gè)頁面進(jìn)行請(qǐng)求及信息提取,所有的其它上層操作都基于這個(gè)SDK,比如刪除發(fā)帖記錄等
為了方便擴(kuò)展,對(duì)接口進(jìn)行了模塊化處理:比如豆瓣小組Group,用戶People等模塊等
為了方便調(diào)用,封裝了一個(gè)統(tǒng)一的出口類DoubanAPI,對(duì)會(huì)話緩存,登錄登出等操作進(jìn)行統(tǒng)一管理,并引入了各個(gè)模塊
對(duì)于每個(gè)網(wǎng)絡(luò)請(qǐng)求,需要用到公共頭及會(huì)話信息,所以封裝了一個(gè)基類BaseAPI統(tǒng)一網(wǎng)絡(luò)請(qǐng)求,并且返回?cái)?shù)據(jù)有可能是html或者json,所以提供了三個(gè)相關(guān)接口,同時(shí)部分接口需要顯式調(diào)用ck,所以提供了相關(guān)接口
依賴
網(wǎng)絡(luò)請(qǐng)求由requests實(shí)現(xiàn)
大部分read接口返回的數(shù)據(jù)都是html格式,這里使用lxml及xpath進(jìn)行讀取
使用logging輸出日志
代碼分析
略,請(qǐng)參考源代碼
其它
除了小組相關(guān)API外,還實(shí)現(xiàn)了用戶People相關(guān)的部分API,可以實(shí)現(xiàn)獲取用戶profile,關(guān)注用戶及關(guān)注者,代碼在dbapi/People.py中。利用這幾個(gè)API設(shè)計(jì)了一個(gè)多線程爬蟲,用來爬取豆瓣上的熱門用戶,代碼在test/relation.py中,爬取的結(jié)果放在__relation__.json中。目前我注冊(cè)了4個(gè)豆瓣賬號(hào),開了4個(gè)線程進(jìn)行爬取。最開始由一個(gè)種子用戶sevear,爬取其關(guān)注的用戶中關(guān)注者大于100的用戶,然后逐漸將關(guān)注者最小值加到現(xiàn)在的10000。目前已發(fā)布到Github的結(jié)果中,已經(jīng)爬取了33599個(gè)用戶,其中1069個(gè)用戶的關(guān)注者超過了10000。發(fā)現(xiàn)了一些比較有趣用戶,比如熊阿姨等;也發(fā)現(xiàn)熱門的用戶大多都會(huì)貼上自己的微信公眾號(hào),微博等信息;還有很多從05年就開始使用豆瓣的重度用戶,也有很多注銷了的賬號(hào)。雖然我也很多年前就注冊(cè)了豆瓣,但是一直沒有發(fā)現(xiàn)除了發(fā)租房貼,看電影評(píng)價(jià),聽FM(現(xiàn)在已經(jīng)不用了)之外還有什么其它價(jià)值。也許這些人可以給我答案。
總結(jié)
因?yàn)橹皩?duì)Python的了解僅限于語法層面,未接觸過相應(yīng)的生態(tài),比如pip包管理,setuptools等,并且不熟悉相關(guān)的基礎(chǔ)包。所以幾乎得從零開始,是件很頭疼的事情,所幸的是Python的包都比較有名氣,包管理等網(wǎng)絡(luò)上也有很多教程,查找起來都比較容易。感謝互聯(lián)網(wǎng)~
通過test/relation.py測(cè)試發(fā)現(xiàn),目前存在內(nèi)存泄漏問題,但是搗鼓了半天沒有查到問題所在,已經(jīng)沒有興趣繼續(xù)花時(shí)間了~
同上,訪問頻率過高有可能會(huì)觸發(fā)IP封禁,出現(xiàn)Please try later以及檢測(cè)到你的IP有非正常請(qǐng)求發(fā)出balabala提示~
同上,現(xiàn)在4個(gè)線程中每個(gè)請(qǐng)求之前間隔時(shí)間調(diào)整到了3秒,再也沒有出現(xiàn)IP封禁的提示~
客戶端架構(gòu)存在很大問題:比如無法動(dòng)態(tài)更新會(huì)話信息,頻繁獲取模塊有額外的性能開銷等,需要重新設(shè)計(jì)整體架構(gòu),同樣已經(jīng)沒有興趣了,等以后有心情再更新吧~
分不清賬號(hào)和帳號(hào), 帖子和貼子,求語文老師
總結(jié)
以上是生活随笔為你收集整理的爬虫软件python彻底卸载_Python爬虫实践:如何优雅地删除豆瓣小组的帖子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python删除列表中字符串_pytho
- 下一篇: 快速获取csv数量_【数量技术宅|数据爬