在Python玩转微博中,我么已经实现了自动采集和发布的功能,这里在此基础上实现关注用户、点赞和转发评论的功能。本质上都是寻找网站的URL请求。
关注用户
在微博中关注用户有两种方式:
(1)在用户的某条微博上,在将鼠标移到用户头像时所弹出的窗口中单击“关注”。
(2)在微博用户的首页单击“关注”。
两种关注方式的请求链接是一样的,区别在于请求参数的差异。鳄鱼君Ba通过第二种方式,那么在浏览器上捕捉其请求信息:

请求参数分析可得,参数uid、location、oid和fnick是被关注用户的信息,暂时无法得知被关注用户信息的来源。其余的参数是固定不变的。
从该请求的响应内容分析可得,用户被关注成功之后,网站主要返回JSON数据。观察数据内容,可从“code”的值来判断是否关注成功。
进一步核实被关注用户信息的来源,以“oppo官方”的微博为例,分析查找浏览器在“oppo官方”的微博首页所捕捉的请求信息,最终在Doc标签找到该微博信息:

数据对比得出,参数uid、location、oid和fnick分别对上图的oid、location、oid和onick。代码参考:
import time
# 关注微博,session是用户登录后的会话,follow_url是关注用户的微博主页
def follow_weibo(session,follow_url):
# 构造请求头
headers = {
"Referer": "https://weibo.com/eyujunBa/home?topnav=1&wvr=6",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}
follow_info={'oid':'','onick':'','location':''}
res=session.get(follow_url,headers=headers)
print(res.url)
follow_info['oid']=res.text.split("$CONFIG['oid']=")[1].split(';')[0]
follow_info['onick']=res.text.split("$CONFIG['onick']=")[1].split(';')[0]
follow_info['location']=res.text.split("$CONFIG['location']=")[1].split(';')[0]
# 关注URL,参数_rnd为时间戳
url='https://weibo.com/aj/f/followed?ajwvr=6&__rnd=%s'% (str(int(time.time()*1000)))
data={
"uid":follow_info['oid'],
"objectid":"",
"f":"1",
"extra":"",
"refer_sort":"",
"refer_flag":"1005050001_",
"location":follow_info['location'],
"oid":follow_info['oid'],
"wforce":"1",
"nogroup":"1",
"fnick":follow_info['onick'],
"refer_lflag":"0000015010_",
"refer_from":"profile_headerv6",
"template":"7",
"special_focus":"1",
"isrecommend":"1",
"is_special":"0",
"redirect_url": "%2Fp%2F1005056776904710%2Fmyfollow%3Fgid%3D4296425330676196%23place",
"_t":"0",
}
r=session.post(url,data=data,headers=headers)
# 判断是否关注成功
if r.json()['code']=='100000':
print('关注成功')
return (follow_info['onick'] + '关注成功')
else:
return (follow_info['onick']+'关注失败')
将以上代码存放在文件weibo_follow.py中,代码解释:
(1)函数follow_weibo的参数分别是带有用户信息的会话对象和被关注的微博首页链接。
(2)重新构建请求头,主要在发送关注用户的请求时所使用。
(3)访问被关注用户的首页,获取被关注用户的信息。
(4)对获取的数据构建请求参数,实现发送用户关注请求。
打开修改微博登录文件weibo_login.py,代码如下:
if __name__ == '__main__':
#构造请求头
headers={
"User-Agent":"Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
}
# 代理IP
proxies={}
# 新建回话
session=requests.session()
# 用户账号
user_info=login('鳄鱼君Ba','www.e1yu.com')
# 导入微博关注模块
from weibo_follow import follow_weibo
# 关注用户首页链接
follow_url='https://weibo.com/u/7129023878?refer_flag=0000015010_&from=feed&loc=nickname&is_hot=1&noscale_head=1'
status=follow_weibo(session,follow_url)
微博点赞
这里和关注用户的实现方式大同小异,可以随便选择一个微博用户进行点赞,对网站URL请求进行抓包分析。捕捉到的URL请求如图:

通过对请求进行分析,请求链接的_rnd是当前时间的时间戳乘以1000再取整所得,请求参数分析如下:
(1)参数location代表被点赞的微博用户信息,数据来源可在Doc标签返回的HTML内容中找到。
(2)参数mid数据来源无法得知,点赞不同的微博,其参数值随之变化。
(3)其余参数值固定不变。
根据参数mid的变化规律得知,不同微博的数据会随之变化,那么参数mid可能用于标识微博的唯一性。为了验证猜想是否正确,我们分析浏览器所捕捉到的请求信息,最终在Doc下找到mid的参数值
在Doc标签返回的HTML内容中快速查找(Ctrl+F)参数值(4510983769100523),在HTML里的JavaScript代码中找到参数mid,而且参数mid是重复出现的,且不止一个。因此可以确定,参数mid可在网站返回的HTML中找到。综合上述分析,实现代码如下:
import re
import time
# session是临时会话对象,like_url是用户首页
def like_weibo(session,like_url):
# 获取点赞用户的前10条微博
res=session.get(like_url)
loaction=res.text.split("$CONFIG['location']=")[1].split(';')[0]
# 获取mid
mid_list=re.findall(r'mid=(\d+)&name',res.text,re.S)
# 构建请求头
headers = {
"Referer":like_url,
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}
url='https://weibo.com/aj/v6/like/add?ajwvr=6&__rnd=%s'% str(int(time.time()*1000))
# 点赞功能,默认点赞第一条
data={
"location": loaction,
"version": "mini",
"qid": "heart",
"mid": mid_list[0],
"loc": "profile",
"cuslike": "1",
"floating": "0",
"_t": "0",
}
r=session.post(url,data=data,headers=headers)
# 根据返回内容判断是否点赞成功
if r.json()['code']=='100000':
return '点赞成功'
else:
return '点赞失败'
点赞功能定义为函数like_weibo():函数参数session是会话对象;like_url是被点赞用户的首页链接。函数实现的功能如下:
(1)访问被点赞用户的首页链接,获取用户的location信息和mid_list。mid_list是当前用户的前16条微博mid组成的列表。
(2)构建请求头,作为发送点赞请求的请求头。如果不加请求头,该请求就会被服务器视为非法请求,因为服务器会对请求头的Referer进行检查,这是一种反爬虫机制。
(3)发送点赞请求,将获取的location和mid_list作为请求参数,mid_list默认取第一位元素,即默认点赞第一条微博。
(4)针对请求后的响应内容判断是否点赞成功。
接着在weibo_login.py添加代码:
if __name__ == '__main__':
#构造请求头
headers={
"User-Agent":"Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
}
# 代理IP
proxies={}
# 新建回话
session=requests.session()
# 用户账号
user_info=login('鳄鱼君Ba','www.e1yu.com')
# 导入微博点赞和评论模块
from weibo_forward import like_weibo
like_url='https://weibo.com/ZurichAirport?refer_flag=0000015010_&from=feed&loc=nickname&is_hot=1'
like_weibo(session,like_url)
评论转发
完成微博点赞功能后,接着完成转发评论功能,该功能的实现方式和点赞功能类似。以上述微博用户首页为例,单击转发该用户的第一条微博,勾选“同时评论”选项,在开发者工具看到该请求信息:

从请求信息分析可得,请求链接的_rnd是当前时间的时间戳乘以1000再取整所得,domain是被转发的用户信息,请求参数分析如下:
(1)参数location和mid与点赞功能的请求参数一致。
(2)参数reason是转发内容。
(3)参数pdetail无法确定。
(4)参数pic_id其实就是图片的加密地址,和前面微博发送图片的pic_id一样。
(5)参数is_comment_base代表转发时的“同时评论”选项。
(6)其余参数值固定不变。
为了确定参数pdetail的数据来源,查找分析浏览器所捕捉到的请求信息,最后在Doc下找到该参数的数据来源,该参数代表被转发微博的用户信息。这里还是在微博用户首页的$CONFIG[‘page_id’]的参数,这里就不再放图片了,比较简单。综上分析,代码参考:
# 转发评论微博
def forward_weibo(session,forward_url,reason):
# 获取点赞用户的前10条微博
res=session.get(forward_url)
# 获取location
location=res.text.split("$CONFIG['location']")[1].split(';')[0]
page_id=res.text.split("$CONFIG['page_id']")[1].split(';')[0]
domain=res.text.split("$CONFIG['domain']")[1].split(';')[0]
# 获取mid
mid_list=re.findall(r'mid=(\d+)&name',res.text,re.S)
# 构建请求头
headers = {
"Referer": forward_url,
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
}
# 转发评论
url='https://weibo.com/aj/v6/mblog/forward?ajwvr=6&domain='+domain+'&__rnd=%s'%str(int(time.time()*1000))
data={
"pic_src": "",
"pic_id":"" ,
"appkey":"" ,
"mid": mid_list[0],
"style_type": "1",
"mark": "999_reallog_mark_ad:999|WeiboADNatural",
"reason":reason,
"location":location,
"pdetail":page_id,
"module":"",
"page_module_id":"",
"refer_sort":"" ,
"is_comment_base":"1",
"rank":"0",
"rankid": "",
"isReEdit": "false",
"_t": "0",
}
r=session.post(url,data=data,headers=headers)
# 根据返回数据判断是否成功
if r.json()['code']=='100000':
return '转发成功'
else:
return '转发失败'
转发评论功能定义函数forward_weibo():函数参数session是会话对象;forward_url是被转发评论用户的首页链接;reason是转发的评论内容。函数的功能逻辑与点赞功能大致相同,此处不做详细讲解。
将上述函数like_weibo()和forward_weibo()保存在文件weibo_forward.py中,代码与20.6节的运行方式一样,打开修改微博登录文件weibo_login.py,代码如下:
# 导入微博点赞和评论模块
from weibo_forward import like_weibo,forward_weibo
like_url='https://weibo.com/ZurichAirport?refer_flag=0000015010_&from=feed&loc=nickname&is_hot=1'
like_weibo(session,like_url)
# 评论转发微博
reason='鳄鱼君Ba(www.e1yu.com)免费软件分享者'
forward_weibo(session,follow_url,reason)
到这里已经实现了微博的采集、发布、用户关注、点赞和评论转发的功能,代码比较零散,需要自行整理采集发布!
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!