GoogleTrans API错误 - 期望值:第1行第1列(char 0)

25

在迭代翻译成千上万的文本数据时,我遇到了这个错误:

Expecting value: line 1 column 1 (char 0)

我用来翻译大量文本的代码:

translatedList = []
for index, row in df.iterrows():
    newrow = copy.deepcopy(row)
    try:
        # translate the 'text' column
        translated = translator.translate(row['text'], dest='en')
        newrow['translated'] = translated.text
    except Exception as e:
        print(str(e))
        continue
    translatedList.append(newrow)

在翻译约2-3k行后,我收到了这个错误。

11个回答

29

我大概弄明白了问题所在。我认为这与Google API的请求限制有关。

我通过在每次迭代时重新初始化翻译器API来解决了这个问题:

import copy
from googletrans import Translator

translatedList = []
for index, row in df.iterrows():
    # REINITIALIZE THE API
    translator = Translator()
    newrow = copy.deepcopy(row)
    try:
        # translate the 'text' column
        translated = translator.translate(row['text'], dest='en')
        newrow['translated'] = translated.text
    except Exception as e:
        print(str(e))
        continue
    translatedList.append(newrow)

1
我找到了两个较旧的问题(这里这里),它们实际上与字符限制有关。奇怪的是,它们提到了一个15k的限制,但我在相关的文档中找不到(这些问题比配额的最新更新还要新)。无论如何,这不是一个信息丰富的错误消息... - Lefteris S
2
无论是否与15k限制有关,错误信息都像你所说的一样没有提供任何有用的信息。但是,如果每次初始化API,您就不会受到任何限制的阻碍。 - Kerem

9

这是我绕过他们的API调用限制所必须做的事情... 我使用VPN,具体来说是Nord-Vpn,因此要以我这种方式进行操作,您需要能够通过终端连接/断开连接到/从VPN...

    def translate_text(text, dest_language="en"):
        # Used to translate using the googletrans library
        import json
        translator = googletrans.Translator()
        try:
            translation = translator.translate(text=text, dest=dest_language)
        except json.decoder.JSONDecodeError:
            # api call restriction
            process = subprocess.Popen(["nordvpn", "d"], stdout=subprocess.PIPE)
            process.wait()
            process = subprocess.Popen(["nordvpn", "c", "canada"], stdout=subprocess.PIPE)
            process.wait()
            return Process_Data.translate_text(text=text, dest_language=dest_language)
        return translation

这是一个非常有趣的评论。我遇到了同样的问题,你能否深入介绍一下这个方法?我对这些东西都很新,不知道如何使用你提到的 VPN。 - Moreno
googletrans API 限制了在一定时间内对某个IP地址的调用次数。因为我需要进行大量的调用,所以我决定使用VPN来更改我的IP地址。我的代码可以检测到当googletrans的API限制了调用时(“除了json.decoder.JSONDecodeError”),我会使用“import subprocess”库执行命令来更改我的VPN服务器,然后再尝试使用不同的IP地址进行API调用。 - Austin Marino
太好了,不幸的是我没有制作这个所需的经验。要使您的代码对我起作用,我需要什么?需要安装/配置任何内容吗? - Moreno
你需要在你的Windows/macOS/Linux系统上安装一个可以通过终端控制的VPN。一旦你完成了这个步骤,你就可以愉快地使用了。只需将["nordvpn", "d"]["nordvpn", "c", "canada"]替换为你在终端中执行断开连接和连接到特定VPN的正确命令即可。我使用NordVPN,因此使用了“nordvpn”命令。 - Austin Marino

5

谷歌可能会阻止您的IP地址,使用VPN即可解决。


4

有两个可能的原因:
1. IP地址被暂时阻止了。
2. 您已达到字符限制。

我曾经遇到同样的问题,最终使用了另一个名为translate的软件包,它可以完美地解决这个问题。语法也非常相似。您可以在这里找到它,或者使用pip install translate


1
谢谢,这对我从俄语翻译成英语很有用,但我认为还不够好。 - ShayHa
我尝试了这个模块,它更易于使用,但限制非常小。 - Jaime38130

3

在我的情况下,这是由于字符串中的表情符号导致的。 我删除了它们,一切都运行正常。


3

在我的情况下,错误是由于短时间内过多的请求导致我的IP地址被暂时阻止。我第二天再试,一切都正常了。


3
我将提供Austin Marino的修改答案,这里是一个解决方案,对于我在2000个单词列表中刚刚起作用(在更大的列表中也可以工作)。
首先,您需要安装NordVPN并将其添加到系统路径,请检查此链接:

https://support.nordvpn.com/Connectivity/Windows/1350897482/Connect-to-NordVPN-app-on-Windows-using-the-Command-Prompt.htm

目标是允许您通过CMD连接/断开连接和选择服务器(您也可以在Linux中执行相同的操作),以便您可以通过Python代码控制这些NordVPN CMD命令。

以下是函数(请导入所需的库):

   import random

listofservers = ["South Africa", "Egypt" , "Australia", "New Zealand",  "South Korea", "Singapore", "Taiwan", "Vietnam", "Hong Kong", "Indonesia", "Thailand", "Japan", "Malaysia", "United Kingdom", "Netherlands", "Germany", "France", "Belgium", "Switzerland", "Sweden","Spain","Denmark", "Italy", "Norway", "Austria", "Romania", "Czech Republic", "Luxembourg", "Poland", "Finland", "Hungary", "Latvia", "Russia", "Iceland", "Bulgaria", "Croatia", "Moldova", "Portugal", "Albania", "Ireland", "Slovakia","Ukraine", "Cyprus", "Estonia", "Georgia", "Greece", "Serbia", "Slovenia", "Azerbaijan", "Bosnia and Herzegovina", "Macedonia","India", 'Turkey', 'Israel', 'United Arab Emirates', 'United States', 'Canada','Mexico'
,"Brazil", "Costa Rica", "Argentina", "Chile"]

def SelectServer(l):
    return random.choice(l)

def translate_text(text, dest_language="en"):  
    # Used to translate using the googletrans library
    translator = googletrans.Translator()
    try:

        translation = translator.translate(text=text, dest=dest_language)

    except json.decoder.JSONDecodeError:
        # api call restriction

        print("exception !! déconection du VPN ")
        process = subprocess.Popen(["nordvpn", "-d"], shell = True ,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        process.wait()

        time.sleep(5)

        srv = SelectServer(listofservers)

        print("sélection du serveur  : "+ srv + " et connexion")

        process = subprocess.Popen(["nordvpn", "-c", "-g", srv ], shell = True ,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        process.wait()
        time.sleep(60)

        return translate_text(text=text, dest_language=dest_language)

    return translation.text


    #translate to EN and remove EN stopwords 
    ListCapTranslated = []
    for row  in ListCaptionsCleanFiltred:
        # REINITIALIZE THE API
        newrow = translate_text(row, dest_language="en")
        ListCapTranslated.append(newrow)

ListCapTranslated

在运行代码之前,请将 NordVPN 添加到系统路径,并通过 CMD 测试连接/断开服务器,以确保一切正常。
干杯。

2
我也遇到过这个问题。在我的情况下,是由于将英文文本翻译成英文所致。
为了解决这个问题,我使用了另一个包langdetect来将非英语文本路由到使用谷歌翻译进行翻译。
以下是一些代码片段:
from langdetect import detect
lang = detect(title)
if lang == 'en':
    temp_dict['title'] = title
else:
    temp_dict['title'] = translator.translate(title, dest='en').text

1
这是由于翻译限制导致的。您可以使用VPN或Tor来绕过此限制。 但是,您可以通过使用translingual Python软件包来规避此问题。 此外,语言代码可以在此处访问,language codes
from translingual import translate
# example
trans = translate.translate(data=['hello world', 'the world is yours', 'whatever you do, whatever I do', '2b or not 2b'],tolang='es',fromlang='en',thread=3)
print(trans.translate())

0

这是由于API限制造成的。每次初始化的翻译限制。 因此,通过拆分代码,在限制后重新初始化翻译器。

from googletrans import Translator

translator = Translator()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接