22. 听说你想要用爬虫采集我的手机号?哎 ~ 我展示用的是图片

news2024/11/28 13:56:16

本篇博客我们实现图片渲染手机号码案例,用于防止爬虫直接采集文字信息。
爬虫训练场
本案例实现的效果如下所示
22. 听说你想要用爬虫采集我的手机号?哎 ~ 我展示用的是图片

文章目录

    • bootstrap5 实现名片样式卡片
    • 补充数据生成逻辑
      • 生成用户 5 个汉字的昵称
      • 调用头像 API,生成图片
      • 将手机号码生成图片

bootstrap5 实现名片样式卡片

在 Bootstrap5 中实现一个名片样式,可以直接使用卡片模板,示例代码如下。

<div class="card" style="width: 18rem;">
  <img src="image.jpg" class="card-img-top" alt="image" />
  <div class="card-body">
    <h5 class="card-title">梦想橡皮擦</h5>
    <p class="card-text">爬虫训练场项目主导人</p>
    <a href="#" class="btn btn-primary">点击去他的博客</a>
  </div>
</div>

该例子使用了 .card 类来创建名片卡片,但我们还需要进行一下修改,将图片修改为圆形,可以使用 Bootstrap 的 .avatar 类。

<div class="card" style="width: 18rem;">
  <img src="image.jpg" class="avatar avatar-sm" alt="image" />
  <div class="card-body">
    <h5 class="card-title">梦想橡皮擦</h5>
    <p class="card-text">爬虫训练场项目主导人</p>
    <a href="#" class="btn btn-primary">点击去他的博客</a>
  </div>
</div>

这里使用了 .avatar 类和 .avatar-sm 类来创建头像。.avatar 类用于创建圆形图像,而 .avatar-sm 类用于调整头像的大小。

还需要手动添加一些样式,圆角,阴影和背景色。

.card {
  border-radius: 10px;
  box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
  background-color: white;
}

简单的调整样式之后,就可以编写核心代码环节了,重点是 user/index.py 文件的修改,该文件承接所有页面数据逻辑。

补充数据生成逻辑

本部分代码由三部分组成,分别是:

  1. 生成用户 5 个汉字的昵称;
  2. 用昵称调用头像生成 API,生成头像
  3. 调用随机手机号接口,生成手机号,并将其转换为图片。

步骤罗列完毕,下面开始逐一实现。

生成用户 5 个汉字的昵称

在过往的博客中,我们已经实现了随机汉字的生成,参考文章为 《Python 随机生成一个汉字》,在这篇文章中,重点函数为 get_random_common_char(),接下来将其进行封装,并在 user/index.py 中进行导入。

from ..apis.index import get_random_common_char, generate_phone_number,static_path

特别提醒:爬虫训练场项目为综合项目,前后有很强的承接性,大家在阅读学习的时候,尽量中间不要有停顿。

可以看到在模块导入时,我们将 apis.index 模块中的 get_random_common_char()generate_phone_number() 函数 和 static_path 变量都进行了导入,然后调用对应函数即可完成目标需求。

例如,生成 5 个汉字昵称:

name = "".join([get_random_common_char() for i in range(5)])

调用头像 API,生成图片

本步骤相对简单,仅修改 免费头像 API 博客对应的接口逻辑即可。

在视图函数中补充接口参数解析逻辑,如果传递 name 参数,则获取前 2 个汉字,示例代码如下:

name = request.args.get("name", '空值')
han_char = ''  # 待生成的字符串

if name == '空值':
	# 执行默认逻辑
else:
	# 截取前2个汉字

最后只需要在模板页面,调用该接口传入参数即可。

<img
  src="{{url_for('apis.index')}}?name={{item.name}}"
  class="avatar avatar-sm"
  alt="image"
/>

将手机号码生成图片

该步骤是本案例的核心逻辑,为了防止爬虫采集数据,需要将文字内容转换成图片形式展现。文字转图片依旧使用 pillow 库。

这里首先封装一个基本函数,在 user/index.py 中编写代码即可。

# 手机号码转换为图片
def phone_to_img(phone):
    # 生成图片
    image = Image.new('RGB', (110, 20), (255, 255, 255))
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype(os.path.join(static_path, 'font/msyh.ttf'), 16)


    draw.text((0, 0), phone, font=font, fill=(0, 0, 0))

    buf = io.BytesIO()
    image.save(buf, format='png')
    buf.seek(0)
    b64_image = base64.b64encode(buf.getvalue()).decode('utf-8')

    # 转为 base64 编码

    return b64_image

可以看到,上述代码实例化了一个长 110 像素,宽 20 像素的白色背景区域,然后在其上部绘制手机号码,特别需要注意的地方是我们需要将图片转换为 BLOB,即二进制图片格式。

buf = io.BytesIO()
image.save(buf, format='png')
buf.seek(0)

但是 _io.BytesIO 对象是无法在模板引擎中进行图像渲染的,还需要将其转换为 base64 编码。

所有的代码编写完毕,我们就可以在模板中,使用 data: URL 格式来显示图像,示例代码如下:

<img src="data:image/png;base64, {{ item.phone }}" />

完整案例可以下载源码之后,查看 templates/user/index.html 文件内容。

此外,这里还可以使用 jinja2 自定义过滤器实现,首先在项目 app 目录中建立 filter_fun.py 文件,用于放置所有过滤器代码,然后编写 datauri() 函数,内容如下。

def datauri(uri):
    return f'data:image/png;base64,{uri}'

最后一个步骤就是在 flask 中注册该过滤器,打开 app/__init__.py 文件,输入如下代码。

# 导入过滤器
from .filter_fun import datauri
app.jinja_env.filters['datauri'] = datauri

回到模板文件中,手机号码图片的加载就可以使用过滤器展示。

<img src="{{ item.phone|datauri  }}" alt="phone" />

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

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

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

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

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

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

相关文章

菜鸡二次封装element中table表单

实现效果如下封装的table表单<template><el-table:span-method"arraySpanMethod":header-cell-style"rowClass":cell-style"cellStyle":data"tableData"style"width: 100%; height: 100%">//暂无数据展示<te…

汤姆斯的天堂梦(C++,Dijkstra)

题目描述 汤姆斯生活在一个等级为 000 的星球上。那里的环境极其恶劣&#xff0c;每天 121212 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 NNN 的星球上天堂般的生活。 有一些航班将人从低等级的星球送上高一级的星球&#xff0c;有时需要向驾驶员支付一定金额的费…

【跟月影学可视化】学习笔记 41 篇(完结)

说明 【跟月影学可视化】专栏学习笔记。 个人学习笔记源码&#xff1a;https://github.com/kaimo313/visual-learning-demo 一共做了 162 个学习示例以及 41 篇博客学习笔记&#xff0c;要深入学习该课程请支持正版&#xff0c;个人笔记仅供参考。 笔记目录 【图形基础篇…

什么是无源相干定位系统?

无源定位&#xff08;Passive Localization&#xff09;不通过发射信号来探测目标的位置&#xff0c;而是接收目标的有意、无意辐射或反射信号来实现对侦察目标的探测、定位与追踪。接收的信号可以是目标直接辐射的信号&#xff0c;也可以是外辐射源照射到目标后反射或散射的信…

网站关键词怎么优化排名(网站关键词通常可以选择哪些词)

网站核心关键词的选取需要具备哪些条件 在对网站优化的过程中&#xff0c;肯定少不了对网站关键词的选取&#xff0c;关键词的选择又是网站优化中十分重要的一步&#xff0c;那么网站在选择关键词的过程中需要遵循哪些原则呢&#xff1f;关于这个问题老张带你了解一下。 1、首…

wav文件格式分析与详解

wav文件格式分析与详解WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。WAV文件格式简称WAV格式是一种存储声音波形的数字音…

Wijmo 2022 v2 JavaScript UI Crack

Wijmo 2022 v2 采集 by Ω578867473 添加对 Angular 14 和 React 18 的支持以及对 FlexGrid 和 FlexChart 的改进。特征 Angular 14 支持——您今天就可以开始将 Angular 14 应用程序与 Wijmo 结合使用。Wijmo 提供了大量快速、灵活的 Angular 组件&#xff0c;每个组件都有丰富…

【学Vue就跟玩一样】组件-非单文件组件的使用

一&#xff0c;什么是组件实现应用中局部功能代和资源的集合&#xff08;简单来说就是将html&#xff0c;js&#xff0c;css&#xff0c;资源整合起来的一个小盒子&#xff09;理解&#xff1a;用来实现局部(特定)功能效果的代码集合为什么&#xff1a;一个界面的功能很复杂作用…

SD卡损坏了怎么办?sd卡恢复,80%的用户都试过这些方法

SD卡作为一种外部存储设备&#xff0c;多用在数据相机、监控、手机、无人机等设备中&#xff0c;可以帮我们保存很多数据。 但是SD卡也跟其他设备一样&#xff0c;容易发生数据丢失的情况。如果SD卡损坏了&#xff0c;或者我们把里面的数据误删或者格式化&#xff0c;sd卡恢复…

MySQL--什么情况下不建议使用join查询

关于join 当需要查询两个表的交集、并集等数据时&#xff0c;除了嵌套子查询的方式外&#xff0c;还可以使用join的方式提升性能。对于MySQL的join语句&#xff0c;需要两个最基础的“角色”&#xff1a;主表即驱动表&#xff0c;关联表即驱动表。join描述的就是驱动表与被驱动…

云服务器怎样搭建静态网站?

先买好域名和云服务器&#xff0c;然后把云服务器的ip地址和域名解析到一起。 然后登陆云服务器&#xff0c;安装Nginx 我的软件环境是 CentOS 1、安装 Nginx 在 CentOS 上&#xff0c;可直接使用 yum 来安装 Nginx&#xff08;安装时间稍微有点长&#xff0c;安装过程中代码会…

Linux应用编程---10.信号量

Linux应用编程—10.信号量 ​ 信号量用于任务间的同步!简单来理解&#xff0c;信号量是一个被内核维护的整数&#xff0c;这个整数一般是“大于等于零”的&#xff0c;我们对这个信号量的操作一般为&#xff1a;将信号量设置一个值、发布(加上一个信号量)、消耗(减去一个信号量…

LINUX提权之计划任务提权篇

前言 今天给大家带来的是计划任务提权&#xff0c;说起定时任务对于linux很熟悉的小伙伴一定不会陌生&#xff0c;但你有没有想过可以通过定时任务来进行权限提升的操作&#xff0c;本文会根据该知识点进行展开&#xff0c;同时给大家介绍一个用于探测漏洞的工具使用方法&…

线程通信:生产者消费者问题

问题 1.生产者&#xff08;Producer&#xff09;将产品给店员&#xff08;Clerk&#xff09;&#xff0c;而消费者&#xff08;Customer&#xff09;从店员处取走产品&#xff0c;店员一次只能持有固定数量的产品&#xff08;比如&#xff1a;20&#xff09; &#xff0c;如果生…

实验 1 MATLAB 图像处理基础

一、实验目的1. 熟悉启动和退出 MATLAB 的方法。2. 熟悉 MATLAB 命令窗口的组成。3. 掌握 MATLAB 基本绘图函数和图像处理函数的使用。4. 掌握图像内插和灰度图像的集合运算。二、实验例题1. 求下列表达式的值(1) (2) 答&#xff1a;(1)y1exp(2)/2*sin(35*pi/180)y1 2.1191(2)方…

索尼数字人研究:画质超逼真,面部表情与身体动作保持协调

近年来&#xff0c;3D动捕、数字虚拟人等技术受到越来越多关注&#xff0c;它不仅可以应用于电影场景&#xff0c;游戏、社交等领域也开始采用。相比于过去高成本、高门槛的全身动捕技术&#xff0c;现在制作基于动捕的虚拟人越来越容易&#xff0c;不需要过高的成本或是专业技…

Linux 可加载内核模块剖析

Linux 就是通常所说的单内核&#xff08;monolithic kernel&#xff09;&#xff0c;即操作系统的大部分功能都被称为内核&#xff0c;并在特权模式下运行。 它与微型内核不同&#xff0c;后者只把基本的功能&#xff08;进程间通信 [IPC]、调度、基本的输入/输出 [I/O] 和内存…

Hudi系列1:Hudi介绍

文章目录一. 什么是Hudi二. 发展历史三. Hudi 功能和特性四. Hudi 基础架构五. 使用公司六. 小结参考:一. 什么是Hudi Apache Hudi&#xff08;发音“hoodie”&#xff09;是下一代流数据湖平台。Apache Hudi将核心仓库和数据库功能直接带到数据湖中。Hudi提供了表&#xff0c…

6.6 工具-ELK安装

目录 6.6.1 Elasticsearch安装 6.6.1.1 安装 6.6.1.1.1 window 6.6.1.1.2 Linux 6.6.1.2 问题 6.6.1.2.1 问题一 6.6.1.2.2 问题二 6.6.2 Logstash安装 6.6.2.1 安装 6.6.2.1.1 window 6.6.2.1.2 Linux 6.6.2.2 问题 6.6.2.2.1 问题一 6.6.3 Kibana 6.6.3.1 安装…

论文投稿指南——中文核心期刊推荐(中国医学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…