使用googletrans与Pandas的Python爬虫脚本运行失败求助
问题:爬取课程标题并翻译的Python脚本运行失败
终端报错信息
文件 "C:\Users\Zux\PycharmProjects\ClassCentral\ClassCentral\Lib\site-packages\googletrans\client.py",第182行,translate函数中: data = self._translate(text, dest, src, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Users\Zux\PycharmProjects\ClassCentral\ClassCentral\Lib\site-packages\googletrans\client.py",第78行,_translate函数中: token = self.token_acquirer.do(text) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件 "C:\Users\Zux\PycharmProjects\ClassCentral\ClassCentral\Lib\site-packages\googletrans\gtoken.py",第194行,do函数中: self._update() 文件 "C:\Users\Zux\PycharmProjects\ClassCentral\ClassCentral\Lib\site-packages\googletrans\gtoken.py",第62行,_update函数中: code = self.RE_TKK.search(r.text).group(1).replace('var ', '') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'group'
脚本代码实现
from googletrans import Translator from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions import pandas as pd import urllib.request as urllib2 import time chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument("window-size=1920,1080") driver = webdriver.Chrome(options=chrome_options) url = "https://www.classcentral.com/collection/top-free-online-courses" driver.get(url) translator = Translator() try: while True: # wait until button is clickable WebDriverWait(driver, 1).until( expected_conditions.element_to_be_clickable((By.XPATH, "//button[@data-name='LOAD_MORE']")) ).click() time.sleep(0.5) except Exception as e: pass all_courses = driver.find_element(by=By.CLASS_NAME, value='catalog-grid__results') courses = all_courses.find_elements(by=By.CSS_SELECTOR, value='[class="color-charcoal course-name"]') df = pd.DataFrame([[course.text, course.get_attribute('href')] for course in courses], columns=['Title (eng)', 'Link']) df['Title (hin)'] = df['Title (eng)'].apply(lambda x: translator.translate(x, dest='hi').text) print(df)
解决方法
该错误源于googletrans官方库的token获取机制失效——谷歌翻译反爬策略更新后,旧版库无法正确生成请求token。以下是三种可行解决方案:
1. 安装维护中的googletrans分支版本
卸载当前版本,安装第三方维护的修复版本:
pip uninstall googletrans -y pip install googletrans==4.0.0-rc1
替换后无需修改原有翻译代码即可正常运行。
2. 改用translate库替代
若上述版本仍有问题,可切换至translate库:
先安装依赖:
pip install translate
再修改翻译部分代码:
from translate import Translator # 替换原有翻译相关代码 translator = Translator(to_lang="hi") df['Title (hin)'] = df['Title (eng)'].apply(lambda x: translator.translate(x))
3. 用Selenium模拟谷歌翻译页面
依赖已有的Selenium环境,直接模拟人工翻译操作,无API限制问题:
# 替换原有翻译部分代码 def translate_text(text): driver.get(f"https://translate.google.com/?sl=en&tl=hi&text={text}&op=translate") # 等待翻译结果加载完成 WebDriverWait(driver, 3).until( expected_conditions.presence_of_element_located((By.CSS_SELECTOR, 'span[class="JLqJ4b ChMk0b"]')) ) result = driver.find_element(By.CSS_SELECTOR, 'span[class="JLqJ4b ChMk0b"]').text return result df['Title (hin)'] = df['Title (eng)'].apply(translate_text)
此方法速度稍慢,但不会受token失效影响。
内容的提问来源于stack exchange,提问作者Sandra Jackson
相关产品推荐
相关产品推荐

