PyQt5实战——翻译的实现,第一次爬取微软翻译经验总结(八)

个人博客:苏三有春的博客
系类往期文章:
PyQt5实战——多脚本集合包,前言与环境配置(一)
PyQt5实战——多脚本集合包,UI以及工程布局(二)
PyQt5实战——多脚本集合包,程序入口QMainWindow(三)
PyQt5实战——操作台打印重定向,主界面以及stacklayout使用(四)
PyQt5实战——UTF-8编码器UI页面设计以及按钮连接(五)
PyQt5实战——UTF-8编码器功能的实现(六)
PyQt5实战——翻译器的UI页面设计以及代码实现(七)

前言

本文虽然被归类于PyQt开发实战,但实际上并没有关于PyQt的相关知识,这篇文章着重基于上篇文章,讲述笔者在开发翻译器时如何做爬取微软翻译网站时的分析,如何获取到网站所需要的信息。这其中也是夹杂了许多笔者个人的猜想与运气才碰出来的,笔者对爬虫也没有做更深的学习,只有一些粗浅的理解,并结合这个项目一点一点摸出来的,可能有更专业的工具与更成体系的知识架构,笔者也要去学习,希望这篇文章对读者能起到一些帮助和启发。

本文从笔者第一次爬取开始讲起,第一次失败了,总结了失败的经验,第二次才爬取成功。

第一次爬取微软翻译

分析

在笔者进行爬虫的时候,首先先打开了浏览器自带的开发者工具查看网络数据,看看在翻译时客户端与服务器之间做了哪些交流

在排查的过程中,发现有一个名称叫做ttranslate...的包引起了笔者的注意,点进去发现这其中确实携带了笔者要翻译的信息

请添加图片描述

从上图中可以看到,包的负载中的表单数据中有一项Text,携带的数据刚好是我们输入的翻译内容你好

打开预览可以看到更详细的信息

请添加图片描述

在这里可以发现:

  • 这里有我们翻译之前的语种,即:zh-Hans,简体中文
  • 翻译后的文本,保存在一个名为translations的数据中,text:Hello,这个数据就是我们要获取的数据,其实这就是对于翻译请求的响应,打开响应界面也是这一串信息

响应界面如下:

请添加图片描述

所以,本质上,笔者就是想要获得对于这个请求的响应,因此笔者的方法是模仿这个包的请求,读取它的响应,从而获得对应的翻译数据。

实践

因此根据爬虫的流程,笔者先获取了ttranslate的请求URL,即:

https://cn.bing.com/ttranslatev3?isVertical=1&&IG=94BF74DDDBA34ECB8B2CFB8D7960E4F9&IID=translator.5025

再获取了请求标头中的User-Agent,即:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0

如下图所示:

请添加图片描述

获取URL是为了获取请求的目的地,获取User-Agent是为了让服务器认为我们是一个人,而不是脚本在自动操作(虽然真的是一个脚本),现在这两者已经获取,我们这段信息就有了身份。(虽然请求标头中还有许多其它的信息,但笔者也没搞懂有什么作用,索性也就没管)

接下来这既然是一个请求,那么我们就需要携带需要请求的消息,消息的格式是什么呢?在负载中可以找到,负载就是请求的内容,如下图所示:

请添加图片描述

显而易见的是,表单数据中携带了我们待翻译内容的语种,翻译结果的语种,以及翻译的数据。我们需要将这些信息放进我们的请求中。

信息收集完毕,开始编写代码(下面展示代码主题,读者需要注意这其中还调用了第三方关于爬虫的库,如报错,请pip install 响应的第三方库)

url = "https://cn.bing.com/ttranslatev3?isVertical=1&&IG=94BF74DDDBA34ECB8B2CFB8D7960E4F9&IID=translator.5025"
header = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0"}
data = {"fromLang":"zh-Hans","to":"en","text":text}
data = urllib.parse.urlencode(data).encode("utf-8")
req = urllib.request.Request(url, data, headers=header)
response = urllib.request.urlopen(req)
html = response.read().decode("utf-8")
target = json.loads(html)
print(target[0]['translations'][0]['text'])

以下,我们来逐行分析代码:

  • 将刚刚得到的URL存放起来
  • user-agent也存放起来,存放在header字典中
  • 将我们请求的数据:翻译前的语种,翻译后的语种,文本也存放起来,存放在data字典中
  • data进行utf-8加密,转换成响应的url请求格式
  • 使用Request方法发送请求,参数为url,data,header
  • 使用urlopen方法获取响应
  • 将响应解码
  • 将JSON格式的字符串解析成python对象,比如字典,列表等
  • 获取这个target中关于translation列表下的字典的text对应的值

总结

以上,是笔者的第一次爬虫,一开始爬取的时候使用正常,可以正常的使用,但没过多久,翻译器无法使用,无故闪退,笔者开始debug,发现已经无法通过这个url发送请求了。

笔者开始整理,经过多次请求尝试和实验,发现url存在一些端倪:

https://cn.bing.com/ttranslatev3?isVertical=1&&IG=94BF74DDDBA34ECB8B2CFB8D7960E4F9&IID=translator.5025

我们再来看一下这个URL,可以发现,这URL本身就携带了一些信息,IGIID,这两个数据在每次会话结束后,都会发生变化,也就是说,当一个会话结束后,笔者所记录的IGIID就失效了,无法访问,因此,这一次爬虫并不成功,还需要继续改进,获取每次访问微软翻译时的IGIID数据。

结语

总的来说,本文只是笔者在爬虫方向上的一次探索与学习,这是一次失败的尝试,不过可以看出,笔者在学习上的思路,笔者在学习时,喜欢在实践中发现问题并解决问题,因为理论与实践总是存在一定的差距,现实世界总是复杂且多变的。在实践中,你总会发现一些与理论有偏差或者相悖的地方,让你陷入迷茫,但是在实践中,你不会没有一点头绪,相反,在实践中,你有太多太多的方向去验证问题的本质,有时候往往是方向太多,你无法确定哪条路才能通向正确,你害怕做了无用功,害怕走错了方向,因此迟迟不敢动手,才导致了自己的踌躇不前。在现实世界中抽丝剥茧,也是一种学习,虽然笔者在这里也走错了路,离成功还有一段距离,但是走到这里,让笔者学会了如何看网络包,分析请求和响应,学会调用request库,以及最重要的找到了正确的道路,即:接下来,我们要想办法找到每一次IGIID这两个数据如何变,在哪里变,如何获取到那个存放这两个数据的包。致敬技术,希望你变得更强!

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

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

相关文章

【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!

数据集列表 帮忙采集开源数据集,包括YOLO格式数据集和Pascal VOC格式数据集,含图像原文件和标注文件,几百张到几千张不等,国内外公开数据集均可。 针对目标检测,YOLO系列模型训练,分类训练等。 部分数据…

Vue前端开发:元素动画效果之过渡动画

在Vue中&#xff0c;专门提供了一个名称为transition 的内置组件&#xff0c;来完成单个DOM元素的动画效果&#xff0c;该组件本身和它的顶层并不渲染动画效果&#xff0c;而只是将动画效果应用到被组件包裹的DOM元素上&#xff0c;代码实现的格式如下所示。 <transition&g…

【C/C++】strcmp函数的模拟实现

零.导言 之前我们学习了strcmp函数&#xff0c;不妨我们现在尝试模拟实现strcmp函数的功能。 一.实现strcmp函数的要点 strcmp函数是一种字符串函数&#xff0c;可以比较字符类型的数组&#xff0c;因此我们自定义的模拟函数需要两个char类型的指针参数&#xff1b;第一个字符…

ima.copilot:智慧因你而生

在数字化时代&#xff0c;信息的获取、处理和创作已经成为我们日常工作和学习中不可或缺的一部分。腾讯公司推出的ima.copilot&#xff08;简称ima&#xff09;正是为了满足这一需求&#xff0c;它是一款由腾讯混元大模型提供技术支持的智能工作台产品&#xff0c;旨在通过智能…

string类

1. 标准库中的string类 1.1 string类(了解) string - C Reference 在使用string类时&#xff0c;必须包含 # include头文件以及 using namespace std; 1.2 auto和范围for 1&#xff09;auto关键字 作为一个新的类型指示符来指示编译器&#xff0c;auto声明的变量必须由编…

元数据管理是如何在ETL过程中发挥作用的?

ETL&#xff08;抽取、转换和加载&#xff09;技术在现代大数据处理中起着至关重要的作用。ETL技术主要用于将不同来源、格式和结构的数据抽取到一个中心化的数据仓库&#xff0c;并进行转换和加载&#xff0c;进而提供一致、高质量的数据给数据分析和报告工具。然而&#xff0…

vscode Comment Translate 反应慢 加载中...

Comment Translate 版本&#xff1a;v2.3.3 你是不是疑惑切换了 Bing 源也无法使用还是加载中… 那么可能你切换Bing后没重启vscode 下面是切换成功后的插件日志&#xff0c;一定要重启vscode&#xff0c;只是禁用和启用插件不行的&#xff0c;另外google是没用的&#xff0c;用…

机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

如何搭建 ELK【elasticsearch+logstash+kibana】日志分析系统

一、为什么需要日志分析系统&#xff1f; 日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷&#xff0c;性能安全性&#xff0c;从而及时采取措…

Android智能座驾,carlink场景截屏黑屏问题

背景 项目开发过程中&#xff0c;遇到如下问题&#xff1a; 【操作步骤】 1、建立导航音乐分屏 2、连接Carlink&#xff0c;车机端打开任意Carlink应用&#xff0c;点击音乐图标回到分屏 【结果】 页面会出现1s黑屏再显示分屏的情况 详细分析 比较怀疑是截屏的方法拿到的图片就…

Go语言的常用内置函数

文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包&#xff08;rand&#xff09; 一、Strings包 字符串处理包定义 Strings包简介&#xff1a; 一般编程语言包含的字符串处理库功能区别…

Vue实战学习(2)(Vue快速入门(快速构建一个局部Vue项目))

目录 一、Vue快速入门。 &#xff08;1&#xff09;快速入门的案例需求。 &#xff08;2&#xff09;原生js解决。 &#xff08;3&#xff09;使用Vue解决。 1、准备一个html页面。且该页面需要引入Vue模块。 2、创建Vue程序的应用实例。 3、准备html元素&#xff08;如div&…

canal1.1.7使用canal-adapter进行mysql同步数据

重要的事情说前面&#xff0c;canal1.1.8需要jdk11以上&#xff0c;大家自行选择&#xff0c;我这由于项目原因只能使用1.1.7兼容版的 文章参考地址&#xff1a; canal 使用详解_canal使用-CSDN博客 使用canal.deployer-1.1.7和canal.adapter-1.1.7实现mysql数据同步_mysql更…

羽星股份引领连锁业数智化转型,厦门羽星科技公司逆势增长剑指纳斯达克

羽星股份引领连锁业数智化转型&#xff0c;厦门羽星科技公司逆势增长剑指纳斯达克 在消费降级的大环境下&#xff0c;许多企业面临严峻挑战。在消费降级背景下&#xff0c;消费者购买力下降&#xff0c;对价格敏感度提升&#xff0c;更加注重产品的性价比和实用性。这一趋势促使…

RabbitMQ应用

1. 7种工作模式介绍 1.1 Simple(简单模式) P: ⽣产者,也就是要发送消息的程序C: 消费者,消息的接收者Queue: 消息队列(图中⻩⾊背景部分)类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从 其中取出消息 特点: ⼀个⽣产者P&#xff0c;⼀个消费者C, 消息只能被消费…

从Java中使用new 关键字创建对象开始,深度剖析对象结构与存储

文章目录 1.对象结构2.扩展补充3.小结 1.对象结构 在介绍之前.先来看一个java高频面试题&#xff0c;new String(hello") 创建了几个对象&#xff1f; 1.这里分情况讨论&#xff0c;如果hello已经在常量池中存在&#xff0c;那么就是在堆中创建1个对象&#xff0c;并返回…

ThreadLocal 的原理和使用场景

1.ThreadLocal是什么 ThreadLocal 是 Java 提供的一个用于线程存储本地变量的类。它为每个线程提供独立的变量副本&#xff0c;确保变量在多线程环境下的线程安全。每个线程访问 ThreadLocal 时&#xff0c;都会有自己专属的变量副本&#xff0c;互不干扰&#xff0c;避免了并…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…

关于Redis

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…

linux nvidia/cuda安装

1.查看显卡型号 lspci |grep -i vga2.nvidia安装 2.1在线安装 终端输入&#xff08;当显卡插上之后&#xff0c;系统会有推荐的安装版本&#xff09; ubuntu-drivers devices可得到如下内容 vendor : NVIDIA Corporation model : TU104GL [Tesla T4] driver : nvid…