呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25

news2024/11/27 7:25:47

在正式学习本篇博客前,先要了解一下什么是 SVG(Scalable Vector Graphics),它是一种矢量图形格式,可以用来在网页上创建可伸缩的图形。

使用 SVG 技术实现反爬虫的方法有以下几种:

  1. 验证码:使用 SVG 创建验证码图形,用户需要识别图形中的文字或数字来完成验证。
  2. 图形拼图:将一张图片分成多个小图片,用户需要将小图片拼回原图才能访问网站。
  3. 滑动验证:使用 SVG 创建滑块,用户需要拖动滑块到特定位置才能访问网站。
  4. 点击验证:使用 SVG 创建图形,用户需要点击图形中的特定区域才能访问网站。
  5. 机验证:使用 SVG 创建图形,让用户输入图形中特定的信息,验证用户是否是人类。

阅读本篇博客前,需要提前了解一下如何在 Python 中生成 SVG 图片,这一点可以参考下述博客。

Python 生成 svg 图片,一篇博客带你掌握 Python 与 svg 之间的操作

SVG反爬

    • 生成 SVG 数字图片
      • 字典
    • SVG 数字图片在网页中的应用
      • 前台渲染逻辑
      • flask 后台逻辑编写
    • 集成 SVG 反爬案例到爬虫训练场

生成 SVG 数字图片

在编写反爬案例时,可以提前生成一张 SVG 图片,其中包含 0~9 这 10 个数字,然后按照一定间隔进行排序。

import svgwrite
import random

dwg = svgwrite.Drawing('random_numbers.svg', size=(200, 20), profile='tiny')

nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

random.shuffle(nums)
for i, num in enumerate(nums):
    text = dwg.add(dwg.text(str(num), insert=(i * 20, 20), fill='black', font_size=16))

dwg.save()

图片生成使用的是 svgwrite 模块,然后通过打乱 nums 列表,生成一个新的列表排序,最后进行文字渲染。

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25
上述图片每个数字的间隔是 20 像素,基于该点,整理出一个位置和数字的字典。

字典

位置和数字的对应关系字典:

nums_dict = {
    1: 0,
    8: 1,
    0: 2,
    3: 3,
    5: 4,
    6: 5,
    7: 6,
    9: 7,
    2: 8,
    4: 9
}

字典中每个元素的第一项是数字,第二项是对应的索引,如果希望获取数字 2 的索引位置,只需要调用 nums_dict[2] 即可实现。

SVG 数字图片在网页中的应用

下面实现 SVG 在网页中的应用,其核心用到的是 CSS 背景偏移。

首先在 span 标签中展示数字 1,基于上述 svg 图片进行实现,数字 1 所在的索引位置是 0,所以代码如下所示。

以下代码使用的是 flask 中的 jija2 模板

<style type="text/css">
    .svg_img{
        display: inline-block;
        width: 10px;
        height: 26px;
        background: red url('{{url_for("static",filename="images/random_numbers.svg")}}') no-repeat;
        background-position:0 0;
        line-height: 20px;
    }
</style>

HTML 标签位置代码为:

<div class="container">
  <span class="svg_img"></span>
</div>

运行代码,在浏览器可以看到一个红色背景的图片,其中显示数字 1。

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25
前文重点就是将 SVG 设置为背景图片,然后使用背景偏移,即 background-position:0 0; 进行图片部分区域展示。

用相同的办法,展示出一个完整的数字来,例如 13579,编写如下代码。

<div class="container">
  <span class="svg_img" style=" background-position:0 0;"></span>
  <span class="svg_img" style=" background-position:-60px 0;"></span>
  <span class="svg_img" style=" background-position:-80px 0;"></span>
  <span class="svg_img" style=" background-position:-120px 0;"></span>
  <span class="svg_img" style=" background-position:-140px 0;"></span>
</div>

此时可以在网页显示一个标准的数字。(红色背景仅供测试使用)

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25
接下来对渲染逻辑做一下总结。

前台渲染逻辑

由于 SVG 中每个数字的间隔是 20px,所以渲染对应数字,只需要用 20px 乘以其索引位置即可,由于是左侧偏移,故还需要用到负号(-),表示左移。

拿到该逻辑之后,就可以在 Flask 后台设置数字,前台进行渲染了,例如随机选一个数字 279387,然后 编写 flask 的后台代码。

flask 后台逻辑编写

首先将数字 279387 转换为列表,然后传递道视图模板中,同时还要传递数字与位置对应关系字典。

@antispider.route('/rank')
def games():
    nums_dict = {
        1: 0,
        8: 1,
        0: 2,
        3: 3,
        5: 4,
        6: 5,
        7: 6,
        9: 7,
        2: 8,
        4: 9
    }
    mynum = 279387

    # 将数字转换为列表,便于后续迭代
    nums_list = list(map(int, str(mynum)))

    return render_template("antispider/game.html", nums_list=nums_list, nums_dict=nums_dict)

模板中使用循环实现即可。

<div class="container">
  {% for num in nums_list %}

  <span
    class="svg_img"
    style=" background-position:-{{nums_dict[num]*20 }}px 0;"
  ></span>
  {% endfor %}
</div>

运行代码,任意数字使用 svg 渲染道前台的案例就完成了。

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25

集成 SVG 反爬案例到爬虫训练场

理论学习完毕,就可以进行相应实践了,将 SVG 反爬集成到项目中。

访问地址为:pachong.vip/as/rank

呦~,这不 SVG 映射反爬么,这你都会?厉害厉害 | 案例 25

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

全网 6000+人正在学习的 爬虫专栏 👇👇👇👇👇👇👇

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

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

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

相关文章

imx6ull Linux使用设备树配置LED

我们基于寄存器的方式已经编写了LED驱动&#xff0c;实现点亮/熄灭LED&#xff0c;但是你有没有发现一个问题&#xff0c;就是假设LED修改了一个GPIO&#xff0c;那么需要对应的修改寄存器代码&#xff0c;非常繁琐&#xff0c;而且随着改板次数增加&#xff0c;那么会带来一个…

从零开始的数模(五)插值与拟合

目录 一、概念 二、 插值 2.1方法 2.2MATLAB实现 例题1 ​编辑例题2 2.3python实现 2.3.1例题一的python解法 2.3.2二维网格节点插值 例题四 三、拟合篇&#xff1a; 3.1MATLAB实现 3.2python实现 一、概念 二、 插值 2.1方法 2.2MATLAB实现 在MATLAB中提供了一些…

带滤波器的PID控制仿真-2(M语言)

被控对象为三阶传递函数&#xff1a;低通滤波器为&#xff1a;采样时间为1ms&#xff0c;噪声信号加在对象的输出端。分三种情况进行:M1 时&#xff0c;为未加噪声信号;M2时&#xff0c;为加噪声信号未加滤波;M3时&#xff0c;为加噪声信号加滤波。阶跃响应结果如图1&#xff5…

【论文精读】KD-MVS

今天读的是发表在ECCV2022上的自监督MVS文章&#xff0c;作者来自于旷视科技和清华大学。 文章链接&#xff1a;arxiv 代码链接&#xff1a;https://github.com/megvii-research/KD-MVS 目录Abstract1. Introduction2. Related work3. Methodology3.1 Self-supervised Teacher …

51单片机七人多数表决器仿真设计( proteus仿真+程序+报告+讲解视频)

51单片机七人多数表决器仿真设计( proteus仿真程序报告讲解视频&#xff09; 仿真图proteus 7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0033 51单片机七人多数表决器仿真设计视频讲解1.主要功能&#xff1a;2.仿真3.…

Java:Mybatis的使用

一、Mybatis的概述 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发。 MyBatis中文官网&#xff1a;https://mybatis.org/mybatis-3/zh/getting-started.html 二、Mybatis快速入门 1、创建user表&#xff0c;添加数据 create database mybatis; use mybati…

英语语法大全

文章目录一、主语1、名词、代词和动词做主语2、主语从句做主语&#xff0c;谓语动词用单数3、主语从句练习二、谓语动词1、谓语动词种类2、主谓一致三、宾语1、单宾语2、双宾语3、复合宾语4、宾语从句四、定语1、定语从句2、定语从句的翻译五、状语1、分词做状语2、独立主格结构…

42.Isaac教程--超像素

超像素 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 超像素是一组外观相似的相连像素。 超像素分割将图像分成数百个不重叠的超像素&#xff08;而不是数千或数百万个单独的像素&#xff09;。通过使用超像素&#xff0c;您可以在更有意义的区…

ESP-C3入门2. Clion+IDF 开发环境搭建

ESP-C3入门2. ClionIDF 开发环境搭建一、准备工作二、Clion配置过程1. 使用idf.py命令创建一个范例工程2. 使用Clion打开项目&#xff0c;修改CMakeLists.txt3. 设置交叉编译工具链4. 设置CMake5. 对cmake一些路径进行修改。三、编译及烧录1. 编译2. 烧录3. 查看输出一、准备工…

审核中台业务数据进审升级之路

本文字数&#xff1a;3850字预计阅读时间&#xff1a;15 分钟目录1.背景1.1. 相关名词介绍1.2. 审核中台介绍1.3. 业务痛点介绍2. 规范化改造2.1 规范通讯协议2.2 规范处理流程3. 自动化改造3.1 业务接入检测器3.2 数据自动化流转3.3 源码示例4. 总结1.背景1.1 相关名词介绍1.1…

计算机图形学基础教程(Visual C++版)习题解答与编程实践(第2版)孔令德1-到第3章的直线扫描转换

1-到第3章的直线扫描转换&#xff08;没更新完&#xff09;习题1知识积累习题2知识点映射模式使用GDI对象习题3知识积累直线的中点Bresenham算法习题1 1.计算机图形学的定义是什么?说明计算机图形学、图像处理和模式识别之间的关系。 答&#xff1a; CG是计算机图形学的缩写。…

实验一、旅馆客户服务呼叫显示系统

实验一 旅馆客户服务呼叫显示系统 实验目的 综合应用数字电子技术知识&#xff0c;按照要求设计并完成一个小规模的数字电路系统。进行硬件线路的设计、仿真、焊接、调试与实现。使系统实现一种用于旅馆客户服务呼叫显示系统的实用电路。在呼叫过程中&#xff0c;当8位旅客有…

Spark Core ---- RDD持久化

RDD的数据是过程数据 RDD之间进行相互迭代计算&#xff08;Transformation的转换&#xff09;&#xff0c;当执行开启后&#xff0c;新RDD的生成&#xff0c;代表老RDD的消失 RDD的数据是过程数据&#xff0c;只在处理的过程中存在&#xff0c;一旦处理完成&#xff0c;就不见…

【数据结构和算法】实现带头双向循环链表(最复杂的链表)

前文&#xff0c;我们实现了认识了链表这一结构&#xff0c;并实现了无头单向非循环链表&#xff0c;接下来我们实现另一种常用的链表结构&#xff0c;带头双向循环链表。如有仍不了解单向链表的&#xff0c;请看这一篇文章(7条消息) 【数据结构和算法】认识线性表中的链表&…

Spring Boot之SpringSecurity学习

文章目录一 SpringSecurity简介二 实战演示0. 环境 介绍1. 新建一个初始的springboot项目2. 导入thymeleaf依赖3. 导入静态资源4. 编写controller跳转5. 认证和授权6. 权限控制和注销7. 记住登录8. 定制登录页面三 完整代码3.1 pom配置文件3.2 RouterController.java3.3 Securi…

那些面试官口中常常提到b树(MySQL索引底层数据结构)

各种常见树1.树的基本概念2.二叉树3.b树4.b树5.b树与b树的对比5.MySQL索引底层数据结构1.树的基本概念 树的特点&#xff1a;有一个树根&#xff0c;树根上又有很多枝干&#xff0c;枝干上又有很多树枝&#xff0c;树枝上又有很多叶子 树最为一种数据结构也有相似特点 树是一个…

【计算机网络(考研版)】第二站:物理层(一)

前言 如下图所示&#xff0c;这是我们之前所说的数据流动示意图 我们将按照从下向上的结构进行学习。这一讲学习第一层物理层。物理层关注在一条通信信道上传输原始比特&#xff0c;即无论面对什么样的传输介质(有线或者无线)都可以传输比特流&#xff0c;物理层的作用正是要尽…

Python3 函数

函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被叫做用户…

Node require 正解

require 实现原理 流程概述 步骤1&#xff1a;尝试执行代码require("./1"). 开始调用方法require.步骤2&#xff1a;此时会得到filename&#xff0c;根据filename 会判断缓存中是否已经加载模块&#xff0c;如果加载完毕直接返回&#xff0c;反之继续执行步骤3&…

JavaScript 的数据类型

JavaScript 的数据类型 基本数据类型&#xff08;值类型&#xff09; Number&#xff08;包含小数、整数、负数、科学计数法&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"…