写在前面
作为一个水笔,我的梦想是无休止的灌水,无休止的经验+3,所以写了这么一个东西帮我灌水!需要的参数是cookie中的BDUSS,如何获取,咳咳,百度一下就好了嘛。
包和全局变量
#网页请求
import requests
#对变量进行深拷贝
import copy
#时间、正则
import time,re
#网页解析
from bs4 import BeautifulSoup as bs
#请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",
}
#拷贝一个请求头用于评论,等下会补充一个字段
headers_send = copy.copy(headers)
#获取tbs的接口,tbs用于验证用户身份的有效性
TBS_URL = "http://tieba.baidu.com/dc/common/tbs"
#贴吧的评论接口
ADD_URL = "https://tieba.baidu.com/f/commit/post/add"
获取已有页数
"""
url为当前页的地址,tid是帖子唯一标识符,是url中的一串数字
get_page字段默认为False,此时会输出帖子已有的评论
指定为True时,会补齐headers并中断函数
"""
def get_comment(url,tid,get_page=False):
#请求帖子的第一页,不需要带cookie
req = requests.get(url = url,headers = headers)
#正则匹配,获取帖子总页数,会匹配到两个字段,都是一样的
pattern = re.compile('<span class="red">(.*?)</span>')
page_num = int(re.findall(pattern,req.text)[0])
#如果get_page为True,则为headers添加Referer字段
#缺少此字段的话,评论发送成功但无法显示
if get_page:
headers_send['Referer'] = 'https://tieba.baidu.com/p/{}?pn={}'.format(tid,page_num)
return
else:
#更改编码格式
req.encoding = 'utf-8'
#利用bs4解析网页,抓取评论
html = bs(req.text,'lxml')
comments = html.find_all('div',class_ = 'd_post_content j_d_post_content')
#逐条输出,调用strip方法删除开头的空格
#注意,无法输出滑稽等泡泡表情(图片什么的更不要想了)
for comment in comments:
print(comment.text.strip())
#返回帖子总页数,用于抓取余下的评论
return page_num
评论模块
"""
tid为帖子唯一标识符,content为灌水内容
Cookie仅需要BDUSS,tbs用于验证用户身份的合法性
"""
def send_comment(tid,content,Cookie,tbs):
#构造post请求所需参数
data = {
'tid': tid,
"tbs": tbs,
'content': content,
}
#带上参数发起post请求
req = requests.post(url = ADD_URL,data = data,cookies = Cookie,headers = headers_send)
#获取post请求的response信息,并转换为json字典
post_status = req.json()
#如果发送成功的话,err_code是0
if post_status['err_code'] == 0:
print('{}发布成功'.format(content))
else:
#输出错误信息
print(post_status)
控制函数
#这里预定义了一个参数,默认为False
#此时不会发起灌水,而只是获取已有楼层信息
def run(send:bool = False):
#要灌水的帖子地址,后面一串星号就是帖子的tid
url = "https://tieba.baidu.com/p/**********"
#用split方法将tid分离出来
tid = url.split('/')[-1]
#如果send为False,则输出已有楼层
if not send:
#获取第一页的同时获取总页数
page_num = get_comment(url = url,tid = tid)
#总页数超过一页才有继续执行的必要
if page_num >= 2:
for i in range(2,page_num + 1):
#拼接当前页的url
url = "https://tieba.baidu.com/p/{}?pn={}".format(tid,i)
#获取当前页的评论
get_comment(url = url,tid = tid)
#身为爬虫一定要有基本的节操....
time.sleep(3)
#如果send为True
else:
#调用get_comment函数补充headers_post
get_comment(url = url,get_page = True,tid = tid)
#在这里写你的BDUSS,至于如何获取,百度一下嘛!
Cookie = {'BDUSS':''}
#经验加3,岂不美哉?
content = '经验加3!告辞!'
#获取tbs,获取一次就够了,这里必须带上cookie
tbs = requests.post(url=TBS_URL, headers=headers_get, cookies=Cookie).json()['tbs']
"""
开始灌水吧!!!10次不够改成100次
当然,你肯定不想一直对同一个帖子灌水
可以写个函数批量获取帖子链接
本篇博客里面当然没有这种函数
"""
for i in range(10):
send_comment(tid = tid,content = content,Cookie = Cookie,tbs = tbs)
#暂停10秒,否则百度会化身大禹来治你!
time.sleep(10)
#入口函数
if __name__ == '__main__':
#要灌水的话把参数改成True
run(send = False)
写在后面
最近还写了requests贴吧签到脚本,部署到服务器就能实现云签到,对单个贴吧签到只需要BDUSS和贴吧名,前提是已关注对应的吧,获取所有关注的吧则需要额外的PTOKEN或STOKEN字段(两者选其一,BDUSS和PTOEKN是获取STOKEN的关键,获取关注的吧需要BDUSS和STOKEN),目前不清楚PTOKEN的生成规则,看着像32位小写的md5密文。抽空整理一下再写一篇文章。