用Python脚本通过谷歌翻译转换网址

4 投票
5 回答
9594 浏览
提问于 2025-04-16 16:54

我正在尝试在一个Python脚本中使用谷歌翻译:

#!/usr/bin/env python
from urllib2 import urlopen
from urllib import urlencode

base_url = "http://www.google.com/translate?"
params = (('langpair','en|es'), ('u','http://asdf.com'),)
url = base_url+urlencode(params)
print "Encoded URL: %s" % url 
print urlopen(url).read()

但是当我使用它时,出现了403错误。

# ./1.py 
Encoded URL: http://www.google.com/translate?langpair=en%7Ces&u=http%3A%2F%2Fasdf.com
Traceback (most recent call last):
...
urllib2.HTTPError: HTTP Error 403: Forbidden

不过,当我在浏览器中打开同样的链接时,一切正常。有人能帮我找出问题吗?或者是谷歌不允许这样使用?

提前谢谢大家!

5 个回答

4

你应该使用谷歌的API。我找到了并测试了这段代码,它可以正常工作:

#!/usr/bin/env python
from urllib2 import urlopen
from urllib import urlencode
import sys

lang1=sys.argv[1] # 这里是获取你输入的第一个语言参数

lang2=sys.argv[2] # 这里是获取你输入的第二个语言参数

langpair='%s|%s'%(lang1,lang2) # 这行代码把两个语言参数组合成一个字符串,格式是“语言1|语言2”

text=' '.join(sys.argv[3:]) # 这行代码把你输入的第三个及后面的所有参数合并成一个字符串,作为要翻译的文本

base_url='http://ajax.googleapis.com/ajax/services/language/translate?' # 这是谷歌翻译服务的基础网址

params=urlencode( (('v',1.0), # 这里设置了API的版本

('q',text), # 这里是要翻译的文本

('langpair',langpair),) ) # 这里是刚才组合的语言对

url=base_url+params # 这行代码把基础网址和参数组合成完整的请求网址

content=urlopen(url).read() # 这行代码发送请求并读取返回的内容

start_idx=content.find('"translatedText":"')+18 # 这里找到翻译文本的开始位置

translation=content[start_idx:] # 这行代码提取出翻译文本

end_idx=translation.find('"}, "') # 这里找到翻译文本的结束位置

translation=translation[:end_idx] # 这行代码截取出完整的翻译文本

print translation # 最后打印出翻译结果

来源

4

如果谷歌不允许你这样做,你可以通过谷歌的API来编程地翻译普通网站的源代码。

我之前写了一个函数来实现这个功能:

def translate(text, src = '', to = 'en'):
  parameters = ({'langpair': '{0}|{1}'.format(src, to), 'v': '1.0' })
  translated = ''

  for text in (text[index:index + 4500] for index in range(0, len(text), 4500)):
    parameters['q'] = text
    response = json.loads(urllib.request.urlopen('http://ajax.googleapis.com/ajax/services/language/translate', data = urllib.parse.urlencode(parameters).encode('utf-8')).read().decode('utf-8'))

    try:
      translated += response['responseData']['translatedText']
    except:
      pass

  return translated

撰写回答