最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python制作mini翻譯器的實(shí)現(xiàn)示例

 更新時(shí)間:2020年08月17日 09:53:03   作者:Amo Xiang  
這篇文章主要介紹了用Python制作mini翻譯器的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. 實(shí)例描述

在平時(shí)編程的過程中,會(huì)經(jīng)常在網(wǎng)上翻譯一些單詞,本文使用Python制作一款翻譯小工具,不僅可以自己用,還可以嵌入到程序當(dāng)中。運(yùn)行程序,效果如下圖所示,在文本框輸入英文或中文,單擊 翻譯 按鈕即可翻譯,并將翻譯內(nèi)容顯示在下面的文本框中。單擊 保存 按鈕將輸入內(nèi)容和翻譯內(nèi)容保存到文本文件中以便日后復(fù)習(xí)。單擊 清空 按鈕,將清除文本框中的內(nèi)容。

2. 技術(shù)要點(diǎn)

利用 requests 模塊獲取 有道詞典web 頁(yè)面的 post 信息,獲取需要的內(nèi)容,通過 tkinter 模塊生成窗口界面,使用文件讀寫方法將內(nèi)容保存到文本文件中。

2.1 有道詞典這樣的 JS 混淆加密應(yīng)該怎么破

嘿嘿嘿,本文需要說說一些爬蟲過程中需要斗智斗勇的事情了,這次咱們就來說說關(guān)于一些 JS 混淆加密的事。所謂 JS ,就是 JavaScript,一種前端的腳本語(yǔ)言,一般情況下每個(gè)網(wǎng)站都需要 JS 來做一些數(shù)據(jù)交互,頁(yè)面渲染等一些異步操作。當(dāng)然,對(duì)于反爬的人來說,JS 的用處還可以用來對(duì)一些數(shù)據(jù)進(jìn)行加密。

今天咱們就以有道詞典這個(gè)在線翻譯的網(wǎng)站為例,看看他們是如何加密請(qǐng)求數(shù)據(jù)的,以及筆者是如何通過 Python 模擬請(qǐng)求從而獲得關(guān)鍵數(shù)據(jù)的。

點(diǎn)擊 此處 打開有道翻譯的網(wǎng)站:


輸入中文然后點(diǎn)擊翻譯按鈕就會(huì)翻譯出來英文,比如:


接著我們打開開發(fā)者工具,按下 F12 來抓一下數(shù)據(jù),當(dāng)我們點(diǎn)擊翻譯的時(shí)候,可以看到有了一個(gè)請(qǐng)求:


點(diǎn)進(jìn)去看可以發(fā)現(xiàn),POST 請(qǐng)求的地址是:

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule


我們?cè)賮砜匆幌抡?qǐng)求過去攜帶的參數(shù)是啥:


可以看到,還是需要挺多參數(shù)的,其中的 i 就是我們要翻譯的內(nèi)容,那簡(jiǎn)單啊~想要得到翻譯后的數(shù)據(jù),那么我們直接把請(qǐng)求頭和所需參數(shù)的值復(fù)制一下,然后用 requests 請(qǐng)求一波不就搞定了?運(yùn)行一波,返回的是錯(cuò)誤碼。


我們?cè)冱c(diǎn)多幾次翻譯按鈕,然后就可以看到有多次請(qǐng)求。


可以發(fā)現(xiàn),每一次的請(qǐng)求中的 saltsign、lts、bv 參數(shù)是會(huì)一直變化的。



我們回到NetWork ,我們看到 Initiator 這一欄,可以看到它請(qǐng)求到了 fanyi.min.js:1 這個(gè) js 文件。


我們就點(diǎn) fanyi.min.js:1 進(jìn)去看看,牛的一比,直接看不懂…還好,左下角有一個(gè) {} ,可以點(diǎn)一下,發(fā)現(xiàn)有驚喜,直接幫我們把壓縮的 js 代碼格式化。


牛逼不,行號(hào)都給我們顯示出來了,不過到了這里,依然懵逼,我們還是不知道怎么拿到 salt、sign、lts、bv 這些參數(shù)的值…咋辦?恩,Chrome 瀏覽器的打斷點(diǎn)功能在這個(gè)時(shí)候就要派上用場(chǎng)。那么如何使用斷點(diǎn)功能呢,我們看到 Chrome 的右邊是這樣的:


看到這個(gè) XHR/fetch BreakPoints 沒,在這里我們可以添加 url ,根據(jù)請(qǐng)求這個(gè) url 打斷點(diǎn)。而我們要打的斷點(diǎn)就是一開始獲取到的請(qǐng)求 url

http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule

點(diǎn)擊 XHR/fetch BreakPoints 右邊的 + 號(hào),然后把鏈接復(fù)制進(jìn)去:


這時(shí)候再點(diǎn)擊翻譯按鈕,突然,你的屏幕一灰,表示好事將近,我們成功打上了斷點(diǎn),也就是說,現(xiàn)在我們可以在請(qǐng)求之前做一些騷操作。


這時(shí)候我們將右邊的 Call Stack 展開,點(diǎn) t.translate 進(jìn)去:


這些,就是我們?cè)邳c(diǎn)擊翻譯按鈕之后,會(huì)調(diào)用到 js 里面的方法,從這里下手,來尋找參數(shù)是被如何加密的,


3. 代碼實(shí)現(xiàn)

用Python制作mini翻譯器的具體步驟如下:

首先安裝 requests 模塊。使用 pip 命令安裝,命令如下:

pip install --user -i http://pypi.douban.com/simple --trusted-host pypi.douban.com requests

導(dǎo)入相關(guān)模塊,代碼如下。

import tkinter as tk
import requests
import time
import hashlib
import random

定義翻譯函數(shù),代碼如下。

def get_ts():
  """
  獲取時(shí)間戳
  :return: 時(shí)間
  """
  return str(int(time.time() * 1000))


def get_bv():
  """
  獲取app版本 并通過md5加密
  :return: 加密后的字符串
  """
  navigator_appVersion = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3' \
              '904.108 Safari/537.36'
  m = hashlib.md5()
  m.update(navigator_appVersion.encode('utf-8'))
  return m.hexdigest()


def get_salt(ts):
  return str(ts) + str(int(random.random() * 10))


def get_sign(salt):
  str1 = text1.get() # 定義一個(gè)變量,用來接收輸入文本框的值
  str_data = 'fanyideskweb' + str1 + salt + ']BjuETDhU)zqSxf-=B#7m'
  m = hashlib.md5()
  m.update(str_data.encode('utf-8'))
  return m.hexdigest()


def get_form_data():
  str1 = text1.get() # 定義一個(gè)變量,用來接收輸入文本框的值
  ts = get_ts()
  salt = get_salt(ts)
  form_data = {
    'i': str1,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': str(salt),
    'sign': get_sign(salt),
    'ts': ts,
    'bv': get_bv(),
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_CLICKBUTTION',
  }
  return form_data


# 定義翻譯函數(shù)
def translate():
  url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
  headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'Referer': 'http://fanyi.youdao.com/',
    'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=173326173.72226533; OUTFOX_SEARCH_USER_ID="-1202396372@10.108.160.18"; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcAjF-mxbKFQ_48uyLpx; __guid=204659719.1682486053682624500.1597281254731.5474; monitor_count=2; ___rl__test__cookies=1597285713766'
  }
  response = requests.post(url=url, data=get_form_data(), headers=headers)
  if response.status_code == 200:
    result = response.json()
    translate_result = result['translateResult'][0][0]['tgt']
    text2.delete(1.0, "end") # 清空輸出文本框
    text2.insert('end', translate_result) # 將翻譯結(jié)果添加到輸出文本框中

定義寫入文本 txt 的函數(shù),代碼如下。

# 定義寫入文本txt的函數(shù)
def write():
  f1 = open('translate.txt', 'a+')
  f1.write(text1.get() + ',' + text2.get(0.0, tk.END))

定義清空文本框的函數(shù),代碼如下。

# 定義清空文本框的函數(shù)
def delete():
  text1.delete(0, "end") # 從第一行清除到最后一行
  text2.delete(1.0, "end")

窗口界面設(shè)計(jì),代碼如下。

if __name__ == '__main__':
  window = tk.Tk() # 創(chuàng)建window窗口
  window.wm_attributes("-topmost", 1) # 置頂
  window.title("AmoXiang mini翻譯器") # 定義窗口名稱
  window.resizable(width=False, height=False) # 決定框體大小是否能夠調(diào)整
  text1 = tk.Entry(window, width=80, bg='whitesmoke') # 在窗體上添加一個(gè)輸入文本框,并設(shè)置尺寸和顏色
  text2 = tk.Text(window, height=18, bg='lightgrey') # 在窗體上添加一個(gè)輸出文本框,并設(shè)置尺寸和顏色
  text1.grid(row=0, sticky="W", padx=1)
  text2.grid(row=1)
  # 添加一個(gè)按鈕,用于觸發(fā)翻譯功能
  t_button = tk.Button(window, text='翻譯', relief=tk.RAISED, width=8, height=1, font='宋體', bg='red', fg='white',
             command=translate)
  # 添加一個(gè)按鈕,用于觸發(fā)清空輸入文本框
  button1 = tk.Button(window, text='保存', font='宋體', relief=tk.RAISED, width=8, height=1, command=write)
  # 添加一個(gè)按鈕,用于觸發(fā)清空輸出文本框
  button2 = tk.Button(window, text='清空', font='宋體', relief=tk.RAISED, width=8, height=1, command=delete)
  # 添加背景圖片
  image_file = tk.PhotoImage(file='amo.gif')
  label = tk.Label(window, image=image_file)
  # 完成界面布局,設(shè)置各個(gè)控件的位置
  t_button.grid(row=0, column=1, padx=2)
  button1.grid(row=0, column=2, padx=2)
  button2.grid(row=0, column=3, padx=2)
  label.grid(row=1, column=1, columnspan=3)
  tk.mainloop()

到此這篇關(guān)于用Python制作mini翻譯器的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python mini翻譯器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python密碼學(xué)周期置換密碼學(xué)習(xí)

    python密碼學(xué)周期置換密碼學(xué)習(xí)

    這篇文章主要為大家介紹了python密碼學(xué)周期置換密碼的學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python Pandas高級(jí)教程之時(shí)間處理

    Python Pandas高級(jí)教程之時(shí)間處理

    我們發(fā)現(xiàn)關(guān)于時(shí)間日期的簡(jiǎn)單計(jì)算很多功能都是datetime庫(kù)提供的,那么pandas有沒有提供跟日期時(shí)間有關(guān)的函數(shù),通過下面文章來了解下,這篇文章主要給大家介紹了關(guān)于Python Pandas高級(jí)教程之時(shí)間處理的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • python實(shí)現(xiàn)簡(jiǎn)易數(shù)碼時(shí)鐘

    python實(shí)現(xiàn)簡(jiǎn)易數(shù)碼時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易數(shù)碼時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • windows下python 3.9 Numpy scipy和matlabplot的安裝教程詳解

    windows下python 3.9 Numpy scipy和matlabplot的安裝教程詳解

    這篇文章主要介紹了windows下python 3.9 Numpy scipy和matlabplot的安裝教程詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python中列表索引 A[ : 2 ]與A[ : , 2]的區(qū)別說明

    Python中列表索引 A[ : 2 ]與A[ : ,&nb

    這篇文章主要介紹了Python中列表索引 A[ : 2 ]與A[ : , 2]的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python編寫第一個(gè)交互程序步驟示例教程

    python編寫第一個(gè)交互程序步驟示例教程

    這篇文章主要為大家介紹了python編寫第一個(gè)交互程序示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python FastAPI+Celery+RabbitMQ實(shí)現(xiàn)分布式圖片水印處理系統(tǒng)

    Python FastAPI+Celery+RabbitMQ實(shí)現(xiàn)分布式圖片水印處理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Python FastAPI如何結(jié)合Celery以及RabbitMQ實(shí)現(xiàn)簡(jiǎn)單的分布式圖片水印處理系統(tǒng),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • python刪除指定目錄下的文件和文件夾的實(shí)現(xiàn)

    python刪除指定目錄下的文件和文件夾的實(shí)現(xiàn)

    在日常的辦公中,我們可以利用Python批量刪除文件和文件夾,本文就來介紹一下python刪除指定目錄下的文件和文件夾的實(shí)現(xiàn),感興趣的可以了解一下
    2024-01-01
  • Python 串口讀寫的實(shí)現(xiàn)方法

    Python 串口讀寫的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇Python 串口讀寫的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python使用folium庫(kù)繪制地圖點(diǎn)擊框

    python使用folium庫(kù)繪制地圖點(diǎn)擊框

    這篇文章主要為大家詳細(xì)介紹了python使用folium庫(kù)繪制地圖點(diǎn)擊框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評(píng)論

乌拉特前旗| 闵行区| 济源市| 招远市| 潜江市| 城固县| 内江市| 哈巴河县| 油尖旺区| 芜湖市| 雷州市| 罗甸县| 淮阳县| 舞钢市| 承德县| 平陆县| 晋城| 南通市| 沿河| 华阴市| 阿克陶县| 罗田县| 颍上县| 南京市| 开阳县| 东辽县| 台北市| 常熟市| 兴山县| 盐城市| 新营市| 瓦房店市| 恩施市| 日土县| 金乡县| 余姚市| 光山县| 遂宁市| 贵溪市| 日照市| 汝南县|