本帖最后由 redblue 于 2020-6-3 21:39 编辑
[Python] 纯文本查看 复制代码 import datetime
import os
import re
import requests
import bs4
# 获取关注的所有贴吧链接
def get_tieba_link():
url = 'http://tieba.baidu.com/f/like/mylike?&pn='
page = 1
links = []
while True:
response = requests.get(url + str(page), headers=headers)
bs = bs4.BeautifulSoup(response.text, 'lxml')
for a in bs.select('table tr>td:first-child>a'):
links.append({'href': a.get('href'), 'name': a.string})
if '下一页' not in str(bs):
break
page += 1
return links
# 从贴吧链接中获取贴吧签到参数
def tieba_batch_sign():
links = get_tieba_link()
for link in links:
response = requests.get('https://tieba.baidu.com/' + link['href'], headers=headers)
tbs_reg = re.compile(r'\'tbs\':\s"(.*?)"')
tbs = tbs_reg.search(response.text).group(1)
if not tbs: # 如果tbs不存在则跳过本次循环
continue
param = {'ie': 'utf-8', 'kw': link['name'], 'tbs': tbs}
response = requests.post('https://tieba.baidu.com/sign/add', data=param, headers=headers)
result = response.json()
if result['no'] == 0:
msg = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' ' + link['name'] + ' 签到成功\n'
else:
msg = str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + ' ' + link['name'] + ' ' + result[
'error'] + '\n'
print(msg)
with open(os.path.join(os.getcwd(), 'sign.log'), 'a+') as loghandle:
loghandle.write(msg)
if __name__ == '__main__':
headers = {
'cookie': 'xxxxxxxxxxxx'
}
tieba_batch_sign()
问题分析1.获取登录百度贴吧的cookie,在后面请求中都跟上这个cookie
2.获取所有关注的贴吧在百度贴吧首页(https://tieba.baidu.com/)观察发现,不能直接获取到所有的吧的链接和名称,查看更多里显示的不能直接获取
既然在首页获取不到,那就换个地方获取,经过观察在我的关注贴吧页面(http://tieba.baidu.com/i/i/forum)似乎可以获取到所有贴吧的信息,
然而写代码的时候还是找不到,打开这个页面的源码看看
源码里面这个div中时空的,说明贴吧的信息是通过另外的请求加载上的,所以我们可以去观察开发者工具里的网络请求信息
分析上图中的请求,可以发现http://tieba.baidu.com/f/like/mylike?v=1591188824982才是真正获取贴吧信息的页面
3.获取签到链接和签到参数找一个还没有签到的贴吧,签到看看
从图中可以得知请求地址、请求方式、和请求参数
4.分析签到参数在上一步中得到了请求参数,参数中前面两个还好说,最后一个tbs似乎不知道哪里来的,我们根据上图中的tbs值,在这个页面源码里查找这个值
接下来只要用正则匹配将tbs的值匹配出来就好了。
5.发送签到请求
前面的准备工作都做好了,现在就直接发送请求就好了,注意请求方式是post
6.部署到服务器上,每天零点种就开始执行签到
0 0 * * * python /tieba_batch_sign.py > /dev/null |