首页 > 编程语言 >Python实现反爬虫

Python实现反爬虫

时间:2024-03-30 11:15:03浏览次数:36  
标签:Python resp 爬虫 gz 实现 gzip 1MB dd

环境

Python3.12
image

安装fastapi

pip install "fastapi[all]"

image

代码

from fastapi import FastAPI, Response
from fastapi.responses import FileResponse

app = FastAPI()

@app.get('/')
def index():
    resp = FileResponse('data.gz')
    resp.headers['Content-Encoding'] = 'gzip'  # 说明这是gzip压缩的数据,否则请求时是乱码
    return resp

VSCode选择编译器环境

Cmd+Shift+P选择 Python : Select Interpreter
image

运行服务

uvicorn server:app

image

Uvicorn 简介

uvicorn是一个基于asyncio开发的一个轻量级高效的web服务器框架

uvicorn 设计的初衷是想要实现两个目标:
使用uvloop和httptools 实现一个极速的asyncio服务器
实现一个基于ASGI(异步服务器网关接口)的最小应用程序接口。

目前支持http, websockets, Pub/Sub 广播,并且可以扩展到其他协议和消息类型。

安装使用
uvicorn 仅支持python 3.5.3以上版本,我们可以通过pip3来快速的安装。

压缩数据包

将文本文件压缩成gz压缩包

cat hello.txt | gzip > data.gz

image

客户端请求

import requests

resp = requests.get('http://127.0.0.1:8000/').text
print(resp)

不带resp.headers['Content-Encoding'] = 'gzip'时运行后乱码
image
带resp.headers['Content-Encoding'] = 'gzip' 时返回解析压缩包后的数据
image

使用压缩数据包原理

文本内容为192个1。相当于把192个字符压缩成了5个字符,压缩率高达97.4%。
可以把一个1GB的文件压缩成1MB,那么对服务器来说,仅仅是返回了1MB的二进制数据,不会造成任何影响。但是对客户端或者爬虫来说,它拿到这个1MB的数据以后,就会在内存中把它还原成1GB的内容。这样一瞬间爬虫占用的内存就增大了1GB。如果我们再进一步增大这个原始数据,那么很容易就可以把爬虫所在的服务器内存全部沾满,轻者服务器直接杀死爬虫进程,重则爬虫服务器直接死机。

mac命令

dd if=/dev/zero bs=1048576 count=1000 | gzip > boom.gz

执行完后生成的文件只有995K,
image

linux命令

# dd: 是一个命令行工具,用于转换和复制文件。这里用来生成一个特定大小的文件。
# if=/dev/zero: 指定输入文件(if代表input file)。/dev/zero是一个特殊的文件,读取会产生无限的零(\0字符)。
# bs=1048576: bs代表“block size”,即每个块的大小。1048576字节等于1MB。这意味着dd命令在每次读写操作中处理1MB的数据。
# count=1000: 这指定dd命令需要复制的块数。因为每个块是1MB,count=1000意味着总共复制1000MB,即1GB的数据。
# | gzip: 这个部分使用管道(|)将dd命令的输出直接传递给gzip命令,后者是一个压缩工具。这意味着生成的1GB数据会被gzip压缩。
# > boom.gz: 最后,>将压缩后的数据重定向到一个名为boom.gz的文件中。如果文件已经存在,它会被覆盖;如果不存在,则会被创建。
dd if=/dev/zero bs=1M count=1000 | gzip > boom.gz

把数据包换成boom.gz

import requests
import sys

resp = requests.get('http://127.0.0.1:8000/').text
print(sys.getsizeof(resp)/1024/1024+"GB")

请求期间可以看到内存在持续的增加
image

浏览器直接请求http://127.0.0.1:8000/
image
这样在确定爬虫IP的时候拦截请求把请求重定向到这个地址即可.
来源: https://mp.weixin.qq.com/s?__biz=MzIxODg1OTk1MA==&mid=2247532470&idx=2&sn=fa2ffd45539f406af5db1aed7bbfc4ad&chksm=968d5f85be7938d054924240570270804ad5dd1ce6f6d36304f731679e5175d56a0e55b5a616&scene=132&exptype=timeline_recommend_article_extendread_samebiz&show_related_article=1&subscene=21&scene=132#wechat_redirect

标签:Python,resp,爬虫,gz,实现,gzip,1MB,dd
From: https://www.cnblogs.com/aeolian/p/18105087

相关文章

  • Spring Cloud中从0-1实现高效的API接口,快来简单有效的方式来构建API接口
    目录1.添加POM依赖2.构建目录结构3.构建文件4.实现API接口4.1.MyBatis4.1.1.控制层(Controller)4.1.2.服务接口层(ServiceInterface)4.1.3.服务层(ServiceImplementation)4.1.4.实体类(Entity)4.1.5.数据访问层(Mapper) 4.1.6.JUnit单元测试Controller层测......
  • SpringBoot + Activiti 工作流搭建与实现(附文档+源码)
      前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务......
  • hatch python 现代项目管理工具
    hatchpython现代项目管理工具,以下是一些简单试用安装clibrewinstallhatch一些推荐配置这样我们的venv直接在执行目录中,比较方便使用hatchconfigsetdirs.env.virtual.hatch简单项目clihatchnewdalongdemo......
  • 年龄并非壁垒,有技术才能实现职业长青
    程序员35岁会失业吗?35岁被认为是程序员职业生涯的分水岭,许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长,技术更新换代的速度会使得资深程序员难以跟上;而另一些人则认为,丰富的经验和深厚的技术积累是年轻程序员无法比拟的宝贵财富。一、技术......
  • 基于Java+Springboot框架自习室教室座位预约系统设计与实现
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......
  • VS Code中如何设置Ctrl + 滚轮实现代码缩放?
    其实,步骤很简单,只需两步即可步骤一:找到左上角的文件选项,然后逐步点击首选项和设置步骤二:打开后在搜索框中搜索 MouseWheelZoom,勾选第一个框即可(第二个框是否勾选看个人需求~)好啦,今天的实用小技巧就分享到这里啦,喜欢的话点个关注,我会持续更新更多有用的技巧!......
  • 直播软件搭建,通过多种方式实现垃圾回收优化
    直播软件搭建,通过多种方式实现垃圾回收优化垃圾回收优化我们还需要根据直播软件搭建的性能需求,调整垃圾回收器的参数,选择合适的垃圾回收策略和算法。在进行接口调优时,垃圾回收优化是内存管理的一个重要方面。合理配置垃圾回收策略以及降低垃圾回收的成本可以有效提高系统的......
  • Python环境下一种改进小波分解方法-用于多分量信号的分解
    小波通俗的讲就是一种振幅表现为在正负之间震荡的波形。小波变换在基于短时傅立叶变换的前提下,又加入了其所没有的可随频率变化的“时间-频率”窗口,其能对时间、频率进行局部化分析,并且对待处理信号通过多尺度处理使其表现为时-频细分的特点,是一种能突出信号时频特点以及细节的......
  • Python环境下基于机器学习的空压机故障识别(出口阀泄漏等)
    Python环境下基于机器学习(多层感知机,决策树,随机森林,高斯过程,AdaBoost,朴素贝叶斯)的压缩机故障识别(出口阀泄漏,止逆阀泄露,轴承损伤,惯性轮损伤,活塞损伤,皮带损伤等)。空压机是一种经典的动力设备,也被誉为企业产品生产的"生命气源",,广泛应用于制药工业、爆破采煤、矿上通风、风动实......
  • 直播软件开发,利用对象池实现内存占用优化
    直播软件开发,利用对象池实现内存占用优化对象池是一种重复使用对象的机制,而不是频繁地创建和销毁对象。通过对象池,可以避免创建大量的临时对象,减小对象数量,从而减少直播软件开发中内存占用和垃圾回收的压力。importjava.util.concurrent.ArrayBlockingQueue;importjava.ut......