设为首页 收藏本站
查看: 1777|回复: 0

[经验分享] [原]perl使用LWP模块写的翻译小程序

[复制链接]

尚未签到

发表于 2015-12-25 14:14:04 | 显示全部楼层 |阅读模式
  perl的LWP是抓取网页的经典模块,学习的过程中用这个模块写了一个小程序,是通过抓取有道翻译的翻译结果来实现的。废话不多说,先贴代码(解释见下文



#! /usr/bin/perl
#学习perl LWP时用post做的翻译小脚本
#调用的是有道词典
use strict;
use warnings;
use LWP::UserAgent;
use JSON ;
#use Data::Dumper;
my $browser = LWP::UserAgent->new();
print "Please input the word:";
chomp (my $input = <STDIN>);
my $response = $browser->post(
#    'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/',
'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null',
[
'type' => 'AUTO',
'i' => "$input",
'doctype' => 'json',
],
);
if($response->is_success){
my $result = $response->content;
my $json = new JSON;
my $obj = $json->decode($result);
#print Dumper $obj;
my $trans = @{$obj->{'translateResult'}[0]}[0]->{"tgt"};
$trans = "翻译结果:$trans" if $trans;
my $string;
eval{
$string  = join " ", @{$obj->{'smartResult'}->{"entries"}};
};
$trans = "$trans\n其他结果:$string" if $string;
print $trans."\n" // "Not found\n";
}
LWP实现表单POST提交
  在chrome下打开有道翻译,然后在打开审查元素功能,试着输入hello,然后使用自动翻译,就可以捕获到下列的POST请求。

DSC0000.png
DSC0001.png
  我们使用LWP::UserAgent模块来模仿浏览器实现的POST功能。LWP的经典教程可以在这里学习。
  需要调用的函数为 $browser->post(url, pairs_arrayref),其中,pairs_arrayref为提交的参数,在这里我们根据Form Data里的信息就可以得出参数列表,我们这里的列表选择的是i代表提交的需翻译的单词,type是自动翻译,doctype 指的是返回的数据为json数据



my $response = $browser->post(
#    'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/',
'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null',
[
'type' => 'AUTO',
'i' => "$input",
'doctype' => 'json',
],
);
  

解析JSON
  返回的JSON如下



{"type":"ZH_CN2EN","errorCode":0,"elapsedTime":10,"translateResult":[[{"src":"你好","tgt":"How are you"}]],"smartResult":{"type":1,"entries":["","hello;hi"]}}
  其中translateResult是翻译结果,smartResult是其它结果。
  我们使用的是perl的JSON模块来对json数据进行解析(JSON模块的文档见这里)



my $result = $response->content;
my $json = new JSON;
my $obj = $json->decode($result);
  使用decode将json数据转化成了perl的数据,返回的是对象的引用。
  为了方便,我们可以将其用Dumper将对象打印出来看内部的结构(Data::Dumper的文档在这里)



print Dumper $obj
  这是翻译“你好”的时候显示的结果(终端下中文有点乱码..):



$VAR1 = {
'smartResult' => {
'entries' => [
'',
"hello\x{ef}\x{bc}\x{9b}hi"
],
'type' => 1
},
'errorCode' => 0,
'translateResult' => [
[
{
'tgt' => 'How are you',
'src' => "\x{e4}\x{bd}\x{a0}\x{e5}\x{a5}\x{bd}"
}
]
],
'type' => 'ZH_CN2EN',
'elapsedTime' => 10
};

  可以看出整个$obj是一个匿名哈希引用,而其中smartResult也是一个匿名哈希引用,translateResult则是一个匿名数组引用,然后一层层下去,最终键src的的值为翻译结果(关于perl的引用可以看我的另外一篇博文)于是,我们可以用下列方式提取翻译结果。



my $trans = @{$obj->{'translateResult'}[0]}[0]->{"tgt"}; #最终翻译结果
@{$obj->{'smartResult'}->{"entries"}}; #其他智能翻译结果
  最后运行截图:
DSC0002.png

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156232-1-1.html 上篇帖子: perl基本语法 下篇帖子: Perl的学习笔记
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表