JavaScript反爬虫技巧详细攻略

目录

1、动态生成内容

2、使用JavaScript混淆和压缩

3、使用CORS策略

4、检测用户行为

5、利用用户代理标识符

6、图片替代和隐藏字段

7、使用反爬虫服务


在当今的web开发中,JavaScript已经成为了一个不可或缺的部分。然而,这也引发了一个问题,那就是如何防止爬虫程序(如Google Bot或其他搜索引擎的爬虫)从网站中抓取数据。以下是一些关于如何防止JavaScript被爬虫抓取的技巧和策略,以及它们的一些工作原理。

1、动态生成内容

一个常见的防止爬虫抓取数据的方法是使用JavaScript来动态生成内容。这样,只有真正的人类用户才能看到完整的内容,而爬虫程序则只能获取到空白的或者部分的内容。

例如,可以使用AJAX来从服务器获取数据,然后使用JavaScript来将这些数据显示在网页上。这样,如果爬虫程序试图直接抓取网页内容,它就只能获取到HTML代码,而不能获取到实际的数据。

from flask import Flask, render_template  
app = Flask(__name__)  @app.route('/')  
def index():  # 此处从数据库或其他源动态获取数据  data = get_data()  return render_template('index.html', data=data)

2、使用JavaScript混淆和压缩

另一个防止爬虫抓取数据的方法是使用JavaScript混淆和压缩。混淆是指将JavaScript代码转换成人类难以理解的形式,而压缩则是将JavaScript代码压缩成更小的形式。这使得爬虫程序难以理解和解析JavaScript代码,从而防止它们抓取数据。

from pyminifier import minify_js  # 在HTML模板中使用混淆和压缩后的JavaScript代码  
template = '''  
<script>  var compressed_js = {{ compressed_js|safe }};  eval(compress_js);  
</script>  
'''  @app.route('/')  
def index():  js_code = '''  function hello() {  console.log("Hello, world!");  }  '''  minified_js = minify_js(js_code)  return render_template('index.html', compress_js=minified_js)

3、使用CORS策略

CORS(Cross-Origin Resource Sharing)是一种安全策略,用于防止跨站点的请求被恶意的第三方利用。在这种策略下,服务器可以指定哪些网站可以访问它的资源,而其他的网站则不能访问。这样,如果一个爬虫程序试图从另一个网站抓取数据,它就会被阻止,因为CORS策略会阻止这个网站访问目标服务器的资源。

from flask import Flask, jsonify  
from flask_cors import CORS  app = Flask(__name__)  
CORS(app)  @app.route('/data')  
def get_data():  # 获取数据,返回JSON响应  data = {'message': 'Hello, world!'}  return jsonify(data)

4、检测用户行为

最后,可以使用一些JavaScript代码来检测用户行为,以确定访问者是否是爬虫程序。例如,可以检测用户的鼠标移动轨迹、键盘输入、页面加载速度等。如果这些参数与人类用户的典型行为不符,那么很可能是爬虫程序在访问网站。

5、利用用户代理标识符

用户代理标识符(User Agent)是一个HTTP头部字段,它包含了关于浏览器类型、版本以及操作系统等的信息。虽然它不能直接用来防止爬虫抓取数据,但是它可以用来识别和限制某些类型的爬虫。例如,如果发现一个请求来自一个已知的爬虫程序,服务器可以返回一个错误信息或者定制的内容。

from flask import Flask, request, jsonify  
import json  
app = Flask(__name__)  @app.route('/data', methods=['POST'])  
def post_data():  # 检测请求头中的User Agent,根据需要定制响应  user_agent = request.headers.get('User-Agent')  if 'spider' in user_agent:  # 如果User Agent中包含“spider”,返回错误响应  return jsonify({'error': 'Spider detected'}), 403

6、图片替代和隐藏字段

对于爬虫的防止,一种常见的方式是使用图片替代敏感信息。例如,可以将用户密码存储在一个图片中,然后使用JavaScript来读取这个图片并将图片中的数据提交给服务器。以下是使用Flask和Pillow库来生成包含密码的图片的示例代码:

from flask import Flask, render_template_string  
from PIL import Image, ImageDraw, ImageFont  
import io  app = Flask(__name__)  @app.route('/')  
def index():  password = 'mypassword'  # 此处为真实的密码  img = create_image(password)  img_io = io.BytesIO()  img.save(img_io, format='PNG')  img_data = img_io.getvalue()  return render_template_string('<img src="data:image/png;base64,{}"'.format(base64.b64encode(img_data).decode()))  def create_image(password):  img = Image.new('RGB', (200, 60), color=(255, 255, 255))  d = ImageDraw.Draw(img)  fnt = ImageFont.truetype('/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf', 15)  d.text((10,10), password, font=fnt, fill=(0, 0, 0))  return img

对于隐藏字段,可以使用HTML的隐藏表单元素。这些元素通常用于收集用户输入,但在提交表单之前不会显示。可以使用JavaScript来读取和提交这些隐藏字段。以下是使用Flask和HTML来创建隐藏表单的示例代码:

from flask import Flask, render_template  
import html  app = Flask(__name__)  @app.route('/')  
def index():  return render_template('hidden.html')  @app.route('/submit', methods=['POST'])  
def submit():  data = html.unescape(request.form['myHiddenField'])  # 解码HTML特殊字符  # 此处处理数据...

在HTML文件hidden.html中,应该包含一个隐藏的输入字段:

<!DOCTYPE html>  
<html>  
<body>  <form action="/submit" method="post">  <input type="hidden" name="myHiddenField" value="这里是敏感信息">  <input type="submit" value="Submit">  </form>   
</body>  
</html>

7、使用反爬虫服务

最后,可以使用一些专门为防止爬虫而设计的服务,如reCAPTCHA、Ahrefs等。这些服务通常使用一些特殊的算法和技术来检测访问者是否是爬虫程序,如果是,就会阻止它们抓取数据。虽然这些服务并不是完全可靠的解决方案,但是它们可以作为一种额外的防护措施来使用。

总之,以上就是一些常见的防止JavaScript被爬虫抓取的技巧和策略。当然,这些只是其中的一部分,还有很多其他的方法可以防止爬虫抓取数据。因此,在实际的应用中,需要根据具体的情况来选择最合适的方法来保护自己的网站和数据。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

老师如何发布考试成绩?

成绩查询页面是什么&#xff1f;如何用各种代码、Excel来实现让学生自助查询成绩&#xff1f; 作为老师&#xff0c;发布考试成绩是教学过程中的一个重要环节。传统的做法是&#xff0c;老师手动计算每个学生的分数&#xff0c;然后将成绩单打印出来并逐个发放给学生。这种方式…

MyBatisPlus(二十)防全表更新与删除

说明 针对 update 和 delete 语句&#xff0c;阻止恶意的全表更新和全表删除。 实现方式 配置BlockAttackInnerInterceptor拦截器 代码 package com.example.core.config;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.p…

JVM第七讲:JVM 基础 - Java 内存模型详解

JVM 基础 - Java 内存模型详解 本文是JVM第七讲&#xff0c;JVM 基础 - Java 内存模型详解。主要转载自 Info 上深入理解Java内存模型, 作者程晓明。这篇文章对JMM讲的很清楚了&#xff0c;大致分三部分&#xff1a;1、重排序与顺序一致性&#xff1b;2、三个同步原语&#xff…

竞赛 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

2024年孝感市建筑类中级职称申报资料私企VS国企

2024年孝感市建筑类中级职称申报资料私企VS国企 民营企业中级职称申报跟事业单位或者是国企申报中级职称流程不一样么&#xff1f;实际上流程基本都是相同的&#xff0c;就是提交纸质版资料有点不一样。 孝感市建筑类中级职称申报基本流程 1.参加建筑类中级职称水平能力测试。 …

微信小程序前端生成动态海报图

//页面显示<canvas id"myCanvas" type"2d" style" width: 700rpx; height: 600rpx;" />onShareShow(e){var that this;let user_id wx.getStorageSync(user_id);let sharePicUrl wx.getStorageSync(sharePicUrl);if(app.isBlank(user_i…

【京东开源项目】微前端框架MicroApp 1.0正式发布

介绍 MicroApp是由京东前端团队推出的一款微前端框架&#xff0c;它从组件化的思维&#xff0c;基于类WebComponent进行微前端的渲染&#xff0c;旨在降低上手难度、提升工作效率。MicroApp无关技术栈&#xff0c;也不和业务绑定&#xff0c;可以用于任何前端框架。 源码地址…

最新ai创作系统CHATGPT系统源码+支持GPT4.0+支持ai绘画(Midjourney)

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

出详图和工程图(上)-SOLIDWORKS 2024新功能

保持尺寸链共线 即使空间有限&#xff0c;您也可以确保尺寸链保持共线。 当尺寸文本和箭头重叠时&#xff0c;您可以选择最合适的选项。 要在尺寸文本重叠时保持尺寸链共线&#xff1a; 1. 单击工具 > 选项 > 文档属性 > 尺寸 > 线性 > 尺寸链。 2. 在共线选…

【论文阅读】 Cola-Dif; An explainable task-specific synthesis network

文章目录 CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI SynthesisAn Explainable Deep Framework: Towards Task-Specific Fusion for Multi-to-One MRI Synthesis CoLa-Diff: Conditional Latent Diffusion Model for Multi-modal MRI Synthesis 论文…

基于吉萨金字塔建造优化的BP神经网络(分类应用) - 附代码

基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.吉萨金字塔建造优化BP神经网络3.1 BP神经网络参数设置3.2 吉萨金字…

nginx正向代理、反向代理、负载均衡(重中之重)

nginx中有两种代理方式&#xff1a; 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;基于tcp或udp的流量转发&#xff09; 一、七层代理 原理&#xff1a;客户端请求代理服务器&#xff0c;由代理服务器转发客户端的http请求&#xff0c;转发到内部的服务器…

YAPI介绍及Docker Compose部署指南

我们团队的项目最初前后端是同一个开发人员在做&#xff0c;因此并不存在提供详细接口文档等问题。随着项目的不断迭代&#xff0c;团队规模逐渐扩大&#xff0c;我们决定将前后端分开&#xff0c;专门由专业的前端和后端人员进行开发工作。然而&#xff0c;这样的改变也带来了…

Systrace学习笔记

Systrace学习笔记 1.Systrace快捷键2.线程状态3.CPU info4.图形化4.1 Frames帧4.2 用户活动4.3 CPU活动4.4 系统事件 5. SystemServer5.1 SystemServer简介5.2 窗口动画5.3 AMS(ActivityManagerService)5.4 WMS(WindowMagerService)5.5 ServiceThread5.6 HandlerThread 6. Surf…

OpenAI开放gpt-3.5turbo微调fine-tuning测试教程

文章目录 openai微调 fine-tuning介绍openai微调地址jsonl格式数据集准备点击上传文件 openai微调 fine-tuning介绍 openai微调地址 网址&#xff1a;https://platform.openai.com/finetune jsonl格式数据集准备 使用Chinese-medical-dialogue-data数据集git clone进行下载 …

Puppeteer记录操作过程及优秀的开源插件(五)

Puppeteer记录操作过程及优秀的开源插件&#xff08;五&#xff09; Puppeteer记录操作过程及优秀的开源插件&#xff08;五&#xff09;一、简介二、自动生成测试代码三、优秀的开源插件四、参考案例 一、简介 本节我们将介绍通过浏览器工具记录用户的实际操作&#xff0c;并…

Java基础之接口(interface)详解

对Java核心技术卷的一个简单笔记 目录 前言1.接口的概念2.接口的声明格式3.接口的属性4.接口和抽象类的区别5.继承和接口混合使用的一些规则6.继承父类和实现接口时的一些同名冲突问题6.1方法名冲突6 .2常量名冲突 前言 总结一下基础阶段接口常见的问题 1.接口的概念 接口 &…

F. Minimum Maximum Distance Codeforces Round 903 (Div. 3)

Problem - F - Codeforces 题目大意&#xff1a;有一棵n个点的树&#xff0c;其中有k个标记点&#xff0c;令点i到所有标记点的最远距离为fi&#xff0c;问所有点中fi的最小值是多少 1<k<n<2e5 思路&#xff1a;我们首先考虑取得最小值的点在哪&#xff0c;我们假设…

Unity教程 ECS 内存分配器原理详解

一、UnityECS内存分配器的作用 在传统的面向对象编程模式中&#xff0c;我们通常使用堆内存来存储实体和组件数据。然而&#xff0c;由于实体和组件数据的规模通常非常庞大&#xff0c;使用堆内存进行分配和管理会导致内存碎片化和性能下降的问题。为了解决这个问题&#xff0…

常见的数据结构及应用

文章目录 前言数据结构介绍数组链表队列和栈树堆 总结 前言 数据结构是计算机存储、组织数据的方式。在工作中&#xff0c;我们通常会直接使用已经封装好的集合API&#xff0c;这样可以更高效地完成任务。但是作为一名程序员&#xff0c;掌握数据结构是非常重要的&#xff0c;…