『python爬虫』requests实战-精易论坛自动签到(保姆级图文+实现代码)

news2024/11/15 13:27:35

目录

    • 实现效果
    • API命令解析
      • re.findall 匹配内容,用于在我们得到的网页源码中查找指定的内容
      • session.post() 和 session.get()
    • 实现思路
      • cookie怎么抓取
      • cookie登录如何实现
      • 得到FORMHASH参数
      • 自动签到
      • 自动评分
    • 实现代码
    • 后续优化
    • 总结


欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中

实现效果

在这里插入图片描述


API命令解析

re.findall 匹配内容,用于在我们得到的网页源码中查找指定的内容

在这个示例中,我们使用 re.findall() 查找了字符串 text 中所有的数字,并将它们以列表的形式返回给变量 numbers。r’\d+’ 是一个正则表达式模式,用于匹配一个或多个数字。

你可以根据实际需要调整正则表达式模式,以便在字符串中查找特定的内容。

希望这个示例对你有所帮助。如果你有任何其他问题,欢迎随时向我提问。

import re
# 匹配所有数字
text = "The recipe calls for 2 cups of sugar and 1 cup of flour."
numbers = re.findall(r'\d+', text)
print(numbers)  # 输出 ['2', '1']

session.post() 和 session.get()

都是 requests 库中的方法,用于发送 HTTP 请求。

session.get() 方法用于发送 GET 请求,而 session.post() 方法用于发送 POST 请求。通常情况下,GET 请求用于获取数据,POST 请求用于提交数据。

以下是一个示例代码,演示如何使用 session.get() 和 session.post() 方法发送 HTTP 请求

import requests

# 创建 Session 对象
session = requests.session()

# 发送 GET 请求
response = session.get('http://example.com')

# 发送 POST 请求
data = {'username': 'user', 'password': 'pass'}
response = session.post('http://example.com/login', data=data)

在这个例子中,我们首先创建了一个 Session 对象,并将其赋值给变量 session。然后,我们使用 session.get() 方法发送了一个 GET 请求,并将响应保存到变量 response 中。接下来,我们使用 session.post() 方法发送了一个 POST 请求,并将表单数据传递给服务器。

需要注意的是,使用 session 对象发送请求时,所有的请求都会使用同一个 Session,这可以确保在多个请求之间共享 Cookies 等信息。

实现思路

因为日常登录有滑块验证码,所以打算采用cookie的方式登录访问,同时涉及多个请求,就用requests和配套的lxml,匹配元素有用到re库用于正则匹配.

import requests
import re
import time
from lxml import etree

cookie怎么抓取

一般性的思路都是f12打开网络抓包,在登录页面的跳转时分析.
在这里插入图片描述
登录的一瞬间你最先看到了login.html,反正一般来说找这种login的(除非写网页的是什么特殊写法的自学成才的```一般都是有login字眼的)
在这里插入图片描述
在请求表头中找到cookie
在这里插入图片描述

cookie登录如何实现

requests.session() 是一个类,用于创建一个全局的 Session 对象,该对象可以跨请求保持某些参数,比如 Cookies。在使用 requests 库发送多个请求时,使用 Session 对象可以减少重复操作,提高代码执行效率。

使用 requests.session() 创建 Session 对象后,你可以像使用 requests.get() 或 requests.post() 一样发送 HTTP 请求,只不过在发送请求时,session 对象会自动记录 Cookies。这样就可以保持用户的登录状态,或者利用 Cookies 等信息来实现其他功能。

下面的代码中同时用到了伪装请求头,最终的rep是返回的网页源码.

    headers = {
        'cookie': 'xxxxxx',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
    }

    session = requests.session()

    url_page = 'https://bbs.125.la/plugin.php?id=dsu_paulsign:sign'
    #1.登录得到帖子
    rep = session.get(url=url_page, headers=headers)#rep是返回的网页源码

得到FORMHASH参数

如果没有传入"FORMHASH"参数会报错
在这里插入图片描述

    hot_message = re.findall(r'/thread-14(.*).html" target="_blank"', rep.text)#获取首页热门的帖子地址
    # print(hot_message)
    #['812294-1-1', '812481-1-1', '812254-1-1', '812156-1-1', '812348-1-1', '812474-1-1', '812182-1-1', '812359-1-1', '812267-1-1', '812159-1-1', '810464-1-1', '810459-1-1', '810334-1-1', '808876-1-1', '807810-1-1', '766025-1-1', '777673-1-1', '793375-1-1', '783395-1-1', '804966-1-1']

    formhash = re.findall(r'formhash=(.*)">退出', rep.text)
        print("formhash:{}".format(formhash))#['e5eexxxx]
    # formhash=xxxxxxx 看起来是一个表单提交时的参数。
    # formhash 是一个用于防止 CSRF(跨站请求伪造)攻击的安全令牌,也是后面签到需要用到的参数。
    url_page = 'https://bbs.125.la/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1'

自动签到

抓到了签到的包
在这里插入图片描述

请求网址:
https://bbs.125.la/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1
    rep = session.post(url=url_page, headers=headers,
                       data={'formhash': formhash, "submit": "1", "targerurl": "", "todaysay": "", "qdxq": "kx"})
    print("签到结果:" + re.findall(r'{"status":0,"msg":"(.*)"}', rep.text)[0])

自动评分

#3.自动评分
    for i in range(0, len(hot_message)):
        url_page = 'https://bbs.125.la/thread-14' + hot_message[i] +'.html'
        rep = session.get(url=url_page, headers=headers)
        if rep.status_code == 200:
            print('进入帖子详情页成功')
            tree = etree.HTML(rep.text)
            a_list = tree.xpath('//*[@id="ak_rate"]/@onclick')
            addr = a_list[0]
            str1 = addr.split(',')
            str2 = str1[1].split('&')
            tid1 = str2[2]
            pid1 = str2[3]
            tid2 = tid1.split('=')[1]
            pid2 = pid1.split('=')[1]
            pid3 = pid2.split('\'')[0]
            tid = tid2
            pid = pid3  # 获取到tid与pid
            formash1 = tree.xpath('//*[@id="vfastpost"]/input/@value')
            formash = formash1[0]  # 获取到formash
            # print("获取pid={}与tid={}与formash={}成功,开始自动评分".format(pid, tid, formash))
            # 开始评分
            url_score = 'https://bbs.125.la/forum.php?mod=misc&action=rate&ratesubmit=yes&infloat=yes&inajax=1'
            data = 'formhash=' + formash + '&tid=' + tid + '&pid=' + pid + '&referer=https%3A%2F%2Fbbs.125.la%2Fforum.php%3Fmod%3Dviewthread%26tid%3D' + tid + '%26page%3D0%23pid' + pid + '&handlekey=rate&score4=%2B1&reason=%E6%84%9F%E8%B0%A2%E5%88%86%E4%BA%AB%EF%BC%8C%E5%BE%88%E7%BB%99%E5%8A%9B%EF%BC%81%7E'
            headers['Content-Type'] = 'application/x-www-form-urlencoded'
            headers['Referer'] = 'https://bbs.125.la/thread-14720892-1-1.html'

            rep_score = session.post(url=url_score, data=data, headers=headers) #开始评分请求,rep_score是评分返回的源码

            rep_score_result=rep_score.status_code # 200表示评分成功
            if rep_score_result==200:
                print("评分推送成功,任务:{}".format(i))
            else:
                print("评分推送失败,任务:{}".format(i))


            score_message=re.findall(r'CDATA\[(.*)<scrip', rep_score.text)[0]
            result = re.search(r'class="showmenu">积分: (\d+)</a>', rep.text)
            if result:
                number = result.group(1)  # 提取匹配到的数字部分
                print("评分反馈:{},积分:{}".format(score_message,number))
            else:
                number=-1
                print("未找到匹配的内容,积分:{}".format(number))

            time.sleep(2)
            error_limit = rep_score.text.find("超过限制")
            if error_limit != -1:
                print("已经完成评分次数{},24小时评分数超过限制,退出".format(i))
                break;
        else:
            print('进入帖子失败')

实现代码

import requests
import re
import time
from lxml import etree


def dailyTask():
    headers = {
        'cookie': 'xxxxxxxxx',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'
    }

    session = requests.session()

    url_page = 'https://bbs.125.la/plugin.php?id=dsu_paulsign:sign'
    #1.登录得到帖子
    rep = session.get(url=url_page, headers=headers)#rep是返回的网页源码

    hot_message = re.findall(r'/thread-14(.*).html" target="_blank"', rep.text)#获取首页热门的帖子地址
    # print(hot_message)
    #['812294-1-1', '812481-1-1', '812254-1-1', '812156-1-1', '812348-1-1', '812474-1-1', '812182-1-1', '812359-1-1', '812267-1-1', '812159-1-1', '810464-1-1', '810459-1-1', '810334-1-1', '808876-1-1', '807810-1-1', '766025-1-1', '777673-1-1', '793375-1-1', '783395-1-1', '804966-1-1']

    formhash = re.findall(r'formhash=(.*)">退出', rep.text)
    print("formhash:{}".format(formhash))#['e5eexxxx]
    # formhash=xxxxxxx 看起来是一个表单提交时的参数。
    # formhash 是一个用于防止 CSRF(跨站请求伪造)攻击的安全令牌,也是后面签到需要用到的参数。
    url_page = 'https://bbs.125.la/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1'
    #2.自动签到
    rep = session.post(url=url_page, headers=headers,
                       data={'formhash': formhash, "submit": "1", "targerurl": "", "todaysay": "", "qdxq": "kx"})
    print("签到结果:" + re.findall(r'{"status":0,"msg":"(.*)"}', rep.text)[0])

    #3.自动评分
    for i in range(0, len(hot_message)):
        url_page = 'https://bbs.125.la/thread-14' + hot_message[i] +'.html'
        rep = session.get(url=url_page, headers=headers)
        if rep.status_code == 200:
            print('进入帖子详情页成功')
            tree = etree.HTML(rep.text)
            a_list = tree.xpath('//*[@id="ak_rate"]/@onclick')
            addr = a_list[0]
            str1 = addr.split(',')
            str2 = str1[1].split('&')
            tid1 = str2[2]
            pid1 = str2[3]
            tid2 = tid1.split('=')[1]
            pid2 = pid1.split('=')[1]
            pid3 = pid2.split('\'')[0]
            tid = tid2
            pid = pid3  # 获取到tid与pid
            formash1 = tree.xpath('//*[@id="vfastpost"]/input/@value')
            formash = formash1[0]  # 获取到formash
            # print("获取pid={}与tid={}与formash={}成功,开始自动评分".format(pid, tid, formash))
            # 开始评分
            url_score = 'https://bbs.125.la/forum.php?mod=misc&action=rate&ratesubmit=yes&infloat=yes&inajax=1'
            data = 'formhash=' + formash + '&tid=' + tid + '&pid=' + pid + '&referer=https%3A%2F%2Fbbs.125.la%2Fforum.php%3Fmod%3Dviewthread%26tid%3D' + tid + '%26page%3D0%23pid' + pid + '&handlekey=rate&score4=%2B1&reason=%E6%84%9F%E8%B0%A2%E5%88%86%E4%BA%AB%EF%BC%8C%E5%BE%88%E7%BB%99%E5%8A%9B%EF%BC%81%7E'
            headers['Content-Type'] = 'application/x-www-form-urlencoded'
            headers['Referer'] = 'https://bbs.125.la/thread-14720892-1-1.html'

            rep_score = session.post(url=url_score, data=data, headers=headers) #开始评分请求,rep_score是评分返回的源码

            rep_score_result=rep_score.status_code # 200表示评分成功
            if rep_score_result==200:
                print("评分推送成功,任务:{}".format(i))
            else:
                print("评分推送失败,任务:{}".format(i))


            score_message=re.findall(r'CDATA\[(.*)<scrip', rep_score.text)[0]
            result = re.search(r'class="showmenu">积分: (\d+)</a>', rep.text)
            if result:
                number = result.group(1)  # 提取匹配到的数字部分
                print("评分反馈:{},积分:{}".format(score_message,number))
            else:
                number=-1
                print("未找到匹配的内容,积分:{}".format(number))

            time.sleep(2)
            error_limit = rep_score.text.find("超过限制")
            if error_limit != -1:
                print("已经完成评分次数{},24小时评分数超过限制,退出".format(i))
                break;
        else:
            print('进入帖子失败')


if __name__ == '__main__':
    dailyTask()
    print("执行完毕~")

后续优化

青龙面板+pushplus微信通知~~


总结

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中
『未完待续』


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1502660.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Midjourney绘图欣赏系列(七)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

Idea创建Maven项目

Maven安装配置步骤&#xff1a; 解压安装 bin目录 &#xff1a; 存放的是可执行命令。&#xff08;mvn 命令重点关注&#xff09; conf目录 &#xff1a;存放Maven的配置文件。&#xff08;settings.xml配置文件后期需要修改&#xff09; lib目录 &#xff1a;存放Maven依赖的j…

KH-MCX-KWE-W

KH-MCX-KWE-W品牌: kinghelm(金航标)封装: 插件 描述: 镀金

【教程】Github环境配置新手指南(超详细)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 文章目录 一、Github初始设置&#xff08;一&#xff09;登入Github&#xff08;二&#xff09;新建仓库 二、本地Git配置&am…

在线部署ubuntu20.04服务器,安装jdk、mysql、redis、nginx、minio、开机自启微服务jar包

一、服务器 1、查看服务器版本 查看服务器版本为20.04 lsb_release -a2、服务器信息 服务器初始账号密码 sxd / 123456 首先,更改自身密码都输入123456 sudo passwd 创建最高权限root账号&#xff0c;密码为 123456 su root 3、更新服务器源 1、更新源列表 sudo apt-g…

tomcat优化与部署(三)------nignx优化与nginx +tomcat 部署

在目前流行的互联网架构中&#xff0c;Tomcat在目前的网络编程中是举足轻重的&#xff0c;由于Tomcat的运行依赖于JVM&#xff0c;从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM 和 Tomcat 自身调优两部分 Tomcat 是一个流行的开源 Java 服务器&#xff0c;用于托管 Java …

简单题我重拳出击

有请第一位嘉宾&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 n…

代码随想录训练营第40天 | LeetCode 343. 整数拆分

LeetCode 343. 整数拆分 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分_哔哩哔哩_bilibili 思路 代码如下&#xff1a; ​​​​​​LeetCode 96…

【产品应用】一体化步进伺服电机在绿光激光打标机中的应用

随着科技的不断发展&#xff0c;激光打标技术已经成为现代工业生产中不可或缺的一部分。绿光激光打标机以其高精度、高效率、高可靠性等特点&#xff0c;广泛应用于各种材料的标记与打标。而在绿光激光打标机中&#xff0c;一体化步进电机的应用则为其带来了更高的性能与更稳定…

Lesson 5 Classification(short version)

听课&#xff08;李宏毅老师的&#xff09;笔记&#xff0c;方便梳理框架&#xff0c;以作复习之用。本节课主要讲了回归和分类的区别&#xff0c;分类的过程&#xff0c;分类的损失函数。这节课比较简短。 1. 回归和分类的区别 回归只是输出一个预测的值分类是输出预测的cla…

【Leetcode每日一刷】数组|双指针篇:977. 有序数组的平方、76. 最小覆盖子串(附滑动窗口法详解)

力扣每日刷题 一、977. 有序数组的平方1.1题目1.2、解题思路1.3、代码实现——C 二、76. 最小覆盖子串2.1&#xff1a;题目2.2、解题思路2.3&#xff1a;代码实现——c2.4&#xff1a;易错点 一、977. 有序数组的平方 1.1题目 [题目链接]( 1.2、解题思路 题型&#xff1a;双…

请编程输出无向无权图各个顶点的度 ← STL vector 模拟邻接表存图

【题目描述】 请利用 STL vector 模拟邻接表存图&#xff0c;编程输出无向无权图各个顶点的度。【输入样例】 5 6 1 3 2 1 1 4 2 3 3 4 5 1【输出样例】 4 2 3 2 1【算法分析】 本例利用 STL vector 模拟实现邻接表。代码参见&#xff1a;https://blog.csdn.net/hnjzsyjyj/arti…

服务器配置禁止IP直接访问,只允许域名访问

联网信息系统需设置只允许通过域名访问&#xff0c;禁止使用IP地址直接访问&#xff0c;建议同时采用云防护技术隐藏系统真实IP地址且只允许云防护节点IP访问服务器&#xff0c;提升网络安全防护能力。 一、Nginx 修改配置文件nginx.conf&#xff0c;在server段里插入正则表达式…

Redis系列之持久化机制RDB和AOF

Redis系列之持久化机制RDB和AOF 文章目录 1. 为什么需要持久化&#xff1f;2. 持久化的方式3. RDB机制3.1 RDB机制介绍3.2 配置RDB3.3 什么时候触发3.4 操作实例3.5 RDB优势和不足 4. AOF机制4.1 什么是AOF机制&#xff1f;4.2 同步机制4.3 重写机制4.4 AOF的优势和不足 混合模…

C++的面向诗篇:类的叙事与对象的旋律

个人主页&#xff1a;日刷百题 系列专栏&#xff1a;〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 &#x1f30e;欢迎各位→点赞&#x1f44d;收藏⭐️留言&#x1f4dd; ​ ​ 一、面向对象的定义 学习C语言时&#xff0c;我们就经常听说C语言是面向过程的&#xff0c;…

3.7号freeRtoS

1. 串口通信 配置串口为异步通信 设置波特率&#xff0c;数据位&#xff0c;校验位&#xff0c;停止位&#xff0c;数据的方向 同步通信 在同步通信中&#xff0c;数据的传输是在发送端和接收端之间通过一个共享的时钟信号进行同步的。这意味着发送端和接收端的时钟需要保持…

LiveNVR监控流媒体Onvif/RTSP功能-视频广场点击在线或离线时展示状态记录快速查看通道离线原因

LiveNVR视频广场点击在线或离线时展示状态记录快速查看通道离线原因 1、状态记录1.1、点击在线查看1.2、点击离线查看 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、状态记录 1.1、点击在线查看 可以点击视频广场页面中&#xff0c; 在线 两个字查看状态记录 1.2、点击离线查…

学习笔记—功能测试的基础认知

除了测试工作之外&#xff0c;其他流程并行 优点&#xff1a; 软件测试出测试执行外&#xff0c;还有很多工作 软件测试完全独立&#xff0c;其他流程并发进行 具有很强的灵活性 缺点&#xff1a; 管理型要求高 技能要求高 测试就绪点分析困难 测试用例的定义 测试用例…

Java List集合取交集的八种不同实现方式

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在Java中&#xff0c;取两个List集合的交集可以通过多种方式实现&#xff0c;包括使用Java 8的Stream API、传统的for循环遍历、使…

DeepLearning in Pytorch|我的第一个NN-共享单车预测

目录 概要 一、数据准备 导入数据 数据可视化 二、设计神经网络 版本一 版本二&#xff08;正片&#xff09; 三、测试 小结 概要 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用情况进行预测 输入节点为1个&#xff0c;隐含…