Python利用request庫實(shí)現(xiàn)翻譯接口
通過閱讀之前python基礎(chǔ)篇的文章,基本上對python這門語言有了初步的了解。基礎(chǔ)篇的文章都是介紹python的一些語法和函數(shù)的使用方法。實(shí)戰(zhàn)篇是通過一個完整的案例講解python在實(shí)際開發(fā)中運(yùn)用方法。今天通過做一個翻譯的接口來介紹一下request庫的基本用法。
request庫的基本使用
安裝
要使用Python中的requests庫,首先需要使用pip安裝它。您可以在終端中運(yùn)行以下命令來完成此操作:
pip install requests
使用
安裝庫后,您可以使用它來進(jìn)行HTTP請求。以下是如何進(jìn)行GET請求的示例:
import requests
response = requests.get('https://www.baidu.com')
print(response.text)
在此示例中,我們導(dǎo)入requests庫,然后使用get方法進(jìn)行GET請求到https://www.baidu.com。服務(wù)器的響應(yīng)存儲在response變量中,我們將響應(yīng)文本打印到控制臺。
還可以將參數(shù)傳遞給get方法,以在請求中包含查詢參數(shù):
import requests
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://www.example.com', params=params)
print(response.url)
在此示例中,我們將查詢參數(shù)的字典傳遞給get方法的params參數(shù)。生成的URL將包括查詢參數(shù),我們將URL打印到控制臺。
還可以使用post方法進(jìn)行POST請求:
import requests
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://www.example.com', data=data)
print(response.text)
在此示例中,我們將數(shù)據(jù)的字典傳遞給post方法的data參數(shù)。數(shù)據(jù)將在請求的正文中發(fā)送,我們將響應(yīng)文本打印到控制臺。
開發(fā)自己的翻譯接口
分析百度翻譯
打開百度翻譯地址,然后按F12打開開發(fā)者模式,輸入翻譯的內(nèi)容,點(diǎn)擊翻譯,通過下圖,可以清楚看到請求的地址和請求的參數(shù)

百度翻譯通過向https://fanyi.baidu.com/v2transapi發(fā)送post請求,發(fā)送的數(shù)據(jù)中只有sign是不斷變化的,搜索v2transapi發(fā)現(xiàn)sign字段是通過js通過你要發(fā)送的數(shù)據(jù)字符串進(jìn)行加密得到的。

通過百度翻譯的js分析得出加密的關(guān)鍵代碼如下:

現(xiàn)在已經(jīng)搞清楚了整個調(diào)用的流程,所有的參數(shù)都可以自己構(gòu)造。這樣就可以寫代碼了。
寫接口代碼
1、為了防止請求失敗,需要模仿瀏覽器請求,在請求時(shí)加上請求頭,我們采用fake_useragent這個第三方庫,隨機(jī)生成不同的User-Agent。關(guān)鍵代碼如下:
from fake_useragent import UserAgent
headers = {'User-Agent': UserAgent().random}
2、生成sign參數(shù),由于加密的js代碼我們看不明白,直接調(diào)用python的第三方庫執(zhí)行js代碼,使用前需要安裝execjs庫,執(zhí)行如下的代碼:
pip3 install PyExecJS
這個庫使用方法也很簡單,例如,上面我們已經(jīng)把百度的加密js代碼已經(jīng)提取出來了,并新建一個js文件,把內(nèi)容復(fù)制進(jìn)去。關(guān)鍵代碼如下:
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調(diào)用該對象。最后通過調(diào)用call方法執(zhí)行js文件的里面的方法,其中b是對應(yīng)js的方法,query是js中b方法的參數(shù)。
調(diào)用成功后,返回如下:

3、獲取token值,通過觀察百度翻譯頁面的源碼,發(fā)現(xiàn)token是存放在頁面中的,這樣我們就可以通過請求頁面獲取到token.

res = request.get("https://fanyi.baidu.com").content.decode()
token = re.findall(r"token: '(.*)',", res, re.M)[0]
4、到目前為止所有的請求參數(shù)已經(jīng)有了,這樣我們就可以開始構(gòu)造請求。核心代碼如下:
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")
請求成功后,會返回如下圖:

通過實(shí)際的調(diào)用中發(fā)現(xiàn)不是每次請求成功的,所以需要多次進(jìn)行請求,通過一個循環(huán)操作,當(dāng)清楚成功就跳出循環(huán),關(guān)鍵代碼如下:
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")這樣我們就已經(jīng)完成利用百度翻譯接口,做成自己的翻譯接口調(diào)用了??梢愿鶕?jù)自己的需求采用Flask或Fastapi開發(fā)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("你好") 到此這篇關(guān)于Python利用request庫實(shí)現(xiàn)翻譯接口的文章就介紹到這了,更多相關(guān)Python request翻譯接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python編程開發(fā)之類型轉(zhuǎn)換convert實(shí)例分析
這篇文章主要介紹了python編程開發(fā)之類型轉(zhuǎn)換convert用法,結(jié)合實(shí)例形式分析了Python中常見的數(shù)據(jù)類型及類型轉(zhuǎn)換convert的具體使用方法,需要的朋友可以參考下2015-11-11
python人工智能深度學(xué)習(xí)入門邏輯回歸限制
這篇文章主要為大家介紹了python人工智能深度學(xué)習(xí)入門之邏輯回歸限制的詳細(xì)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
selenium+python實(shí)現(xiàn)基本自動化測試的示例代碼
這篇文章主要介紹了selenium+python實(shí)現(xiàn)基本自動化測試的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用
csv文件是一種逗號分隔的純文本形式存儲的表格數(shù)據(jù),Python內(nèi)置了CSV模塊,可直接通過該模塊實(shí)現(xiàn)csv文件的讀寫操作,下面這篇文章主要給大家介紹了關(guān)于Python操作csv文件之csv.writer()和csv.DictWriter()方法的基本使用,需要的朋友可以參考下2022-09-09
淺談Python peewee 使用經(jīng)驗(yàn)
這篇文章主要介紹了淺談Python peewee 使用經(jīng)驗(yàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10

