网络爬虫实战 | 上传以及下载处理后的文件

news2024/11/29 8:40:49

以实现爬虫一个简单的(SimFIR (doctrp.top))网址为例,需要遵循几个步骤:

1. 分析网页结构

  • 首先,需要分析该网页的结构,了解图片是如何存储和组织的。这通常涉及查看网页的HTML源代码,可能还包括CSS和JavaScript文件。
  • 检查图片URL的模式,看看是否有规律可循,这将有助于编写爬虫时定位和下载图片。

2. 编写爬虫代码

  • 使用Python中的库,如requests来访问网页,BeautifulSoup来解析HTML。
  • 编写代码以遍历网页,定位图片链接,并将它们下载到您的本地存储。

3. 实现畸变矫正

  • 选择适合的畸变矫正算法。需要使用像OpenCV这样的图像处理库。
  • 编写代码以批量读取下载的图片,应用畸变矫正算法,并保存矫正后的图片。

4. 自动化和优化

  • 使整个过程自动化,以便只需运行一个脚本即可完成从爬取到矫正的整个流程。
  • 确保您的代码在处理大量数据时效率高并且稳定。

实战开始 

观察到红色框内"点击上传"处上传文件,然后点击按钮"Submit"实现文件上传;转换后的图片会显示在绿色框内,可点击"Download"按钮下载。

1)找到正确的URL

        通常这些信息可以从网络请求中找到,使用浏览器的开发者工具观察网络请求。在浏览器中打开开发者工具(通常可以通过按F12或右键检查来打开),然后尝试正常上传一个文件。在"网络"(Network)选项卡中,可以监控到所有由网页发出的HTTP请求。找到文件上传时的请求,可以看到请求的URL、方法、请求头和请求体等信息。这里的URL就是上传接口的URL。

可以看到几个请求:

  • 一个 data:image/jpeg;base64, 开头的请求,这是一个 Base64 编码的图片数据,可能是上传的图片。
  • 一个名为 predict 的请求,这很可能是触发图片处理的 API 调用。
  • 一个字体请求,看起来与图片上传和下载无关。
  • 一个 data:image/png;base64, 开头的请求,这可能是处理后的图片。

从这些信息来看,处理后的图片可能是直接作为 Base64 编码的数据嵌入在某个API响应中的。如果 predict 请求是用来处理图片的,那么需要查看这个请求的详细内容,包括它的响应体。响应体中可能包含了处理后的图片的 Base64 编码数据。

可以看到请求了predict的URL:


2)观察服务器期望的数据形式

        在编程过程中,可以打印print(response.text),观察服务器的期望。

session = requests.Session()
response = session.post("https://simfir.doctrp.top:20443/run/predict", json={'data': [base64.b64encode(image_file.read()).decode('utf-8')]}, verify=False)
# 检查响应
if response.ok:

else:
    print('获取处理后的图片失败,状态码:', response.status_code)
    print(response.text)

        发现服务器期望在 data 字段中接收一个列表。这意味着需要将图片数据作为列表的元素发送,即使只有一个图片。服务器返回的是一个列表,那么从列表中提取图像数据。

        接受到的processed_image_data_list[0]在解码中无法正确解码图片,困惑我好久,最后注意到是因为前面包含了'data:image/png;base64,'字段,然后去除字段就可以正常编码了。

3)代码实现

注释详细,简单易懂:

import requests
import time
import base64
import os

# 禁用由于未验证的SSL证书引发的警告
requests.packages.urllib3.disable_warnings()

# 指定服务器的URL
url = 'https://simfir.doctrp.top:20443/'

# 图片的本地路径,需要发送到服务器的图片
local_image_path = '1.jpg'

# 处理图像的服务器端点
processed_image_endpoint = url + 'run/predict'

# 创建一个会话,这在需要维持会话状态时很有用,例如进行多次请求
session = requests.Session()

# 以二进制读取模式打开本地图片文件
with open(local_image_path, 'rb') as image_file:
    # 将图片文件编码为base64字符串,这是将二进制内容转换为可以通过JSON发送的文本格式的一种方式
    image_encoded = base64.b64encode(image_file.read()).decode('utf-8')

# 准备请求数据,将编码的图片数据放入data字段中
data_to_send = {'data': [image_encoded]}

# 向服务器发送POST请求,并附上编码的图片数据,verify=False表示忽略SSL证书验证
response = session.post(processed_image_endpoint, json=data_to_send, verify=False)

# 检查响应状态码是否表明请求成功
if response.ok:
    # 假设服务器会返回JSON格式的响应,并且包含了处理后的图像数据
    processed_image_data_list = response.json().get('data')
    # 检查返回的数据是否是列表形式
    if processed_image_data_list and isinstance(processed_image_data_list, list):
        # 获取列表中的第一个元素,即处理后的图像数据
        encoded_data = processed_image_data_list[0]
        # 假设数据以data:image/png;base64,开头,这需要被移除
        encoded_data = encoded_data.split('data:image/png;base64,')[1].rstrip(' \n\r')
        # 输出编码后的数据,用于调试
        print(encoded_data)
        # 如果编码数据长度不是4的倍数,则添加必要的'='填充字符
        padding = '=' * (-len(encoded_data) % 4)
        encoded_data_with_padding = encoded_data + padding

        try:
            # 尝试对带填充字符的base64字符串进行解码
            image_data = base64.b64decode(encoded_data_with_padding)
            # 指定输出图像的路径
            output_image_path = os.path.join('output_image.png')
            # 将解码后的图像数据写入到文件中
            with open(output_image_path, 'wb') as file:
                file.write(image_data)
            # 打印成功消息
            print('转换后的图片已成功保存到', output_image_path)
        except base64.binascii.Error as e:
            # 如果解码失败,打印错误信息
            print("Base64 解码失败:", e)
    else:
        # 如果响应数据不是列表形式,打印错误信息
        print('响应中未找到列表形式的图片数据')
else:
    # 如果请求失败,打印状态码和错误信息
    print('获取处理后的图片失败,状态码:', response.status_code)
    print(response.text)

最终实现文件上传—> 处理文件—> 接收文件

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

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

相关文章

【剪辑必备】今天我教你如何手动去下载苹果官网4K预告片 完全免费

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起学习和进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&a…

问题:用来表示证券收益的波动性,值越大说明()。 #媒体#经验分享

问题:用来表示证券收益的波动性,值越大说明()。 A.风险大 B.风险小 C.不确定 D.风险固定 参考答案如图所示

MySQL5.7升级到MySQL8.0的最佳实践分享

一、前言 事出必有因,在这个月的某个项目中,我们面临了一项重要任务,即每年一次的等保测评整改。这次测评的重点是Mysql的一些高危漏洞,客户要求我们无论如何必须解决这些漏洞。尽管我们感到无奈,但为了满足客户的要求…

命令行参数和环境变量

命令行参数 命令行参数是在用户在命令行中输入命令时,跟随命令一起输入的一些附加信息。这些参数可以用来配置命令的行为或传递一些数据给命令。 让同样的程序在不同的命令行参数下运行出不同的结果! 将这些命令和参数可以传给 main 函数生&#xff0…

(15)Hive调优——数据倾斜的解决指南

目录 前言 一、什么是数据倾斜 二、发生数据倾斜的表现 2.1 MapReduce任务 2.2 Spark任务 三、如何定位发生数据倾斜的代码 四、发生数据倾斜的原因 3.1 key分布不均匀 3.1.1 某些key存在大量相同值 3.1.2 存在大量异常值或空值 3.2 业务数据本身的特性 3.3 SQL语句…

【更新】企业数字化转型-年度报告175个词频、文本统计

数据说明: 这份数据含数字化转型175个词频、各维度水平,保留2000-2021年数据。参考吴非、赵宸宇两位老师做法,根据上市公司年报文本,整理数字化转型175个词频数据,希望对大家有所帮助。 参考管理世界中吴非&#xff…

【正点原子STM32】TIMER 定时器(软件定时原理、定时器定时原理、分类和特性、基本定时器(影子寄存器和U事件和UI中断))

一、定时器概述 1.1、软件定时原理1.2、定时器定时原理1.3、STM32定时器分类1.4、STM32定时器特性表1.5、STM32基本、通用、高级定时器的功能整体区别 二、基本定时器 2.1、基本定时器简介2.2、基本定时器框图2.3、定时器计数模式及溢出条件2.4、定时器中断实验相关寄存器2.…

c语言(指针进阶)

指针 一.什么是字符指针二.使用指针数组模拟二维数组三.函数指针 一.什么是字符指针 字符指针:指向字符型数据的指针变量。每个字符串在内存中都占用一段连续的存储空间,并有唯一确定的首地址。即将字符串的首地址赋值给字符指针,可让字符指针…

用HTML Canvas和JavaScript创建美丽的花朵动画效果

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>flower</title><style>* {margin: 0;padding: 0;overflow: hidden;backg…

公需课考试怎么搜题找答案? #学习方法#学习方法

这些软件以其强大的搜索引擎和智能化的算法&#xff0c;为广大大学生提供了便捷、高效的解题方式。下面&#xff0c;让我们一起来了解几款备受大学生欢迎的搜题软件吧&#xff01; 1.粉鹿搜题 这是一个公众号 在线搜题刷题平台&#xff0c;支持语言、文字、拍照多种搜索方式…

操作 Docker 存储卷的常用指令汇总

1. 什么是存储卷&#xff1f; 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。使得可以在宿主机和容器内共享数据库内容&#xff0c;让容器直接访问宿主机中的内容&#xff0c;也可以宿主机向容器写入内容&#xff0c;容…

.NET Core WebAPI中使用Log4net记录日志

一、安装NuGet包 二、添加配置 // log4net日志builder.Logging.AddLog4Net("CfgFile/log4net.config");三、配置log4net.config文件 <?xml version"1.0" encoding"utf-8"?> <log4net><!-- Define some output appenders -->…

类加载过程介绍

一、类的生命周期 类被加载到jvm虚拟机内存开始&#xff0c;到卸载出内存为止&#xff0c;他的生命周期可以分为&#xff1a;加载->验证->准备->解析->初始化->使用->卸载。 其中验证、准备、解析统一称为链接阶段 1、加载 将类的字节码载入方法区中&#xf…

蓝桥杯第十四届电子类单片机组程序设计

目录 前言 蓝桥杯大赛历届真题&#xff08;点击查看&#xff09; 一、第十四届比赛题目 1.比赛原题 2.题目解读 1&#xff09;任务要求 2&#xff09;注意事项 二、任务实现 1.NE555读取时机的问题 1&#xff09;缩短计数时间 2&#xff09;实时读取 2.温度传感器读…

unity的重中之重:组件

检查器&#xff08;Hierarchy&#xff09;面板中的所有东西都是组件。日后多数工作都是和组件打交道&#xff0c;包括调参、自定义脚本组件。 文章目录 12 游戏的灵魂&#xff0c;脚本组件13 玩转脚本组件14 尽职的一生&#xff0c;了解组件的生命周期15 不能插队&#xff01;…

专业130+总分420+厦门大学847信号与系统考研经验厦大信息系统与通信工程,真题,大纲,参考书。

今年很幸运被厦门大学录取&#xff0c;考研专业课847信号与系统130&#xff0c;数二130&#xff0c;总分420&#xff0c;回头看这将近一年的复习&#xff0c;还是有不少经验和大家分享&#xff0c;希望对大家复习有帮助。专业课&#xff1a; 厦门大学847信号与系统在全国各高校…

BossPlayerCTF

靶场环境问题 靶场下载之后&#xff0c;可能会出现扫描不到IP的情况&#xff0c;需要进行调整&#xff0c;参考&#xff1a; Vulnhub靶机检测不到IP地址_vulnhub靶机nmap扫不到-CSDN博客 该靶机没有vim&#xff0c;需要使用vi命令去修改&#xff1b;改成当前网卡即可&#x…

推荐《架构探险:从零开始写Java Web框架》

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 春节读了《架构探险&#xff1a;从零开始写Java Web框架》&#xff0c;一本大概10年前的好书。 本书的作者是阿里巴巴架构师黄勇。黄勇对分布式服务架构与大数据技术有深入…

【Linux】进程信号概念 | 核心转储 | 信号的产生

文章目录 一、信号入门1.1 生活中的信号1.2 进程角度的信号1.3 信号的概念1.4 信号的三种常见处理方式 二、信号的产生2.1 通过终端按键产生信号问题1&#xff1a;OS怎么知道键盘输入了ControlC &#xff1f;问题2&#xff1a;按CtrlC终止进程和按Ctrl\终止进程&#xff0c;有什…

多进程面试题汇总

这里写目录标题 一、多进程1、进程的定义&#xff1a;2、单核多任务CPU执行原理3、进程的优点和缺点4、创建进程15、创建进程26、进程池6.1、进程池的作用6.2、原理图6.3、使用进程池的优点 7、进程间的通信&#xff08;Queue&#xff09;7.1、需求1&#xff1a;采用多进程将10…