CSS 伪元素也可以被用于反爬案例?来学习一下

举报
梦想橡皮擦 发表于 2023/05/26 17:49:25 2023/05/26
【摘要】 先说一下什么是 CSS 中的伪元素,CSS 伪元素的概念是指在 CSS 中使用的一些特殊的元素,它们不存在于 HTML 文档中,而是由浏览器生成的元素,用于提供额外的样式控制。这些伪元素在 HTML 代码中不存在,但可以在 CSS 中通过特定的语法来选择它们。 常见的 CSS 伪元素:before :允许在元素之前插入生成内容;:after:允许在元素之后插入生成内容;:selection ...

先说一下什么是 CSS 中的伪元素,CSS 伪元素的概念是指在 CSS 中使用的一些特殊的元素,它们不存在于 HTML 文档中,而是由浏览器生成的元素,用于提供额外的样式控制。这些伪元素在 HTML 代码中不存在,但可以在 CSS 中通过特定的语法来选择它们。

常见的 CSS 伪元素

  • :before :允许在元素之前插入生成内容;
  • :after:允许在元素之后插入生成内容;
  • :selection 伪元素用于定义被选中文本的样式,如颜色和背景色;
  • :placeholder-shown伪元素用于定义带有 placeholder 属性的 input 元素或 textarea 元素中 placeholder 文本的样式,当用户没有在输入框中输入内容时,placeholder 文本才会显示;
  • dir() 伪元素,用于根据元素的文本方向(ltr 或 rtl)来应用样式;
  • :lang() 伪元素,用于根据元素的 lang 属性来应用样式;
  • :fullscreen 伪元素,用于在元素进入全屏模式时应用样式;
  • :indeterminate 伪元素,用于定义 input[type="checkbox"] 元素不确定状态的样式;

本次反爬案例中,我们使用的就是 :before:after 伪元素。

用 CSS 伪元素显示数字

在爬虫训练场中,可以直接建立一个伪元素反爬页面,然后输入如下内容。

{% extends "base.html" %} {% block link %}{% endblock link %} {% block style %}
<style type="text/css">
  .txt::after {
    content: "123";
    font-size: 16px;
  }
</style>

{% endblock style %} {% block content %}
<div class="container">
  <span class="txt"></span>
</div>
{% endblock %}

运行代码之后,你可以看到页面渲染效果,下图所示的数字 123 是无法被选中的,而且在网页 DOM 元素中并不存在,它是由 after 添加到目标元素 span 之后的内容,注意伪元素是在元素内容之后插入,不会占用文档流中的空间。

有了这些基础之后,那我们就可以实现一个比较【有效果】的反爬案例了,将某些关键内容使用伪元素渲染。

CSS 伪元素反爬

实现伪元素反爬的重点其实是动态 CSS 文件生成,在这里我们模拟读取数据,然后使用 IO 读写,将 css 文件渲染到前台即可。

# CSS 伪类实现反爬
@antispider.route('/css_antispider')
def css_antispider():

    with open(app.root_path + '/data/blogs.json', 'r', encoding='utf-8') as f:
        json_data = json.loads(f.read())

    # 将数据生成到 CSS 中
    css_str = ""
    for index, item in enumerate(json_data):
        browse = item["browse"]
        comment = item["comment"]
        collection = item["collection"]

        css_str += f""".browse{index+1}::after{{content:'{browse}';font-size:14px;}}.comment{index+1}::after{{content:'{comment}';font-size:14px;}}.collection{index+1}::after{{content:'{collection}';font-size:14px;}}\n"""

    with open(app.static_folder + '/css/blog_antispider.css', 'w') as f:
        f.write(css_str)

    return render_template("antispider/css.html",data=json_data)

其中重点查看的是 CSS 代码循环部分,我们动态生成了三个类,而且用索引为其进行编号,单独一行得到的 CSS 样式如下。

.browse1::after {
  content: "5950";
  font-size: 14px;
}
.comment1::after {
  content: "49";
  font-size: 14px;
}
.collection1::after {
  content: "206";
  font-size: 14px;
}

本案例使用了 12 条数据,最终得到的结果如下所示。

前台渲染数据时,只要遵循 css 样式表中的规则即可。

详细代码可以在 爬虫训练场 站点查看,示例代码如下所示。

为了提高页面加载速度,我们在 Python 中对刚刚生成的 CSS 文件进行一下压缩,使用的库是 csscompressor,安装之后参考下述代码对 CSS 文件进行压缩。

from csscompressor import compress

compressed_css = compress(css_str)

with open(app.static_folder + '/css/blog_antispider.min.css', 'w') as f:
    f.write(compressed_css)

至此,完成本反爬案例,具体地址请访问:CSS 伪元素反爬

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。