关于python全自动翻译遇到的问题

Translent思路

  • 通过selenium获取cookies
  • 使用cookies访问并且爬取需要翻译的字符存储在一个列表里
  • 将列表的的字符串通过有道翻译逐个翻译成中文并返回存储在另一列表里
  • 提取翻译后的中文字符串传入站点后台中文选项框里,对里面的英文进行替换并保存

思路有了开始做

登陆需要的东西

  • 账号:admin
  • 密码:123456

获取cookies——fileName = loginAdmin.py

from selenium import webdriver
import time
from requests.cookies import RequestsCookieJar
def To_admin():
    '''访问'''
    url = 'http://test.iscrooge.cn'
    dr = webdriver.Chrome()
    dr.get(url)

    '''登陆'''
    dr.find_element_by_css_selector('#username').send_keys('admin')
    dr.find_element_by_css_selector('#password').send_keys('123456')
    dr.find_element_by_css_selector('#login > div.login_signup_combo > div.login__ > button').click()
    time.sleep(1)

    '''返回cookies'''
    cookie_list = dr.get_cookies()
    cookies = RequestsCookieJar()
    for cookie in cookie_list:
        cookies.set(cookie['name'],cookie['value'])

    return cookies

清洗保存需要翻译的英文字符——fileName = getEngWords.py

from login_admin import To_admin
import requests
import re
def getVALUE():
    '''通过'cookies访问'''
    cookies = To_admin()

    words = []

    for i in range(20):
        value_list = []
        url = 'http://test.iscrooge.cn/admin-cp/edit-lang?id=chinese&page-id={}'.format(i+2)
        req = requests.get(url=url,cookies=cookies).text

        '''爬取VALUE值'''
        pat = '<button type="button" class="btn btn-default waves-effect btn-lang m-r-20" data-id="(.*?)" data-toggle="modal" data-target="#defaultModal">EDIT</button>'
        values = re.findall(pat,req)

        #将value值中的下划线替换并且加入到words[]列表中
        for x in values:
            word = x.replace('_',' ')
            words.append(word)

    return words

感谢 @Jason990420 提供的有道api——fileName = youDaoApi.py

import requests
import json
def youDaoApi(word):
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null'
    # 传输的参数,其中 i 为需要翻译的内容
    key = {
        'type': "AUTO",
        'i': word,
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "ue": "UTF-8",
        "action": "FY_BY_CLICKBUTTON",
        "typoResult": "true"
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
    }
    # key 这个字典为发送给有道词典服务器的内容
    response = requests.post(url, data=key, headers=headers)
    # 判断服务器是否相应成功
    if response.status_code == 200:
        # 然后相应的结果
        result = json.loads(response.text)
        return result['translateResult'][0][0]['tgt']
    else:
        print("有道词典调用失败")
        # 相应失败就返回空
        return None

将翻译后的中文存储在列表里方便使用——fileName = startTranslent.py

from translent_words import getVALUE
from youDaoApi import youDaoApi
from threading import Thread
'''翻译并且保存翻译后的字符'''
def translent_and_save():
    chinese_words = []        #创建一个空列表用于存储翻译后的字符

    words_list = getVALUE()

    '''遍历所有英文并且翻译'''
    for i in words_list:
        chinese = youDaoApi(i)
        chinese_words.append(chinese)
    return chinese_words    #返回翻译后的中文

遇到的问题

  • 修改请求是post,也尝试过用post附带参数进行修改但是失败了
  • 程序整体运行十分缓慢
  • 没有思路将英文替换成中文

    有想过使用selenium进行操作,这样会增加代码量和逻辑所以不选择。

    希望能得到以下几个建议改进程序:

  • 优化速度
  • 思路清晰
  • 编程需要注意规范的地方
讨论数量: 2
Jason990420

翻译不一定要一次只翻译一个字, 函数改为参数是一个列表.

注意一下, 这里没有考虑一次可翻译的长度, 所以可能要另外处理这个部份.

import requests
import json

def youDaoApi(words):
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null'
    # 传输的参数,其中 i 为需要翻译的内容
    word = '\n'.join(words)
    key = {
        'type': "AUTO",
        'i': word,
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "ue": "UTF-8",
        "action": "FY_BY_CLICKBUTTON",
        "typoResult": "true"
    }
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36'
    }
    # key 这个字典为发送给有道词典服务器的内容
    response = requests.post(url, data=key, headers=headers)
    # 判断服务器是否相应成功
    if response.status_code == 200:
        # 然后相应的结果
        result = json.loads(response.text)
        return [item[0]['tgt'] for item in result['translateResult']]
    else:
        print("有道词典调用失败")
        # 相应失败就返回空
        return None
def translent_and_save():
    '''翻译并且保存翻译后的字符'''
    words_list = getVALUE()
    chinese_words = youDaoApi(words_list)
    return chinese_words    #返回翻译后的中文
2年前 评论

提高速度可以试试多线程,一个简单的 🌰

import requests
import concurrent.futures

from time import sleep


def getVALUE():
    sleep(1)
    return requests.get('https://baidu.com').status_code


result = []

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future_to_url = {executor.submit(getVALUE): i for i in range(20)}
    for future in concurrent.futures.as_completed(future_to_url):
        result.append(future.result())

print(result)
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!