成长脚印

Asp.net技术
posts - 17, comments - 44, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

抓取 在线翻译(Google、Yahoo)

Posted on 2008-04-11 17:02 脚印 阅读(3086) 评论(14)  编辑 收藏 网摘 所属分类: Asp.net
最近公司要求我们做一个调用Google、Yahoo全文翻译的工具,在园子搜索了一下,找到了一篇(不大记得了,好像是VB写的),看了他的做法以后,做了一点点改进,发出来给需要的朋友看看,有什么不对的地方请大家扶正!


using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Threading;

namespace Transn
{
    
class TsMachine
    
{

        
public string Google(string texts, string languages)
        
{
            
try
            
{
                
return Google_T(texts, languages);
            }

            
catch
            
{
                Thread.Sleep(
1000);
                
try
                
{
                    
return Google_T(texts, languages);
                }

                
catch
                
{
                    
return "";
                }

            }

        }

        
private string Google_T(string texts, string languages)
        
{
            
string payload = "&text=" + texts + "&langpair=" +languages;
            WebRequest req 
= HttpWebRequest.Create(@"http://translate.google.com/translate_t?hl=zh-CN&ie=utf8");
             
//HttpWebRequest req = reqs as HttpWebRequest;
             
// req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon)";
             
// req.SendChunked = true;
             
// req.TransferEncoding = "UTF-8";
            
            req.Credentials 
= CredentialCache.DefaultNetworkCredentials;
            req.Method 
= "POST";
            req.ContentType 
= "application/x-www-form-urlencoded";
            req.Timeout 
= 50000;
            req.ContentLength 
= payload.Length;
            

            Encoding encoding 
= Encoding.GetEncoding("UTF-8");
            Byte[] bytes 
= encoding.GetBytes(payload);
            req.ContentLength 
= bytes.Length;
            Stream newStream 
= null;

            newStream 
= req.GetRequestStream();

            newStream.Write(bytes, 
0, bytes.Length);
            newStream.Close();
            HttpWebResponse res 
= (HttpWebResponse)req.GetResponse();
            
            
if (res.StatusDescription.ToLower() != "ok")
            
{
                Console.WriteLine(
"无法连接!");
            }

         
            Stream dataStream 
= res.GetResponseStream();


            StreamReader reader 
= new StreamReader(dataStream, Encoding.GetEncoding(res.CharacterSet));

            
string responseFromServer = null;
            responseFromServer 
= reader.ReadToEnd();

            
//Encoding en = Encoding.GetEncoding("gb2312");
            
//byte[] unicodeBytes = en.GetBytes(responseFromServer);

            
//byte[] asciiBytes = Encoding.Convert(en, Encoding.UTF8, unicodeBytes);
            
//str_return = Encoding.UTF8.GetString(asciiBytes);

            reader.Close();
            dataStream.Close();
            res.Close();
            
string content = responseFromServer;
            
string s = "<div id=result_box dir=\"ltr\">";
            
int start = content.IndexOf(s);
            
int end = content.IndexOf("</div>",start);
            content 
= content.Substring(start + s.Length, end - start - s.Length);

            
return content.Replace("&nbsp;"" ").Replace("&quot;""\"").Replace("&gt;"">").Replace("&lt;""<").Replace("<br>""\r\n").Replace("&#160;"" ").Replace("&#39;","'");
        }




        
public string Yahoo(string texts, string languages)
        
{
            
try
            
{
              
return   Yahoo_T(texts, languages);
            }

            
catch
            
{
                Thread.Sleep(
1000);
                
try
                
{
                   
return  Yahoo_T(texts, languages);
                }

                
catch
                
{
                    
return "";
                }

            }

       
        }


        
public string Yahoo_T(string texts, string languages)
        
{
            
string payload = "more=1&ei=UTF-8&trtext=" + texts + "&lp=" + languages + "";
            WebRequest req 
= HttpWebRequest.Create(@"http://fanyi.yahoo.com.cn/translate_txt?");
            
//  HttpWebRequest req = reqs as HttpWebRequest;
            
//  req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon)";
            req.Credentials = CredentialCache.DefaultNetworkCredentials;
            req.Method 
= "POST";
            req.ContentType 
= "application/x-www-form-urlencoded";
            req.Timeout 
= 50000;
            req.ContentLength 
= payload.Length;

            Encoding encoding 
= Encoding.GetEncoding("UTF-8");
            Byte[] bytes 
= encoding.GetBytes(payload);
            req.ContentLength 
= bytes.Length;
            Stream newStream 
= null;

            newStream 
= req.GetRequestStream();

            newStream.Write(bytes, 
0, bytes.Length);
            newStream.Close();
            HttpWebResponse res 
= (HttpWebResponse)req.GetResponse();
            
if (res.StatusDescription.ToLower() != "ok")
            
{
                Console.WriteLine(
"无法连接!");
              
            }

            Stream dataStream 
= res.GetResponseStream();


            StreamReader reader 
= new StreamReader(dataStream, Encoding.GetEncoding(res.CharacterSet));

            
string responseFromServer = null;
            responseFromServer 
= reader.ReadToEnd();

            
//Encoding en = Encoding.GetEncoding("gb2312");
            
//byte[] unicodeBytes = en.GetBytes(responseFromServer);

            
//byte[] asciiBytes = Encoding.Convert(en, Encoding.UTF8, unicodeBytes);
            
//str_return = Encoding.UTF8.GetString(asciiBytes);

            reader.Close();
            dataStream.Close();
            res.Close();

            
string content = responseFromServer;
            
string s = "<div id=\"pd\" class=\"pd\">";
            
int start = content.IndexOf(s);
            
int end = content.IndexOf("</div>\n\t\t\t</div>", start);
            content 
= content.Substring(start + s.Length, end - start - s.Length);
            
return content.Replace("<dnt>""").Replace("</dnt>","").Replace("<br/>","\r\n");

        }

}
加载翻译方向
   struct LanguageType
        
{
            
public string value;
            
public string text;
            
public LanguageType(string v, string t)
            
{
                value 
= v;
                text 
= t;
            }


            
public override string ToString()
            
{
                
return text;
            }

        }


  private void LoadLanguage(ComboBox comboBox)
        
{
            comboBox.Items.Add(
new LanguageType("ar|en""阿拉伯文到英语"));
            comboBox.Items.Add(
new LanguageType("ko|en""朝鲜语到英语"));
            comboBox.Items.Add(
new LanguageType("de|fr""德语到法语"));
            comboBox.Items.Add(
new LanguageType("de|en""德语到英语"));
            comboBox.Items.Add(
new LanguageType("ru|en""俄语到英语"));
            comboBox.Items.Add(
new LanguageType("fr|de""法语到德语"));
            comboBox.Items.Add(
new LanguageType("fr|en""法语到英语"));
            comboBox.Items.Add(
new LanguageType("nl|en""荷兰语到英语"));
            comboBox.Items.Add(
new LanguageType("pt|en""葡萄牙语到英语"));
            comboBox.Items.Add(
new LanguageType("ja|en""日语到英语"));
            comboBox.Items.Add(
new LanguageType("es|en""西班牙语到英语"));
            comboBox.Items.Add(
new LanguageType("el|en""希腊语到英语"));
            comboBox.Items.Add(
new LanguageType("it|en""意大利语到英语"));
            comboBox.Items.Add(
new LanguageType("en|ar""英语到阿拉伯文"));
            comboBox.Items.Add(
new LanguageType("en|ko""英语到朝鲜语"));
            comboBox.Items.Add(
new LanguageType("en|de""英语到德语"));
            comboBox.Items.Add(
new LanguageType("en|ru""英语到俄语"));
            comboBox.Items.Add(
new LanguageType("en|fr""英语到法语"));
            comboBox.Items.Add(
new LanguageType("en|nl""英语到荷兰语"));
            comboBox.Items.Add(
new LanguageType("en|pt""英语到葡萄牙语"));
            comboBox.Items.Add(
new LanguageType("en|ja""英语到日语"));
            comboBox.Items.Add(
new LanguageType("en|es""英语到西班牙语"));
            comboBox.Items.Add(
new LanguageType("en|el""英语到希腊语"));
            comboBox.Items.Add(
new LanguageType("en|it""英语到意大利语"));
            comboBox.Items.Add(
new LanguageType("en|zh-TW""英语到中文(繁体)"));
            comboBox.Items.Add(
new LanguageType("en|zh-CN""英语到中文(简体)"));
            comboBox.Items.Add(
new LanguageType("en|zh-CN""英语到中文"));
            comboBox.Items.Add(
new LanguageType("zh|en""中文到英语"));
            comboBox.Items.Add(
new LanguageType("zh-TW|zh-CN""中文(繁体到简体)"));
            comboBox.Items.Add(
new LanguageType("zh-CN|zh-TW""中文(简体到繁体)"));
        }


调用方法
  void GoogleT(TsMachine tm, string content, string languetype)
        
{
            
string tranlate = tm.Google(content, languetype);
            Google.Text 
= tranlate;
        }


        
void YahooT(TsMachine tm, string content, string languetype)
        
{
            languetype 
= languetype.Replace("|""_").Replace("zh-TW""zt").Replace("zh-CN""zh");
            
string tranlate = tm.Yahoo (content, languetype);
            Yahoo.Text 
= tranlate;
        }



在这个请求翻译的过程中,最麻烦的是编码问题。Yahoo使用的是固定编码格式(Utf-8)、Google就很不老实了,编码格式是变化的,每次调用 StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding(Utf-8)); 进行解码的时候老是出错,后来才发现每次编码格式都在改变,如果用固定的Utf-8解码,得到的都是乱码
根据多次测试,Google的编码格式和res.CharacterSet一致(不敢保证,但是测试了很多语种都是正确的)。 虽然摆平了Google和Yahoo,但是谷词一直没能搞定

这是我编写的谷词翻译编码

   public string Godict_T(string texts, string languages)
        
{
            
string payload = "from_content=" + texts + "&langpair=" + languages + "";
            WebRequest req 
= HttpWebRequest.Create(@"http://trans.godict.com/index.php");
            req.Credentials 
= CredentialCache.DefaultNetworkCredentials;
            req.Method 
= "POST";
            req.ContentType 
= "application/x-www-form-urlencoded";
            req.Timeout 
= 50000;
            req.ContentLength 
= payload.Length;

            Encoding encoding 
= Encoding.GetEncoding("UTF-8");
            Byte[] bytes 
= encoding.GetBytes(payload);
            req.ContentLength 
= bytes.Length;
            Stream newStream 
= null;

            newStream 
= req.GetRequestStream();

            newStream.Write(bytes, 
0, bytes.Length);
            newStream.Close();
            HttpWebResponse res 
= (HttpWebResponse)req.GetResponse();
            
if (res.StatusDescription.ToLower() != "ok")
            
{
                Console.WriteLine(
"无法连接!");
            }

            Stream dataStream 
= res.GetResponseStream();


            StreamReader reader 
= new StreamReader(dataStream, Encoding.GetEncoding(res.CharacterSet));

            
string responseFromServer = null;
            responseFromServer 
= reader.ReadToEnd();


            reader.Close();
            dataStream.Close();
            res.Close();

            
string content = responseFromServer;
            
string s = "<textarea name=q rows=12 style=\"width: 740px;\" wrap=PHYSICAL dir=ltr>";
            
int start = content.IndexOf(s);
            
int end = content.IndexOf("</textarea>", start);
            
return content.Substring(start + s.Length, end - start - s.Length);
        }

结果发现这个谷词的res.CharacterSet(相应流)永远是iso-8859-1 ,这就郁闷了。 不知道这个地方如何解码,有知道的朋友请指教 !

Feedback

#1楼   回复  引用    

2008-04-11 18:51 by I am threem0126[未注册用户]
不用费此周折,Google开放全文翻译API了,很方便的:
http://code.google.com/apis/ajaxlanguage/

#2楼   回复  引用  查看    

2008-04-11 19:55 by airwolf2026      
呵呵.关注下

#3楼   回复  引用    

2008-04-11 21:41 by hanguofeng[未注册用户]
直接web方法有查询速度的限制,查询过于频繁google会要求输入验证码

#4楼   回复  引用    

2008-04-12 08:57 by xiaohua[未注册用户]
互联风( www.hulianfeng.com )以年轻、时尚为主线,不仅提供相册,交友,博客等多种交互服务,而且鼓励个性、多元化、强调分享互动性。互联风希望为年轻人搭建自己的独特舞台,是专为时尚中国量身打造的互动共享社交网站,我们将用最新的技术最好的服务,为您提供最广阔的社交视野和最丰富的社交层面,帮您编织出绚丽多彩温馨和谐的社交圈。(互联风校园精英全国招募中。。。。请将您的简历发至 hlf_tang@qq.com,我们的工作人员在收到你的应聘简历之后,会第一时间与你联系。)QQ:601150312如有其他疑问请与互联风官方网站( www.hulianfeng.com )在线客服联系!

#5楼   回复  引用  查看    

2008-04-12 09:11 by 狼Robot      
学习了.

#6楼   回复  引用  查看    

2008-04-12 10:02 by 李战      
路过http://www.cnblogs.com/Emoticons/yoyocici/223852199.gif" alt="" />,看热闹。

#7楼   回复  引用  查看    

2008-04-12 13:39 by Microshaoft      
Google Ajax 英译汉:
http://www.google.com/uds/Gtranslate?callback=google.language.callbacks.id100&context=22&q=microsoft%20word&langpair=en%7Czh&key=notsupplied&v=1.0&nocache=1207977755259

发送如上 http get  WebRequest 即可

response:

google.language.callbacks.id100('22',{"translatedText":"微软Word"}, 200, null, 200)

#8楼[楼主]   回复  引用  查看    

2008-04-13 21:15 by 脚印      
@hanguofeng
@I am threem0126
@Microshaoft

不知道是否有合适的cs模式的? 请指教

#9楼[楼主]   回复  引用  查看    

2008-04-13 21:34 by 脚印      
@Microshaoft


如果按照Get方式发送,我想对于全文翻译可能就意义不大

英文全文翻译我想经过编码以后,这样一个URL应该很可能超过URL的最大字符数

#10楼   回复  引用    

2008-05-20 22:57 by King1[未注册用户]
楼主分享精神真好,好东西,收下.Thanks.

#11楼   回复  引用    

2008-05-20 23:20 by King1[未注册用户]
还有个小建议,因为阿拉伯语是靠右对齐的,和其它语言的不一样,所以呢,把google翻译里面的这句需要改成这样吧.

string s = "<div id=result_box dir=\"ltr\">";

改成
string s;
if (languages.IndexOf("|ar") > -1)//阿拉伯语是靠右对齐的,和其它语言的不一样
s = "<div id=result_box dir=\"rtl\">";
else//其它语言翻译
s = "<div id=result_box dir=\"ltr\">";

#12楼   回复  引用    

2008-07-02 11:34 by hhh[未注册用户]
还有个小建议,因为阿拉伯语是靠右对齐的,和其它语言的不一样,所以呢,把google翻译里面的这句需要改成这样吧.

string s = "<div id=result_box dir=\"ltr\">";

改成
string s;
if (languages.IndexOf("|ar") > -1)//阿拉伯语是靠右对齐的,和其它语言的不一样
s = "<div id=result_box dir=\"rtl\">";
else//其它语言翻译
s = "<div id=result_box dir=\"ltr\">";

#13楼   回复  引用  查看    

2008-08-01 16:13 by 史裕平      
谢谢楼主,通过你的代码。我解决了我的问题。

#14楼   回复  引用    

2008-10-17 14:13 by siyiguan[未注册用户]
给大家推荐一个不错的在线翻译网站

好用的在线翻译网站:http://www.siyiguan.cn/
多语种到中文在线翻译:英文到中文,日语到中文,韩语到中文,俄语到中文,葡萄牙语到中文,法语到中文,德语到到中文,意大利语到中文,阿拉伯语到中文等等。

名字也很不错啊



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1148735




相关文章:

相关链接: