PyQt5实战——翻译的实现,成功爬取微软翻译(可长期使用)经验总结(九)

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

前言

本文笔者吸取了第一次爬取微软翻译的经验,发现在对微软翻译进行请求的时候,URL会随着会话结束而重新生成,这一点是本文需要解决的内容,且除了URL中出现的IGIID两个数据外,在请求的表单数据中,还有keytoken两个数据也在动态变化。本文旨在追踪这几个数据在何时被发送,如何被获取。

分析

首先,重新打开浏览器自带的开发者工具,随便翻译一词,让客户端发送一次翻译请求ttranslatev3,可以发现,这次URL与前一篇文章PyQt5实战——翻译的实现,第一次爬取微软翻译经验总结(八)的又不一致

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

笔者借助开发者工具自带的搜索框进行搜索,看看我们需要的数据在哪里出现过

除了上一篇文章中提到的IGIID两个数据外,我们还需要找到tokenkey两个数据,在ttranslatev3响应请求中,可以看到我们发送请求时,请求表单除了携带需要翻译的文本,翻译前的语种,翻译后的语种外,还需携带两个特殊的信息

请添加图片描述

至于tryFetchingGenderDebiasedTranslations一直为true,因此直接填写即可

IG

找到IG所在

首先看看IG在哪里出现过,将IG的数据DFFF2F46AAE0482491F67EEEB26C249C复制进搜索框查询,得到以下信息

请添加图片描述

可以发现,搜索出来的大部分请求中,这一串数据都是出现在URL与path中的,也就是说,这些请求中,IG数据也是被使用的,并不是出自于这些请求,继续向下滑动,找到了一个translator的包

请添加图片描述

如果你点击进去,就会发现,这其实就是访问该页面的第一个请求响应,它的html数据构建了整个页面

请添加图片描述

现在我们查看IG数据在这个响应的哪里,点击刚刚搜索的地方,会自动跳转到response出现了相同信息的地方,如下图所示:

请添加图片描述

因此,现在重新确认一下目标:目标从“找到IG数据的出处”变更为“获取IG数据”。

请求获取IG数据

来观察一下这个请求响应,回顾一下上一篇文章,我们在请求时需要些什么数据:

URLUser-Agent表单数据

那我们依次来找这个请求所需要的数据,首先看标头:

请添加图片描述

URL

这个URL携带的信息很好猜,https://cn.bing.com/translator是访问的主机,即微软搜索引擎bing的翻译页面,?表示后面携带了多个参数,ref=TThis这通常表示一个参考信息或来源标识符。可能是用来跟踪用户从哪个链接访问了翻译工具,text表示默认的翻译文本,from表示翻译前的语种,to表示目标语种。可以看到,这里后面携带的三个信息,正好是打开网页时的默认信息

请添加图片描述

“输入文本”是背景,实际上并没有东西在这里。

可以猜测,每次访问这个页面,URL大概率是不会发生变化的,没有携带什么特殊的信息。经过反复的刷新和测试,验证了这个猜想。

User-Agent

为什么User-Agent会是一样的?需不需要担心它会不会变化?来看一下User-Agent的定义:

在进行网页爬虫时,User-Agent 是一个非常重要的 HTTP 请求头字段,它的主要作用是向服务器提供有关请求者(通常是浏览器或爬虫)的一些信息。具体来说,它会告诉服务器,发出请求的客户端是什么类型的设备,操作系统,浏览器等。不同的服务器和网站可能根据 User-Agent 来决定如何响应请求,比如返回不同的内容、样式,或者限制对某些类型客户端的访问。

User-Agent 的作用总结:

  1. 识别客户端User-Agent 向服务器表明请求是由哪个客户端发出的。对于不同的浏览器、操作系统或设备,User-Agent 会有所不同。例如,Chrome、Firefox、Safari、IE 等不同浏览器会有不同的 User-Agent 字符串。
  2. 避免被识别为爬虫: 网站可能会根据 User-Agent 来识别是否是爬虫程序。很多爬虫程序没有设置真实的 User-Agent,或者 User-Agent 字符串看起来像是一个自动化脚本(比如 Python 的 requests 库默认 User-Agent 是一个简单的字符串)。一些网站会使用这一点来检测并阻止爬虫请求。因此,为了模拟浏览器,爬虫通常会伪装成浏览器的 User-Agent,避免被网站识别为爬虫。
  3. 返回适配的内容: 根据 User-Agent,服务器可以返回特定格式的内容。比如,移动设备和桌面设备通常会看到不同版本的网页,甚至不同的图片大小和样式。通过查看 User-Agent,服务器可以判断请求来自于手机、平板、桌面或其他设备,并返回不同的页面样式或功能。
  4. 分辨设备和浏览器版本User-Agent 可以帮助服务器确定访问者的设备类型、操作系统及浏览器版本,从而优化响应内容。比如,某些页面可能会针对不同的操作系统(如 Windows、macOS、Linux)或不同版本的浏览器提供特定的网页布局或 JavaScript 功能。

可以看出,一些服务器会根据User-Agent来判断访问请求是不是来自人类或自动化脚本,可做一些反爬虫操作。我们从浏览器获取的请求信息中包含的User-Agent,表明了这段请求时来自浏览器,而非自动化脚本,因此,我们可以回答上面的问题:1.User-Agent一样是因为我们今天与昨天用的都是同一个浏览器访问,它代表了“该请求来自Edge浏览器”。2.无需担心它会发生变化,除非浏览器更新会更改这项数据,而这大概率是不会发生的。

代码实现

首先,先获取整个response的html数据,把它写在一个单独的文件里,(数据量太大,操作台无法查找相应的数据),有些导入的模块会在后面的代码中用到,这仅是完整代码的一部分

import requests
import re
from bs4 import BeautifulSoup
from urllib import response
import urllib.request
import json
url = "https://cn.bing.com/translator?ref=TThis&text=&from=zh-Hans&to=en"
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"}
response = requests.get(url,headers=header,data={})
response.raise_for_status()
html = response.text
with open("translator.html", "w", encoding="utf-8") as f:f.write(html)

获取到相应的HTML,直接搜索IG

请添加图片描述

现在,我们找到了这个数据,用正则表达式将数据获取,其中re.search方法是调用第三方库re

ig = re.search(r'IG:"(\w+)"',html).group(1) # 使用正则表达式在html文件中查找IG数据并获取

IID

我们用同样地办法查找IID的所在地并获取它

找到IID的所在

请添加图片描述

找到IID数据的所在,依然在translator请求响应中,这就好办了,因为该请求的完整相应已经被我们获取了,只要找到相应的位置即可。

请添加图片描述

刚刚获取的HTML文件中,你可以找到多个带有data-iid属性的<div>,因此,我们需要更加详细的信息来确认其位置,比如利用前面的id=" tta_outGDCont"

代码实现

可以使用第三方库BeautifulSoup,获取html格式数据中特定的属性,比如data-iid

soup = BeautifulSoup(html, "html.parser")
dev_element = soup.find("div", id = "tta_outGDCont")
data_iid = dev_element.attrs["data-iid"]
print("data_iid:"+data_iid)

我们来解释一下soup = BeautifulSoup(html, "html.parser")这一段代码

1. BeautifulSoup

BeautifulSoup 是一个 Python 库,主要用于从 HTML 或 XML 文档中提取数据。它提供了许多方法来帮助你遍历、搜索和修改 HTML/XML 文档的内容。

2. html

html 是传入 BeautifulSoup 构造函数的参数,通常是一个包含 HTML 内容的字符串。它代表了待解析的 HTML 文档。可以是从文件读取的内容,或者是通过网络请求获取的 HTML 页面。

3. “html.parser”

"html.parser"BeautifulSoup 的一个解析器(parser)。它告诉 BeautifulSoup 使用 Python 内建的 HTML 解析器来解析传入的 HTML 文档。这个解析器是一个快速且有效的解析工具,但对于一些特殊的 HTML,可能处理得不如其他第三方解析器(如 lxmlhtml5lib)精准。

"html.parser" 选项是 Python 默认的解析器,但如果你安装了 lxmlhtml5lib 等库,也可以指定其他解析器。例如:

  • "lxml":使用 lxml 库的 HTML 解析器。
  • "html5lib":使用 html5lib 库,它更宽容于不规范的 HTML 代码。

4. 最终效果

这行代码的作用是:通过 BeautifulSoup 库,将传入的 HTML 字符串 html 解析成一个 BeautifulSoup 对象,并指定使用内建的 html.parser 解析器。解析后的 soup 对象可以用来方便地操作和提取 HTML 内容。

剩下的代码看方法名称也很好理解它是做什么的

token与key

找到tokenkey的所在

我们用相同的办法,通过搜索框查找token的所在地,发现,这个信息同样存在于translator请求响应中:
请添加图片描述

如果你仔细一点,你会发现,token前面那串数字,就是我们下一个要找的key!真是得来全不费工夫,剩下的两个数据被我们一次性找到了,接下来就是获取它们。

代码实现
pattern = r'var params_AbusePreventionHelper = \[(\d+),"([^"]+)",\d+\];'
token = re.findall(pattern, html)
print("key:"+token[0][0])
print("token:"+token[0][1])

同样地,我们使用正则表达式,查找var params_AbusePreventionHelper后面的两个数据,放在token列表中。

小结

至此,我们找到了我们所需的全部数据,接下来只需要将IGIID填进URL中,将tokenkey填进表单中,就可发送完整的请求,伪装成正常的浏览器请求了。

请求与获取相应

代码实现

url = "https://cn.bing.com/ttranslatev3?isVertical=1&&IG="+ig+"&IID="+data_iid
print(url)
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","token":token[0][1],"key":token[0][0],"text":"今天的天气","tryFetchingGenderDebiasedTranslations":"true"}
print(data)
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需要根据上文所获取的IG与IID进行动态变换
  • data数据,将我们上面获取的token与key分别放入字典中
  • 对数据进行UTF-8编码转换格式
  • 发送请求
  • 获取响应并进行UTF-8解码
  • 转换JSON格式
  • 获取数据

如果将进行UTF-8解码后的数据完整打印出来,将会是:

[{"translations":[{"text":"Today's weather","to":"en","sentLen":{"srcSentLen":[5],"transSentLen":[15]}}],"detectedLanguage":{"language":"zh-Hans"}},{"inputTransliteration":"jīntiān de tiānqì"}
]

我们要的就是translations列表下的第一个字典中text对应的value

完整代码

from csv import Error
from email.policy import HTTP
from tkinter import E
from urllib.error import URLError
import requests
import re
from bs4 import BeautifulSoup
from urllib import response
import urllib.request
import jsonclass Translation:def __init__(self,content):               self.translating(content)def translating(content,lfrom,lto): if content == "":return "请输入内容"langfrom = {"自动检测":"auto-detect","中文":"zh-Hans","English":"en"}langto = {"中文":"zh-Hans","English":"en"}        url = "https://cn.bing.com/translator?ref=TThis&text=&from=zh-Hans&to=en"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"}try:response = requests.get(url,headers=header,data={},timeout=5)except Exception as e:print(f"There are something wrong with the network: {e}")return "website is not reachable"html = response.textsoup = BeautifulSoup(html, "html.parser")dev_element = soup.find("div", id = "tta_outGDCont")data_iid = dev_element.attrs["data-iid"]print("data_iid:"+data_iid)ig = re.search(r'IG:"(\w+)"',html).group(1)print("IG:"+ig)pattern = r'var params_AbusePreventionHelper = \[(\d+),"([^"]+)",\d+\];'token = re.findall(pattern, html)print("key:"+token[0][0])print("token:"+token[0][1])url = "https://cn.bing.com/ttranslatev3?isVertical=1&&IG="+ig+"&IID="+data_iidprint(url)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":langfrom[lfrom],"to":langto[lto],"token":token[0][1],"key":token[0][0],"text":content,"tryFetchingGenderDebiasedTranslations":"true"}print(data)data = urllib.parse.urlencode(data).encode("utf-8")try:req = urllib.request.Request(url, data, headers=header)response = urllib.request.urlopen(req)html = response.read().decode("utf-8")target = json.loads(html)except Exception as e:print(f'There are something wrong with the network: {e}')return "website is not reachable"try:print("translations:"+target[0]['translations'][0]['text'])except KeyError:print(target)return "something was wrong"return target[0]['translations'][0]['text']

结语

这次,我们完成了对微软翻译的完整爬虫,且可以完美多次长时间地运行,这个脚本功能已经完善,只是还没有嵌入到GUI程序中,下一篇文章,我们将会把这个脚本整理一下,放到脚本工具包中供翻译器调用,且会加装一些网络状况的判断。

如果你看到这里,说明你又变强了!希望你变得更强,感谢你的观看,共同进步!

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

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

相关文章

[含文档+PPT+源码等]精品基于Nodejs实现的物流管理系统的设计与实现

基于Node.js实现的物流管理系统的设计与实现背景&#xff0c;主要源于物流行业的快速发展以及信息技术在物流管理中的广泛应用。以下是对该背景的具体阐述&#xff1a; 一、物流行业的快速发展 随着全球经济一体化的加速和电子商务的蓬勃发展&#xff0c;物流行业作为连接生产…

JavaWeb开发9

ResponseBody 类型&#xff1a;方法注解、类注解 位置&#xff1a;Controller方法上/类上 作用&#xff1a;将方法返回值直接响应&#xff0c;如果返回值类型是实体对象/集合&#xff0c;将会转换为JSON格式响应 说明&#xff1a;RestControllerControllerResponseBody; 统…

直播美颜SDK开发指南:实时美颜技术的架构与优化策略

时下&#xff0c;为了满足市场需求&#xff0c;许多企业开始开发自己的美颜SDK&#xff0c;通过集成到直播或视频应用中&#xff0c;实现实时美颜效果。接下来&#xff0c;笔者将从美颜SDK的架构设计和优化策略出发&#xff0c;深入探讨如何打造一个智能化的视频美颜平台。 一…

Leecode热题100-104.二叉树中的最大路径和

二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root &#xff0c…

第六十三周周报 GCN-CNNGA

文章目录 week 63 GCN-CNNGA摘要Abstract1. 题目2. Abstract3. 文献解读3.1 Introduction3.2 创新点 4. 网络结构4.1 数据分析4.2 混合深度学习框架的发展4.3 Mul4.4 CNN block4.5 GCN block4.6 GRU block4.7 注意力机制4.8 模型评估标准 5. 实验结果5.1 不同邻接矩阵的性能评价…

学习笔记——MathType公式编号:右编号和随章节变化

1.如何在word文档中插入带有编号的公式&#xff1f; 步骤&#xff1a;(前提是已经安装mathtype) 2.MathType公式编号怎么随章节变化&#xff1f; 想要编号级数也随标题级数进行自动变化&#xff0c;则需要插入或修改文档的“分隔符” 步骤&#xff1a;

VS+QT开发 找不到宏$(Qt_INCLUDEPATH_) $(Qt_LIBS_)

问题&#xff1a;在VSQT开发环境&#xff0c;项目右键->属性->C/C->常规->附加包含目录->宏&#xff08;位置在右下角&#xff09;->右侧新弹出的属性框内搜索Qt_INCLUDEPATH_ 找不到的场景的解决办法。

STl学习-迭代器

1.迭代器种类 这五种迭代器的声明如下&#xff1a; truct output_iterator_tag {};//输出迭代器 truct input_iterator_tag{ };//输入迭代器 truct forward iterator tag : public input iterator tag {};//向前迭代器 truct bidirectional iterator tag :public forward iter…

亲测在Windows系统安装、使用、定制Ollama服务

一、前言 1.1 Ollama介绍 Ollama是一个专为在本地环境中运行和定制大型语言模型而设计的工具。它提供了一个简单而高效的接口&#xff0c;用于创建、运行和管理这些模型&#xff0c;同时还提供了一个丰富的预构建模型库&#xff0c;可以轻松集成到各种应用程序中。Ollama的目标…

aLoNg3x.2 | CrackMe

cm下载链接&#xff1a; https://n0zom1z0.lanzoup.com/iB4Gz2el88cb 密码:38sy crack目标是让register框去掉。不让patch&#xff0c;所以要真算出Code。 第一个难点&#xff1a; DELPHI。。。窗口文字与处理函数的定义在这种地方&#xff1a; 这个cancel处&#xff0c;只要…

STl学习-函数对象

1.含有状态的函数对象类 函数对象类除了 operator()之外也可以包含其他成员。函数对象类通常含有一些数据成员这些成员被用于定制调用运算符中的操作。举个例子&#xff0c;我们将定义一个打印 string 的类。默认情况下&#xff0c;会将内容写入到cout 中&#xff0c;每个stri…

U-Mail邮件网关有效防止企业邮箱系统被垃圾邮件轰炸

在现代社会&#xff0c;互联网企业为了提供更便捷的服务&#xff0c;常常会收集用户数据&#xff0c;构建自己的大数据资源库。然而&#xff0c;这种行为往往导致用户在不经意间泄露个人隐私&#xff0c;进而引发个人信息的非法交易和频繁的骚扰电话&#xff0c;这些问题已经引…

手把手教你搭建OpenScenario交通场景(上)

OpenScenario是一种专为自动驾驶系统仿真测试设计的场景描述语言&#xff0c;它基于XML格式&#xff0c;旨在提供一个标准化、模块化的框架&#xff0c;用于定义和重现复杂的道路交通场景。该语言不仅能够详细描绘车辆、行人、交通信号及其他动态交通参与者的行为模式&#xff…

专业140+总分430+复旦大学875信号与系统考研经验原957电子信息通信考研,真题,大纲,参考书。

专业140&#xff0c;总430&#xff0c;复旦大学875信号与系统&#xff08;电子信息&#xff09;原957经验贴分享&#xff0c;希望大家复习有帮助。 专业课&#xff08;875信号与系统含随机过程-原957&#xff09; 专业课这方面我是从7月开始&#xff0c;刚好数学第一遍搞好了大…

NVR小程序接入平台EasyNVR多品牌NVR管理工具/设备介绍

随着数字化浪潮的迅猛推进&#xff0c;视频监控技术在维护公共安全、提升管理效能方面发挥着越来越重要的作用。在众多视频监控平台中&#xff0c;NVR小程序接入平台EasyNVR是一款拓展性强、视频能力灵活且部署轻便的安防视频监控平台。它支持多种主流标准协议&#xff0c;并能…

C语言 | Leetcode 题解之第535题TinyURL的加密与解密

题目&#xff1a; 题解&#xff1a; typedef struct {int key;char *val;UT_hash_handle hh; } HashItem;HashItem *dataBase NULL;char* encode(char* longUrl) {srand(time(0));int key;HashItem * pEntry NULL;while (true) {key rand();pEntry NULL;HASH_FIND_INT(dat…

磁盘分区并挂载

https://blog.csdn.net/qq_45664055/article/details/107516419

投机采样的显性化——OpenAI新feature:Predicted Outputs

关于投机采样speculative decoding我就不特别详细解释了 我在这里简单描述一下 小模型生成了接下来的n个标记&#xff0c;然后在大模型上进行n个并行推理&#xff0c;具体为&#xff1a;Prompt&#xff0c;Prompt ST1&#xff0c;Prompt ST1 ST2 … Prompt ST1 ST2 … …

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测

BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测 目录 BO-CNN-LSTM回归预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 …

有趣的Midjourney作品赏析(附提示词)

中文提示词&#xff1a;国风少年 C4D软件,高分辨率,超细节,超现实主义, 英文提示词&#xff1a;National Style Youth Cinema4D,high resolution,hyper detailed,surrealism, --niji 6 --ar 1:1 中文提示词&#xff1a;粘土模型&#xff0c;男性穿着中世纪欧洲蓝色盔甲&#x…