Python編程實(shí)現(xiàn)簡(jiǎn)單的微博自動(dòng)點(diǎn)贊
覺得微博手動(dòng)點(diǎn)贊太過(guò)麻煩?
其實(shí)自動(dòng)點(diǎn)贊的實(shí)現(xiàn)并不困難!
本篇會(huì)有Cookie、session和token方面的知識(shí),不太了解的可以先看下
web前端cookie session及token會(huì)話機(jī)制詳解
我們先通過(guò)前兩個(gè)小節(jié)大概了解一下我們Python登錄微博的原理,然后第三小節(jié)就會(huì)跟大家介紹微博自動(dòng)點(diǎn)贊的代碼。
一、實(shí)現(xiàn)登陸微博功能
首先進(jìn)入微博頁(yè)面后按F12打開開發(fā)者工具,將如圖的按鈕點(diǎn)擊后,在瀏覽器中手動(dòng)登陸一次,在Network 標(biāo)簽的XHR類型中找到Login請(qǐng)求標(biāo)簽,在Form data下我們可以看到username(用戶名)和password(密碼),并知道了請(qǐng)求方式是POST,請(qǐng)求的參數(shù)有很多我們直接照搬就是。
網(wǎng)頁(yè)截圖
這時(shí),可能學(xué)過(guò)一些爬蟲的同學(xué)便會(huì)直接上手寫出如上雷同的代碼,但發(fā)現(xiàn)出不來(lái)結(jié)果
會(huì)報(bào)錯(cuò)的代碼
import requests headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' } login_data = { 'username': '你的用戶名', 'password': '你的密碼', 'savestate': '1', 'r': 'https://m.weibo.cn/?jumpfrom=weibocom', 'ec': '0', 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom', 'entry': 'mweibo', 'wentry': '', 'loginfrom': '', 'client_id': '', 'code': '', 'qq': '', 'mainpageflag': '1', 'hff': '', 'hfp': '', } login_req = requests.post('https://passport.weibo.cn/sso/login', data=login_data, headers=headers) print(login_req.status_code)
這是因?yàn)橛行┚W(wǎng)站并不只是按照'user-agent'判斷用戶的正常訪問(wèn)的。那我們還需點(diǎn)開Request Headers(請(qǐng)求頭)檢查可能還有什么字段會(huì)用來(lái)判斷用戶正常訪問(wèn)
一般 referer(請(qǐng)求來(lái)源頁(yè)面)、origin(誰(shuí)發(fā)起的請(qǐng)求)、host(主機(jī)名及端口號(hào)) 字段也常被用于反爬蟲,當(dāng)我們的爬蟲無(wú)法正常獲取數(shù)據(jù)時(shí),我們可以將請(qǐng)求頭里的這些字段照搬進(jìn)去試試。經(jīng)過(guò)驗(yàn)證,微博網(wǎng)頁(yè)是以referer 來(lái)判斷是否是用戶正常訪問(wèn)。最后我們還可以把Cookie放進(jìn)代碼里,這樣就不用在代碼里輸入賬號(hào)密碼了。
要注意Cookie并不是永久有效的,若發(fā)現(xiàn)自動(dòng)登錄失敗,可以重新上網(wǎng)頁(yè)把新的Cookie復(fù)制下來(lái)更換
完整的代碼如下
import requests headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'referer': 'https://passport.weibo.cn/signin/login? entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom', 'cookie': '你的cookie' } login_data = { 'savestate': '1', 'r': 'https://m.weibo.cn/?jumpfrom=weibocom', 'ec': '0', 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom', 'entry': 'mweibo', 'wentry': '', 'loginfrom': '', 'client_id': '', 'code': '', 'qq': '', 'mainpageflag': '1', 'hff': '', 'hfp': '', } login_req = requests.post('https://passport.weibo.cn/sso/login', data=login_data, headers=headers) print(login_req.status_code) #輸出200則代表登錄成功
二、實(shí)現(xiàn)發(fā)送微博
既然都登陸微博了,我們先試試能不能順便發(fā)微博吧
同樣的,在微博編輯頁(yè)面點(diǎn)擊F12進(jìn)入開發(fā)者工具,我們先試試發(fā)送一個(gè)微博,Network標(biāo)簽會(huì)出現(xiàn)什么新的內(nèi)容吧
網(wǎng)頁(yè)截圖
當(dāng)微博界面點(diǎn)擊發(fā)送之后,Network標(biāo)簽就會(huì)出現(xiàn)update的請(qǐng)求,點(diǎn)進(jìn)去可以看到,請(qǐng)求地址是https://m.weibo.cn/api/statuses/update,請(qǐng)求方法是 POST。參數(shù)有兩個(gè)一個(gè)是content 也就是發(fā)送的微博內(nèi)容,另一個(gè)是st,這里的st通過(guò)幾次的檢驗(yàn),猜測(cè)應(yīng)該是網(wǎng)站的反爬蟲措施。這里獲得st的方法是通過(guò)同為Network標(biāo)簽下的config請(qǐng)求,里面存放了st值,我們將 JSON 格式的字符串轉(zhuǎn)換為字典,然后取到 st 的值
方法
config_req = session.get('https://m.weibo.cn/api/config') config = config_req.json() st = config['data']['st'] print(st)#每隔一段時(shí)間st值會(huì)改變
登錄和發(fā)送微博的完整代碼如
import requests headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom', 'cookie': '你的cookie' } login_data = { 'savestate': '1', 'r': 'https://m.weibo.cn/?jumpfrom=weibocom', 'ec': '0', 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom', 'entry': 'mweibo', 'wentry': '', 'loginfrom': '', 'client_id': '', 'code': '', 'qq': '', 'mainpageflag': '1', 'hff': '', 'hfp': '', } # 使用 session來(lái)保留登錄狀態(tài) session = requests.Session() session.headers.update(headers) login_req = session.post('https://passport.weibo.cn/sso/login', data=login_data) # 獲取 st 請(qǐng)求 config_req = session.get('https://m.weibo.cn/api/config') config = config_req.json() st = config['data']['st'] compose_data = { 'content': input("請(qǐng)輸入發(fā)送的內(nèi)容:"),, 'st': st } compose_req = session.post('https://m.weibo.cn/api/statuses/update', data=compose_data) print(compose_req.json()) # 輸出:{'ok': 1, 'data': 省略部分內(nèi)容...}
調(diào)整結(jié)構(gòu)后的代碼(功能一樣)如
import requests class WeiboSpider: def __init__(self): self.session = requests.Session() self.headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom', 'cookie': '你的Cookie' } self.session.headers.update(self.headers) def login(self): login_data = { 'savestate': '1', 'r': 'https://m.weibo.cn/?jumpfrom=weibocom', 'ec': '0', 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom', 'entry': 'mweibo', 'wentry': '', 'loginfrom': '', 'client_id': '', 'code': '', 'qq': '', 'mainpageflag': '1', 'hff': '', 'hfp': '', } self.session.post('https://passport.weibo.cn/sso/login', data=login_data) def get_st(self): config_req = self.session.get('https://m.weibo.cn/api/config') config = config_req.json() st = config['data']['st'] return st def compose(self, content): compose_data = { 'content': content, 'st': self.get_st() } compose_req = self.session.post('https://m.weibo.cn/api/statuses/update', data=compose_data) print(compose_req.json()) def send(self, content): self.login() self.compose(content) weibo = WeiboSpider() weibo.send(input("請(qǐng)輸入發(fā)送的內(nèi)容:"))
三、實(shí)現(xiàn)微博自動(dòng)點(diǎn)贊
完整的代碼
import requests class WeiboSpider: def __init__(self): self.session = requests.Session() self.headers = { 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36', 'referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=https%3A%2F%2Fm.weibo.cn%2F%3Fjumpfrom%3Dweibocom', 'cookie': '你的cookie' } self.session.headers.update(self.headers) def login(self): login_data = { 'savestate': '1', 'r': 'https://m.weibo.cn/?jumpfrom=weibocom', 'ec': '0', 'pagerefer': 'https://m.weibo.cn/login?backURL=https%253A%252F%252Fm.weibo.cn%252F%253Fjumpfrom%253Dweibocom', 'entry': 'mweibo', 'wentry': '', 'loginfrom': '', 'client_id': '', 'code': '', 'qq': '', 'mainpageflag': '1', 'hff': '', 'hfp': '', } self.session.post('https://passport.weibo.cn/sso/login', data=login_data) def get_st(self): config_req = self.session.get('https://m.weibo.cn/api/config') config = config_req.json() st = config['data']['st'] return st def compose(self, content): compose_data = { 'content': content, 'st': self.get_st() } compose_req = self.session.post('https://m.weibo.cn/api/statuses/update', data=compose_data) print(compose_req.json()) def send(self, content): self.login() self.compose(content) # 獲取微博列表 def get_weibo_list(self): params = { 'type': 'uid', 'value': '2139359753', 'containerid': '1076032139359753' } weibo_list_req = self.session.get('https://m.weibo.cn/api/container/getIndex', params=params) weibo_list_data = weibo_list_req.json() weibo_list = weibo_list_data['data']['cards'] return weibo_list # 點(diǎn)贊微博 def vote_up(self, id): vote_up_data = { 'id': id, # 要點(diǎn)贊的微博 id 'attitude': 'heart', 'st': self.get_st() } vote_up_req = self.session.post('https://m.weibo.cn/api/attitudes/create', data=vote_up_data) json = vote_up_req.json() print(json['msg']) # 批量點(diǎn)贊微博 def vote_up_all(self): self.login() weibo_list = self.get_weibo_list() for i in weibo_list: # card_type 為 9 是正常微博 if i['card_type'] == 9: self.vote_up(i['mblog']['id']) weibo = WeiboSpider() weibo.vote_up_all()
謝謝大家,Python的分享就到此為止,以后如果有好玩的Python程序,我還會(huì)繼續(xù)向大家分享的,希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。