前面的文章《Python爬虫 - 01.实现贴吧一键签到》实现了贴吧一键签到,但是贴吧一键签到的功能有很多限制,每天只能一点后才能用,而且一次只能签到50个吧,所以我们换一种思路避开这些限制,实现随时随地签到

一、分析

我们要先获取到关注的贴吧列表信息,然后逐一进行签到

  1. 获取贴吧关注列表
  2. 获取贴吧签到的接口信息
  3. 遍历贴吧列表,发送请求进行签到

二、获取贴吧关注列表

获取贴吧关注列表有几种方法可以实现

  1. 通过baidu贴吧提供的功能"我的贴吧",从HTML中提取到贴吧列表信息
  2. 从贴吧首页中去提取关注列表信息

第一种比较麻烦,如果页数比较多发送的请求也相应增多,还需要解析HTML,效率低下,而且信息量没有那么全面
所以我推荐用第二种

打开贴吧首页,按F12打开浏览器开发者工具,选择网络标签。在贴吧首页中,我们可以看到 爱逛的吧下面就是你的关注列表,但这个关注列表由于只显示部分吧,剩下的被隐藏了,我们把鼠标放到查看更多上,剩下的就会显示出来,这里要观察开发者工具中网络的变化,发现并没有发送网络请求,说明这些数据不是通过AJAX请求拿到的,而是在网页加载的时候就是已经加载到了过来了。

下面我们分别从HTML,JS以及本地存储中查找这个关注列表的信息
首先从HTML中查找,选择查看器,首先定位到这个查看更多弹出的组件,这个组件有个标题是常逛的吧,按Ctrl+F搜一下这个标题,有两个结果,第二个就是这个组件,里面的内容包含了隐藏的贴吧列表信息,这样我们可以通过解析HTML拿到关注贴吧的列表。

除了这种解析HTML的方法,是否还有其他方法呢?答案是有,查找JS信息
首先我们拿到一个吧的id,搜data-fid即可,例如我关注的帝吧(李毅吧),id为59099,我们在查看器中搜索59099,会出来3个结果,排除掉HTML标签,剩下两个是包含在script中的内容,把他们复制出来分析一下
第一个script中的内容格式化后如下

_.Module.use('spage/widget/forumDirectory',{"forums": [{"user_id": 38947xxx,"forum_id": 59099,"forum_name": "\u674e\u6bc5","is_like": 0,"is_black": 0,"like_num": 0,"is_top": 0,"in_time": 1632026524,"level_id": 10,"level_name": "\u62a0\u811a\u5927\u6c49","cur_score": 2474,"score_left": 526,"is_sign": 0},//...//...],"directory": {...}
})

第二个script中的内容如下:

_.Module.use("spage/widget/AsideV2",
[[{"user_id": 38947xxx,"forum_id": 59099,"forum_name": "\u674e\u6bc5","is_like": 0,"is_black": 0,"like_num": 0,"is_top": 0,"in_time": 1632026524,"level_id": 10,"level_name": "\u62a0\u811a\u5927\u6c49","cur_score": 2496,"score_left": 504,"is_sign": 1},//...//...]
])

从上面两段内容,我们可以看出,这脚本中的数据就是贴吧关注列表的信息,包含了贴吧id,名字,经验,是是否签到等信息,只要把这其中的列表提取出来即可,上面两个任意一个都可以,因为他们的数据 是相同的。

三、获取贴吧签到的接口信息

点进一个贴吧,按F12打开开发者工具,然后点击签到就拿到了这个签到接口

接口地址:

https://tieba.baidu.com/sign/add

这是一个POST请求,带有三个请求参数

{'ie': 'utf-8',
'kw': 'python',
'tbs': '222b0543ebe394f916324xxxxx'
}

这三个参数分别是编码,贴吧的名字和一个tbs参数,tbs参数上一篇已经说过如何提取,这里就不重复了。

没看过的上一篇文章的朋友可以先去看一下,传送门:《Python爬虫 - 01.实现贴吧一键签到》

tbs参数是可以重复使用的,只要我们拿到一个即可,不用每个请求都要重新拿一次新的值

四、编码实现

下面开始编码实现

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
实现百度贴吧签到
API:
一键签到 POST https://tieba.baidu.com/tbmall/onekeySignin1
逐个签到 POST https://tieba.baidu.com/sign/add注意事项:
1、百度贴吧0点到1点是不能够使用一键签到的,所以要逐个贴吧进行签到
'''
__author__ = "Conca"import requests
import re
import time
import json
import random# 请求头信息,定义为全局方便重用
headers = {"User-Agent": "Firefox/92.0", # 替换为你的UA"Referer": "https://tieba.baidu.com/","Cookie": "your cookie xxxxxxxxxxxxxx", # 替换为你的cookie
}# 从HTML中获取tbs参数和贴吧关注列表
def getTiebaInfo():try:url = "https://tieba.baidu.com/"# 发送请求,下载贴吧HTML页面response = requests.get(url, headers=headers)response.raise_for_status()response.encoding = response.apparent_encodinghtml = response.text# 从HTML中提取tbs参数tbs = getTbs(html)# 从HTML中提取贴吧关注列表forums = getAllForums(html)return {"forums": forums, "tbs": tbs}except Exception as e:print("获取贴吧数据失败,原因:", e)return None# 用正则表达示从HTML中提取参数 tbs 的值
def getTbs(html):# 正则表达式学得不太好,用得有点呆板,凑合用match = re.search(r'PageData.tbs = "(.*)";PageData.is_iPad', html)if match:tbs = match.group(0).split('"')[1]return tbsreturn None# 获取关注的贴吧列表
def getAllForums(html):#  _.Module.use('spage/widget/forumDirectory', {"forums": [...],"directory": {}})match = re.search(r'{"forums":\[.*\],"directory"', html)if match:data = match.group(0)forums = json.loads(data[data.find('['):data.rfind("]")+1])return forumsreturn None# 逐个吧签到
def tiebaSigninOneByOne(tiebaInfo):# 签到接口signin_url = "https://tieba.baidu.com/sign/add"tbs = tiebaInfo.get("tbs")# 统计结果success_count = 0fail_count = 0# 签到for forum in tiebaInfo.get("forums"):# 跳过已经签到的贴吧,减少请求次数,防止验证码is_sign = forum.get("is_sign")if is_sign == 1:continue# 构建请求数据forum_name = forum.get("forum_name")sigin_data = {"ie": "utf-8","kw": forum_name,"tbs": tbs,}try:# 发送请求签到response = requests.post(url=signin_url, data=sigin_data, headers=headers)response.raise_for_status()response.encoding = response.apparent_encodingcontent = response.json()# 判断签到结果,打印消息if content.get("no") == 0:success_count += 1print("{}吧签到成功".format(forum_name))else:fail_count += 1print("{}吧签到失败,失败原因:{}".format(forum_name, content.get("error")))except Exception as e:fail_count += 1print("Error: {}吧签到发生错误,{}".format(forum_name, e))# 随机睡眠1-5秒,防止弹验证码,自动化不追求速度,一切求稳second = random.randint(1, 5)time.sleep(second)print("本次签到成功%d个,失败%d个" % (success_count, fail_count))# 主方法
def main():print("-----------百度贴吧开始签到-------------")tiebaInfo = getTiebaInfo()if tiebaInfo:tiebaSigninOneByOne(tiebaInfo)else:print("签到失败")print("-----------百度贴吧签到结束-------------")if __name__ == "__main__":main()

到此就实现了贴吧签到的功能

Python爬虫 - 02.实现贴吧签到相关推荐

  1. Python爬虫-02 request模块爬取妹子图网站

    简介 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载 ...

  2. 【python爬虫02】使用Scrapy框架爬取拉勾网招聘信息

    使用Scrapy框架爬取拉勾网招聘信息 最近接触了Scrapy爬虫框架,简单写了个爬虫爬取拉钩网的招聘信息,加深对Scrapy框架的理解,不得不说Scrapy框架其实还是蛮方便的,就像爬虫流水线一样, ...

  3. python爬虫02

    import urllib.request url = "http://placekitten.com/1000/1000" obj = urllib.request.urlope ...

  4. [Python]爬虫02:用Beautifulsoup抓取的网页中有br标签,返回字符串为None,先用replace去除网页中br再抓内容。

    问题:用Beautifulsoup抓取网页,网页中含有br标签,抓取相关的内容结果是None. 试了用字符串的replace函数替换br,还是返回None.试了用re正则替换br,提示返回类型错误. ...

  5. python脚本自动qq签到_Python爬虫实现自动登录、签到功能 附代码

    这篇文章主要介绍了Python爬虫实现自动登录.签到功能的代码,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 前几天在一个素材网站上下载东 ...

  6. python玩微信小程序游戏_使用python实现微信小程序自动签到功能

    功能描述目标 完成多账号微信小程序每天自动签到 输出 签到成功则向微信群发送签到成功的信息 否则提示用户签到失败,需手动签到 包管理 requests itchat time threading 程序 ...

  7. 使用python实现微信小程序自动签到2.0

    微信小程序自动签到 功能描述 目标 输出 包管理 程序的结构设计 步骤1 步骤2 步骤3 步骤4 代码实现 使用findler抓包工具查看请求类型 再次使用findler抓包,查看请求内容 使用多线程 ...

  8. Python爬虫入门教程 90-100 凌晨5点的CSDN自动签到器,用Python爬虫干点闲事

    梦想橡皮擦:这是爬虫百例的第90篇文章,写到这里非常感慨,从第一篇文章在2018年7月30日发布至今已经将要过去2年的时间,即将到达终点.虽然过程中多次因为工作原因导致断更了,但是终于把这个系列坚持了 ...

  9. Python爬虫入门教程02:小说爬取

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前文 01.python爬虫入门教程01:豆瓣Top电影爬取 基本开发环境 Python 3 ...

  10. python爬虫 小白轻松从0到1_如何从0到1,学习Python的流程【小白入门】

    Hello World! 写下Hello World是你在学任何编程语言时做的第一件事,除了让你对第一次代码运行感到兴奋,它也会帮你检测目前运行环境是否正常. 我们第一个运行的程序! 重点 可读性-- ...

最新文章

  1. 独家 | 图片主题建模?为什么不呢?!
  2. js实现数独算法(优化版本)
  3. J2ME开发心得-数组的使用
  4. 【windows】安装pytorch1.7.1-cpu版本的geometric过程记录
  5. 数据结构 树和二叉树
  6. Logtail 混合模式:使用插件处理文件日志
  7. Bootstrap3 带列表组的面板
  8. c语言多线程面试题,iOS面试题--网络多线程
  9. jQuery常用工具方法
  10. Scala编程指南——用更少的字做更多的事
  11. C# IntPtr类型转换
  12. 信息学奥赛一本通C++语言-----1120:同行列对角线的格
  13. Go语言解决读取文件乱码
  14. 期末了,用Python写个自动批改作业系统
  15. impala中 alter table add partition 对HDFS文件权限的影响
  16. LocalDate,LocalDateTime获取每周,每月,每年的第一天和最后一天,获取一周七天的日期,获取每月的所有日期
  17. AW-Convlution:An Attention Module for Convolutional Neural Networks
  18. 工欲善其事,必先利其器————每天十分钟搭建编程环境:Linux下设置雅黑-Consolas混合字体
  19. android记账本的实现
  20. Flutter--分组列表实现思路

热门文章

  1. sin30度用c语言转换弧度制,【数学】弧度和角度的转换
  2. 使用Python开发游戏运行脚本(三)图片查找
  3. 小学计算机专业说课稿模板,小学信息技术说课稿集锦
  4. 低代码平台表单引擎技术方案选型
  5. 《电子DIY》之《单片机实践项目》之proteus中电源配置问题,keil常见错误总结一(九十)
  6. web前端面试过程流程和建议
  7. oracle .net 中文,C# 连接Oracle 中文乱码问题解决办法
  8. 威纶通触摸屏的自由口通讯
  9. 高质量论文配图配色(附RGB值及16进制码)
  10. 普通微型计算机就是多媒体计算机,6-多媒体技术试题