Python怎麼用request庫實作翻譯介面

王林
發布: 2023-05-14 22:13:22
轉載
876 人瀏覽過

request函式庫的基本使用

安裝

要使用Python中的requests函式庫,首先需要使用pip安裝它。您可以在終端機中執行以下命令來完成此操作:

pip install requests
登入後複製

使用

安裝程式庫後,您可以使用它來進行HTTP請求。以下是如何進行GET請求的範例:

import requests response = requests.get('https://www.baidu.com') print(response.text)
登入後複製

在此範例中,我們匯入requests函式庫,然後使用get方法進行GET請求到https://www.baidu.com。伺服器的回應儲存在response變數中,我們將回應文字列印到控制台。

也可以將參數傳遞給get方法,以在請求中包含查詢參數:

import requests params = {'key1': 'value1', 'key2': 'value2'} response = requests.get('https://www.example.com', params=params) print(response.url)
登入後複製

在此範例中,我們將查詢參數的字典傳遞給get方法的params參數。產生的URL將包括查詢參數,我們將URL列印到控制台。

也可以使用post方法進行POST請求:

import requests data = {'key1': 'value1', 'key2': 'value2'} response = requests.post('https://www.example.com', data=data) print(response.text)
登入後複製

在此範例中,我們將資料的字典傳遞給post方法的data參數。資料將在請求的正文中發送,我們將回應文字列印到控制台。

開發自己的翻譯介面

分析百度翻譯

開啟百度翻譯位址,然後按F12開啟開發者模式,輸入翻譯的內容,點擊翻譯,透過下圖,可以清楚看到請求的位址和請求的參數

Python怎麼用request庫實作翻譯介面

#百度翻譯透過向https://fanyi.baidu.com/v2transapi發送post請求,發送的資料中只有sign是不斷變化的,搜尋v2transapi發現sign欄位是透過js透過你要傳送的資料字串進行加密得到的。

Python怎麼用request庫實作翻譯介面

透過百度翻譯的js分析得出加密的關鍵程式碼如下:

Python怎麼用request庫實作翻譯介面

現在已經搞清楚了整個呼叫的流程,所有的參數都可以自己建構。這樣就可以寫程式碼了。

寫入介面程式碼

1、為了防止請求失敗,需要模仿瀏覽器請求,在請求時加上請求頭,我們採用fake_useragent這個第三方函式庫,隨機產生不同的User-Agent。關鍵程式碼如下:

from fake_useragent import UserAgent headers = {'User-Agent': UserAgent().random}
登入後複製

2、產生sign參數,由於加密的js程式碼我們看不明白,直接呼叫python的第三方函式庫執行js程式碼,使用前需要安裝execjs函式庫,執行如下的程式碼:

pip3 install PyExecJS
登入後複製

這個函式庫使用方法也很簡單,例如,上面我們已經把百度的加密js程式碼已經提取出來了,並且新建一個js檔,把內容複製進去。關鍵程式碼如下:

def generate_sign(self,query): try: if os.path.isfile("./baidu.js"): with open("./baidu.js", 'r', encoding="utf-8") as f: baidu_js = f.read() ctx = execjs.compile(baidu_js) return ctx.call('b', query) except Exception as e: print(e)
登入後複製

先把js檔案讀到快取中,再透過execjs呼叫該物件。最後透過呼叫call方法執行js檔案的裡面的方法,其中b是對應js的方法,queryjsb方法的參數。

呼叫成功後,返回如下:

Python怎麼用request庫實作翻譯介面

3、取得token值,透過觀察百度翻譯頁面的原始碼,發現token是存放在頁面中的,這樣我們就可以透過請求頁面取得到token.

Python怎麼用request庫實作翻譯介面

res = request.get("https://fanyi.baidu.com").content.decode() token = re.findall(r"token: '(.*)',", res, re.M)[0]
登入後複製

4、到目前為止所有的請求參數已經有了,這樣我們就可以開始建構請求。核心程式碼如下:

url = 'https://fanyi.baidu.com/v2transapi' sign = generate_sign("你好") data = { "from": "zh", "to": 'en', "query": "你好", "transtype": "translang", "simple_means_flag": "3", "sign": sign, "token": self.token, "domain": "common" } res = requests.post( url=url, params={"from": "zh", "to": 'en'}, data=data, headers = { 'User-Agent': UserAgent().random, } ) res.json().get("trans_result").get("data")[0].get("dst")
登入後複製

請求成功後,會傳回如下圖:

Python怎麼用request庫實作翻譯介面

透過實際的呼叫中發現不是每次請求成功的,所以需要多次進行請求,透過一個循環操作,當清楚成功就跳出循環,關鍵程式碼如下:

tryTimes = 0 try: while tryTimes < 100: res = self.session.post( url=url, params={"from": fromLan, "to": toLan}, data=data, ) if "trans_result" in res.text: break tryTimes += 1 return res.json().get("trans_result").get("data")[0].get("dst")
登入後複製

這樣我們就已經完成利用百度翻譯接口,做成自己的翻譯接口調用了。可以依照自己的需求採用FlaskFastapi開發API介面了。下面是全部的代

import requests import execjs import os import re import json from loguru import logger from fake_useragent import UserAgent class Baidu_translate: def __init__(self): self.session=request.Session() self.session.headers={ 'User-Agent': UserAgent( ).random, "Host":"fanyi.baidu.com", "X-Requested-With":"XMLHttpRequest", "sec-ch-ua":'"Not?A_Brand";="8","Chromium";v="108","Microsoft Edge";V="108", "sec-ch-ua-mobile":"?0", "Sec-Fetch-Dest":"document", "Sec-Fetch-Mode":"navigate", "Sec-Fetch-Site": "same-origin", "Sec-Fetch-User":"?1", "Connection":"keep-alive", } self.session.get("https://fanyi.baidu.com" ) res = self.session.get("https://fanyi.baidu.com").content.decode( ) self.token = re.findall(r"token: '(.*)',",res,re.M)[0] def generate_sign(self,query): try: if os.path.isfile("./baidu.js"): with open("./baidu.js",'r',encoding="utf-8") as f: baidu_js = f.read( ) ctx = execjs.compile(baidu_js) return ctx.call('b',query) except Exception as e: print(e) def lang_detect(self,src: str) -> str: url = "https://fanyi.baidu.com/langdetect" fromLan = self.session.post(url, data={"query": src}).json()["lan"] return fromLan def translate(self,query: str, tolan: str = "", fromLan: str = "") -> str: if fromLan == "": fromLan = self.lang_detect(query) if toLan == "": toLan = "zh" if fromLan != "zh" else "en" url = 'https://fanyi.baidu.com/v2transapi' sign = self.generate_sign(query) data = { "from" : fromLan, "to": toLan, "query": query, "transtype":"translang", "simple_means_flag":"3", "sign" : sign, "token": self.token, "domain":"common" } tryTimes = 0 try: while tryTimes < 100: res = self.session.post( url=url, params={"from": fromLan,"to": toLan}, data=data, ) if "trans_result" in res.text: break tryTimes +=1 return res.json().get("trans_result").get("data")[0].get("dst") except Exception as e: print(e) def test(): url ='https://fanyi.baidu.com/v2transapi' sign = generate_sign("你好") data = { "from":"zh", "to":' en', "query":"你好", "transtype":"translang", "simple_means_flag":"3", "sign": sign, "token": self.token, "domain": "common" } res = requests.post( url=url, params={"from": "zh","to":'en'}, data=data, headers = { 'User-Agent': UserAgent( ).random, } ) res .json() if _name__ == "__main__": baidu_tran = Baidu_Translate() sign = baidu_tran.generate_sign("你好")
登入後複製

以上是Python怎麼用request庫實作翻譯介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!