暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

用Python写简单的机器翻译程序(3)

语和言 2022-09-17
273


一、引言


分享知识+推广我的Python书

本号此前文章介绍了两个调用谷歌翻译的Python程序,文章如下:

用Python写简单的机器翻译程序(1)

用Python写简单的机器翻译程序(2)
其中前者是通过调用谷歌翻译网页版接口实现的,后者是通过调用谷歌翻译扩展库实现的。
这次分享一个模拟手工打开网页来获取百度翻译结果的Python程序。

环境:64位Win 10中文版 + 64位Python 3.6



二、新书推广

《Python程序设计(基于计算思维和新文科建设)》,ISBN:9787121435577,胡凤国,电子工业出版社,2022年6月。


本书是电子工业出版社在国内较早采用纸质版+电子版的创新图书发行模式的第一次尝试。本书是这套创新图书的纸质版部分,与之内容互补的电子版图书将稍后出版。

本书的内容包含基础篇排错篇两部分:

基础篇介绍Python程序设计的入门知识,共12章,包括:

⑴ Python简介
⑵ Python软件的安装和Python程序运行;
⑶ Python的基本概念(对象、数据类型、表达式、内置函数);
 输入和输出;
⑸ 程序设计的三种基本结构;
⑹ 函数和类;
⑺ 序列操作(列表、元组、集合、字典);
⑻ 字符串;
⑼ 正则表达式;
⑽ 文件读写;
⑾ 目录与文件操作;
⑿ 常用标准库介绍。

排错篇总结初学者常遇到的错误并介绍程序调试方法,包含2章:

⒀ Python错误类型;
⒁ Python代码调试。 

与本书内容互补的电子版图书包含文本篇应用篇两部分:

文本篇:介绍字符集、编码和文本文件读写的知识,包含了对国家规范《通用规范汉字表》8105个汉字当中难以输入和难以显示的汉字的处理。

应用篇:介绍Word、Excel、PPT、PDF、图片等常用办公文件的处理,是大家提高办公和科研效率的好帮手。

本书配套有详细的PPT和教学大纲,还有全部例题的程序代码和绝大部分思考题的程序代码。

本书配套PPT里面还加入了配套电子版图书中的部分内容,比如字符集和编码,不同编码的文本文件的读写,Word、Excel、PPT、PDF等一些常用办公文件的读写。

本书的配套资源可以在电子工业出版社官网下载。

本书的读者对象:

1、大学文科生 可选本书当Python教材或自学Python的参考书。

2、大学理工科学生 可选本书当自学Python的参考书。

3、文科领域的教师、科研人员和研究生
可拿本书当工具书,本书的配套程序会为您节省效率,在当前大数据和新文科的背景下,本书可以为相关领域的量化研究提供技术支持。

4、理工科领域的教师、科研人员和研究生

本书配套的电子版图书中的编码和文本处理知识也可以作为理工科教师和科研人员处理文本数据的参考资料之一,毕竟专门开辟章节介绍国家标准《通用规范汉字表》汉字处理的程序设计图书并不多见。

5、青少年学生
本书有专门的海龟画图章节,有大量的有趣数学题目,可以培养学生的计算思维,适合对编程感兴趣的中小学生阅读,也适合打算让娃参加编程辅导班的家长朋友参考。

本书在各大实体书店和网店均有销售。京东、天猫、当当的购买渠道如下(可扫码直达购买页面)。








三、模仿调用谷歌翻译网页版接口调用百度翻译失败


本号在文章用Python写简单的机器翻译程序(1)》中给出了一个调用谷歌翻译网页版接口的程序,可以实现一个简单的机器翻译功能。


当时就想能否模仿这个思路写一个调用百度翻译的Python程序呢?结果发现构造网址没有问题,构造的网址在浏览器中打开就能在浏览器中看到翻译的结果 。


例如,在谷歌浏览器输入如下网址(网址中可以直接带中文),然后敲回车键:


https://fanyi.baidu.com/translate?#zh/en/你好。


我们会看到如下的网页:



不过,令人遗憾的是,我们查看网页的源代码却找不到原文和译文,这也就意味着即便我们用get方法构造网址获取了百度翻译的网页源代码,也无从得到译文。


我们得想起其它办法。


四、用post方法调用百度翻译网页版接口也失败了


通过网上查资料可知,用post方法向百度翻译提交的网址是:

https://fanyi.baidu.com/v2transapi

我们需要向它提交如下数据:


    posData = { 
    "query": txt, # 要翻译的原文本
    "from": "zh", # 原文本的语言代码,这里是汉语
    "to": "en", # 目标语代码,这里是英语
               "sign""***.***"
    "token": "***",
    }

    上面字典中的后两个key比较重要,其中token可以通过在页面上按F12手工检查来获得,而sign这个值,是百度翻译页面调用JS代码临时计算得到的,对于一次具体的翻译过程,这个值也可以通过按F12手工检查来获得。
    我们来看一次具体的翻译例子,在百度翻译中输入如下两句:

      我喜欢小猫咪。
      小猫咪非常可爱。

      然后按F12键,右侧会出来一个窗口,我们依次点击 网络 → 全部 ,然后在左侧点击一下翻译按钮,继续右侧 点击 v2transapi这一行  → 载荷,就能看到要提交的数据项,其中就包含了sign和token,如下图所示(不同机器可能这两个值不一样):

      为了能用程序模拟这次翻译,我们还需要获取 User-Agent 和 Cookie,获取方法类似上面,只不过最后一步不是点“载荷”而是点“标头”,如下图所示:



      上面这些值都可以用鼠标点右键复制出来备用。

      下面我们用程序模拟这次手工翻译的过程并获取翻译结果。


      上述程序的运行结果如下:


        原文本:
        我喜欢小猫咪。
        小猫咪非常可爱。


        目标文本:
        I like kittens.
        The kitten is very cute.

        我们发现程序获取的翻译结果跟百度翻译网页上的结果一样。如果我们更改文本能得到更改后的翻译结果的话,这个调用百度翻译的程序不就写好了嘛。

        于是将程序中的原文加上一句“”,继续运行程序,结果发现没能获取翻译结果。


        赶紧在源代码的第25行和第26行中间插入一个print语句,看看调用百度api的返回值是啥。再次运行程序之后,得到如下结果:




        通过查资料知道,向百度提交的的表单数据中的sign值是根据输入文本实时计算的,输入文本变了,sign值也会随之变,我们的程序只变了输入文本,没有改变sign值,所以会报错。百度翻译接口计算sign值的工作是通过JS文件来完成的。


        网上有很多资料告诉我们如何通过按F12来一步步找到计算sign值的代码,但我尝试了几天,均以失败而告终,于是从网上下载了几个能生成sign值的JS文件,对比了一下,发现它们生成的结果是一样的,于是随机选了一个,然后修改上面的程序,把sign值从固定值改为JS计算。




        上述程序的运行结果如下:

          原文本:
          我喜欢小猫咪。
          小猫咪非常可爱。
          你喜欢小猫咪吗?


          目标文本:
          I like kittens.
          The kitten is very cute.
          Do you like kittens?


          网上下载的JS文件生成的sign值也不对,估计是百度的sign值生成算法有变化。


          我们欣喜地发现居然可以翻译三行文字了,赶紧再加一行试试,结果发现翻译失败了。




          我们把上述程序的第30绗修改一下,不用JS计算sign值,而是用手工办法把四行文本输入到百度翻译网页中,按F12获取sign值,这下子,程序就能获取正确的翻译结果了。



          这说明网上下载的计算sign值的JS文件都不对,也可能是百度更改了sign值的计算方法,所以以前正确的JS文件现在不正确的。


          我们期待以后能亲自找到计算sign值的JavaScript代码,或者能下载到正确的JS文件。


          下载到正确的JS文件文件之前,我们想用百度的翻译,难道就没有办法了吗?手动打开网页当然是可以的,但我们Pythoner可不能满足于这种非必要的低效手工劳动。



          五、通过模拟操作来获取百度网页的翻译结果
          一个偶然的机会发现,虽然百度翻译页面的源代码中看不到翻译结果,但如果把翻译页面另存成本地HTML文件的话,我们打开本地HTML的源代码就能看到百度翻译的结果。

          例如,把前面的四行文本放到百度翻译中翻译一下,然后将翻译页面另存为本地HTML文件,我们用文编辑器打开这个本地HTML文件,在最后一行就能看到翻译结果,如下图所示。


          于是,我们得到启发:能不能用Python程序模拟手工网页翻译操作,然后自动将网页另存到本地,再自动读取本地保存的HTML页面获取翻译结果呢?

          答案是肯定的,经过一番探索,终于成功了。不过,涉及到的扩展库比较多,这里就不一一解释和说明了,直接上代码吧。


          上述代码的运行结果如下:

            原文本:
            春天来了!春天来了!
            我们几个孩子,脱掉棉袄,冲出家门,奔向田野,去寻觅春天。
            春天像个害羞的小姑娘,遮遮掩掩,躲躲藏藏。我们细心地找啊,找啊。
            小草从地下探出头来,那是春天的眉毛吧?
            早开的野花一朵两朵,那是春天的眼睛吧?
            树木吐出点点嫩芽,那是春天的音符吧?
            解冻的小溪叮叮咚咚,那是春天的琴声吧?
            春天来了!我们看到了她,我们听到了她,我们闻到了她,我们触到了她。她在柳枝上荡秋千,在风筝尾巴上摇啊摇;她在喜鹊、杜鹃嘴里叫,在桃花、杏花枝头笑……


            目标文本:
            Spring is coming! Spring is coming!
            Our children took off their cotton padded jackets and rushed out of the house to the fields in search of spring.
            Spring is like a shy girl, hiding. We searched carefully.
            The grass sticks its head out from the ground. Is that the eyebrow of spring?
            One or two early wild flowers are the eyes of spring, aren't they?
            The trees are spitting out tender buds. Is that the note of spring?
            The thawing brook is tinkling, isn't it the music of spring?
            Spring is coming! We saw her, we heard her, we smelled her, we touched her. She swings on willow branches and shakes on kite tails; She cries in the mouth of magpies and cuckoos, and laughs in the branches of peach and apricot flowers


            运行过程录成视频如下


            通过上面的视频,我们看到,程序运行之后,自动打开了百度翻译的网页,自动输入翻译内容并点击翻译按钮,然后模拟键盘操作将翻译页面另存为d:\ftp\tmp,html,然后程序自动从中提取翻译结果。

            虽然在操作过程中,输入文字的内容被广告遮挡,但整个过程还是全自动的。另外,由于等待保存需要一定的时间,我们不知道这个时间究竟有多长,这里用了一个小技巧:设置了一个循环,在try...except...结构中用修改文件名的办法来判断本地文件是不是保存完毕。



            六、联系交流

            欢迎跟图书《Python程序设计(基于计算思维和新文科建设)》的作者胡凤国老师进行交流,作者电邮:cuchufengguo@163.com ,也可以给公众号留言进行交流。

            欢迎关注微信公众号“语和言”,本公众号将不定期发布对本书Python知识点的解读和补充内容。


            语和言公众号还有读者交流群,经常跟作者交流的读者朋友可以入群一起讨论问题。


            文章转载自语和言,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论