23. 反爬案例:不登录不给,要数据请先登录我的站点

news2025/1/19 8:05:05

登录之后,可以查看数据,是部分站点常用规则,本篇博客将在爬虫训练场中实现该需求。

文章目录

    • 安装必备模块
    • 建立 models
    • 建立 login_form 表单文件
      • flask_wtf 中 FlaskForm 类
    • 建立登录视图函数
    • 配置 login.html 页面

安装必备模块

实现 Python Flask 项目的登录,最需要的模块是 flask-login,除此之外,还需要用到以下三个模块:

  • flask-wtf:该模块用于在 Flask 应用程序中处理 Web 表单的功能。
  • wtf:用于跟踪和报告程序崩溃的功能;
  • werkzeug:Web 服务器和 Web 应用程序的功能,包括 HTTP 处理和 WSGI 支持。

模块全部安装完毕,首先要做的准备工作是在 MySQL 数据库中建立 users 表,结构相对简单,仅包含 2 个字段即可。
23. 反爬案例:不登录不给,要数据请先登录我的站点

建立 models

数据库表建立完毕,可以在 app 目录下创建 login_model.py 文件,并输入模型代码。

from werkzeug.security import generate_password_hash, check_password_hash

from flask_login import UserMixin
from app import db


class User(UserMixin, db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), unique=True)
    password_hash = db.Column(db.String(128))

    @property
    def password(self):
        # 设置密码的属性为只写
        raise AttributeError('密码不能读取')

    @password.setter
    def password(self, password):
        # 当类初始化时自动调用,把 password 的值转换为 hash 值
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password) -> bool:
        # 登录时验证密码
        return check_password_hash(self.password_hash, password)

这里用到的几个核心函数说明如下:

flask_login 中 UserMixin 类说明

UserMixin 类可以被用户类继承。 这个类包含了一些必要的属性和方法,以便于 Flask-Login 来管理登录状态,如 is_authenticated, is_active, is_anonymous 以及 get_id。用户需要实现的只需要继承 UserMixin,然后实现它的函数 get_id() 即可。

werkzeug.security 中的两个函数 generate_password_hash(), check_password_hash()

Werkzeug.security 模块提供了两个主要的函数,用于生成和验证密码哈希:

  • generate_password_hash(password, method='sha256', salt_length=8):这个函数用于生成密码哈希。参数 password 是需要加密的明文密码, method 参数用于指定使用的哈希算法, 默认为 'sha256',salt_length 为指定盐的长度;
  • check_password_hash(hashed_password, password):这个函数用于检查给定的明文密码和哈希值是否匹配。参数 hashed_password 是上面 generate_password_hash() 函数生成的哈希值,password 是需要校验的密码。

建立 login_form 表单文件

app 目录建立 login_form.py,然后输入如下代码。

from flask_wtf import FlaskForm
from wtforms.validators import DataRequired, Length
from wtforms import StringField, SubmitField, PasswordField

# 定义的表单都需要继承自FlaskForm
class UserForm(FlaskForm):

    username = StringField('用户名', validators=[DataRequired(), Length(3, 15)])
    password = PasswordField('密码', validators=[DataRequired(), Length(5, 15)])
    submit = SubmitField('登录')

由于 flask_wtf 模块用于处理表单,所以我们自定义一个表单。

上述代码涉及的知识点如下所示。

flask_wtf 中 FlaskForm 类

Flask-WTF 是 Flask 框架中的一个扩展库,主要用于构建和处理 HTML 表单。在 Flask-WTF 中,FlaskForm 类是一个非常重要的类,它是所有表单类的基类。

FlaskForm 类提供了一些基础的功能,包括验证,渲染,和 CSRF 保护等功能。通常,我们会定义一个继承于 FlaskForm 的自定义表单类来处理特定的表单。

例如上述代码,我们集成 FlaskForm 创建了一个表单对象,用于处理用户的登录信息,并且通过在类中使用 Flask-WTF 内置的字段类和验证器来验证用户的输入。

除此之外,还可以在模板中可以使用 {{form.csrf_token}} 生成隐藏的 csrf_token

建立登录视图函数

打开 routes.py 文件,在其中添加登录视图函数,首先将 UserForm() 实例化的对象传递到模板中,后续可以在 login.html 中直接进行渲染。

@app.route("/login", methods=['GET', 'POST'])
def login():
    form = UserForm()
    if form.validate_on_submit():
        # 查询用户信息
        user = User.query.filter_by(username=form.username.data).first()
        if user is not None:
            if user.verify_password(form.password.data):
                flash('登录成功')
                login_user(user)  # login_user 的参数为要登录的用户
                return redirect(request.args.get('next') or url_for('school.login_list_school'))
        flash('登录失败')
    return render_template('login.html', form=form)

既然已经开始修改 routes.py 文件,那再这里需要首先实例化 LoginManager 类 ,该类用于管理用户登录状态。

然后使用 init_app() 函数将 LoginManager 类对象绑定到指定 Flask 应用上。


from flask_login import LoginManager,login_user

# use login manager to manage session
login_manager = LoginManager(app)
login_manager.login_view = 'login'  # 设置登录页面


# 回调函数,用来加载用户
@login_manager.user_loader  #
def load_user(id):
    '''用于加载用户'''
    return User.query.get(int(id))

除此之外,还需要增加 load_user() 函数,该函数用于加载用户,关于 Flask-Login 的详细用法,可以参考下述博客。
Python flask 框架使用 flask-login 模块,来学习一下吧

配置 login.html 页面

打开 login.html 文件,输入如下代码,完成最后收尾工作。

{% extends "base.html" %} {% block style %}
<style type="text/css">
  .required:after {
    content: "*";
    color: red;
  }
</style>
{% endblock style %} {% block script %}
<script
  type="text/javascript"
  src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.6.0.min.js"
></script>
<script type="text/javascript">
  $(document).ready(function () {
    $('[data-toggle="tooltip"]').tooltip();
  });
</script>

{% endblock script %} {% block content %}
<div class="container">
  <div class="row justify-content-center">
    <div class="col-md-6 mt-5 mb-5 p-5 border border-success shadow-lg  ">
      <h1 class="text-primary">登录窗口</h1>
      <form action="{{ url_for('login') }}" method="POST" class="mt-4">
        <div class="form-group">
          <span class="required"> {{ form.username.label }} </span>:
          {{form.username(class="form-control",placeholder="请输入用户名",data_toggle="tooltip",title="测试账号:xiangpica")
          }}
          <small id="username_help" class="form-text text-muted"
            >用户名至少3个字符</small
          >
        </div>

        <div class="form-group">
          <span class="required"> {{ form.password.label }} </span> : {{
          form.password(class="form-control",placeholder="请输入密码",data_toggle="tooltip",title="测试密码:123456")
          }} <br />
        </div>
        <div class="form-group">
          {{ form.submit(class="btn btn-primary" ) }}
        </div>
        {{ form.csrf_token }}
      </form>
    </div>
  </div>
</div>

{% endblock %}

运行代码,得到如下登录窗口。

23. 反爬案例:不登录不给,要数据请先登录我的站点

本案例到此结束,已更新到 爬虫训练场 欢迎大家访问学习。
项目同步到代码仓库 https://gitcode.net/hihell/spider_playground

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 828 篇原创博客

从订购之日起,案例 5 年内保证更新

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

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

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

相关文章

Qt基于CTK Plugin Framework搭建插件框架--插件通信【事件监听】

文章目录一、前言二、事件三、类通信3.1、新建接收插件3.2、新建发送插件3.3、启用插件四、信号槽通信4.1、新建接收插件4.2、新建发送插件4.3、启用插件五、类通信和信号槽通信的区别六、插件依赖七、获取元数据一、前言 CTK框架中的事件监听&#xff0c;其实就是观察者模式&…

分享微信答题抽奖小程序制作步骤_可以做答题后抽奖活动吗

知识答题小程序如何制作&#xff1f;现在越来越多的企业和组织逐步进行各种获奖知识问答小程序。那么&#xff0c;如何制作一个答题小程序呢&#xff1f;今天&#xff0c;我们一起来看看~需要的老板不要走开哦~既然点进来了&#xff0c;那就请各位老板耐心看到最后吧~怎么做一个…

Linux工具学习之【git】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Whatever is worth doing is worth doing well. 任何值得去做的事情&#xff0…

实现高并发秒杀的方式

实现高并发秒杀的方式 引言商品秒杀-超卖解决商品超卖 方式一&#xff08;改进版加锁&#xff09; 方式二&#xff08;AOP版加锁&#xff09; 方式三&#xff08;悲观锁一&#xff09; 方式四&#xff08;悲观锁二&#xff09; 方式五&#xff08;乐观锁&#xff09; 方式六&a…

【虹科云展厅专题】虹科赋能汽车智能化云展厅——自动驾驶专题

虹科2023年开年福利 聚焦前沿技术&#xff0c;【虹科赋能汽车智能化云展厅】正式上线&#xff0c;本次云展厅围绕“汽车以太网/TSN、汽车总线、智能网联、电子测试与验证、自动驾驶”等核心话题&#xff0c;为您带来如临展会现场般的讲演与介绍&#xff0c;更有技术工程师全程…

【CMake】基本指令

文章目录参考资料一、同一目录下单个源文件add_executable二、同一目录下多个源文件aux_source_directoryset( SRC_LIST ./main.c ./testFunc1.c ./testFunc.c)三、不同目录下多个源文件四、正规一点的组织结构add_subdirectoryset (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_D…

PyQt5_pyecharts显示简易世界地图

pyecharts显示地图&#xff0c;地图数据可以安装pyecharts相关的地图数据包&#xff0c;也可以使用自定义的geojson文件&#xff0c;本文使用自定义geojson文件&#xff0c;自定义geojson文件相比于默认的地图数据能有更大的操作空间和自由度&#xff0c;由于本文不适用默认的地…

接口压测实践-压力测试常见参数解释说明

使用场景​ 对指定接口进行性能测试时&#xff0c;一些常见参数解释说明。 一键并发​ 可以通过下载最新版的 Apipost 客户端实现单接口的高性能一键并发压测&#xff0c;如下图所示 注意&#xff1a;请勿设置太大的并发量或者循环次数&#xff0c;这有可能导致直接将被压服…

php学习笔记-php文件表单上传-day06

php学习笔记-php文件表单上传-day061、php文件上传处理流程2、预定义变量 $_FILES2.1、文件上传的状态代码2.2、上传文件的实现函数3、文件上传的小例子3.1、文件上传表单 form1.php3.2 文件上传表单处理的php页面 uploadFiles.php3.3 运行测试输出3.4 文件上传需要注意的一些p…

JavaWeb登录注册系统/界面(邮箱验证码,数据库连接,详细注释,可作结课作业,可用于学习,可接入其他主系统)

目录 1、前言 2、系统实机演示 3、系统分析与设计 &#xff08;1&#xff09;主要软件与工具 &#xff08;2&#xff09;系统分析 &#xff08;3&#xff09;系统规划 4、系统设计与构建 &#xff08;1&#xff09;JavaWeb创建 &#xff08;2&#xff09;JavaWeb运行 …

Python归并排序

归并排序 数据科学家每天都在处理算法。 然而&#xff0c;数据科学学科作为一个整体已经发展成为一个不涉及复杂算法实现的角色。 尽管如此&#xff0c;从业者仍然可以从建立对算法的理解和知识库中受益。 在本文中&#xff0c;对排序算法归并排序进行了介绍、解释、评估和实…

Educational Codeforces Round 141 (Rated for Div. 2)(A~D)

A. Make it Beautiful给出一个数组&#xff0c;将它重新排列&#xff0c;使得它成为一个beautiful数组。ugly数组的定义是存在一个数&#xff0c;为前面所有数字的和。思路&#xff1a;升序排序后一前一后构造数组&#xff0c;最后判断一下即可。AC Code&#xff1a;#include &…

Android 深入系统完全讲解(10)

8 如何定位界面&#xff0c;定位代码 这一节我们来说说如何定位界面&#xff0c;这个也是一个神器&#xff0c;今天来讲讲 hierarchyviewer.bat 的用法&#xff0c;AS 也有新的工具&#xff0c;但是我还是喜欢这个工具&#xff0c;于是我们开始讲这个。 我们使用 Genymotion …

Win32公共控件使用,进度条实现Marquee样式

参考:https://learn.microsoft.com/zh-cn/windows/win32/controls/progress-bar-control Comctl的全称是Common Controls,也就是公共控件的意思,属于Windows系统的一部分,提供了一组标准的UI控件,如Button、ListView等等。 Comctl32主要有两个大版本,v5和v6,最明显的两个…

【C++11】新特性入门

目录 一、C11简介 二、列表初始化 三、声明 1. auto 2. decltype 3. nullptr 四、范围for 五、STL中一些变化 1. array容器 2. forward_list容器 3. unordered_map和unordered_set容器 一、C11简介 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff…

IOzone I/O测试工具使用说明

IOzone磁盘读写工具使用说明0. IOzone简介1. 下载及安装1.1 下载1.2 编译并安装1.3 IOzone 效用测量什么&#xff1f;2. IOzone参数介绍3. 10 个 IOZone 示例3.1 使用默认值运行所有 IOZone 测试3.2 使用 iozone -b 将输出保存到电子表格3.3 使用 iozone -i 仅运行特定类型的测…

BMP图片格式分析(超详细)

系列文章目录 文章目录系列文章目录前言一、BMP格式概览二、实战分析bmp图片数据前言 对学习C感兴趣的可以看看这篇文章哦&#xff1a;C/C实战入门到精通 BMP图片大家见的应该也比较多&#xff0c;它是一种非常基本的图片格式 因为最近对C生成二维码比较感兴趣&#xff0c;用…

【golang】rune

一、背景 来看下2023.1.11的每日一题&#xff0c;是个简单题 2283. 判断一个数的数字计数是否等于数位的值几乎都有思路&#xff0c;先遍历一遍把数存在map中&#xff0c;第二次遍历直接判断就可以。 二、解答 我的解答&#xff08;很久不写代码了&#xff09; 开始想着map的…

autoCell:用于scRNA-seq的分析工具

目录简介引言相关工作贡献数据集和对比方法autoCell高斯混合模型图嵌入结果插补去噪后轨迹分析潜在特征捕获细胞病理学发现细胞类型特异性分子网络简介 动机&#xff1a;scRNA-seq使研究人员能够以单细胞分辨率研究基因表达。然而&#xff0c;由dropout引起的噪声可能会妨碍精…

mac快速配置iterm2

文章目录安装 iterm2设置为默认终端安装 oh-my-zsh 设置默认 shell查看 shell 有几种安装 oh-my-zsh设置默认 shell配置主题安装插件安装高亮插件设置快捷键安装 iterm2 自行官网下载 iterm2 设置为默认终端 Mac 默认终端即“终端”&#xff0c;我们可以把好用的 iterm2 设置…