您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Python怎么用request庫實現(xiàn)翻譯接口”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Python怎么用request庫實現(xiàn)翻譯接口”吧!
要使用Python中的requests庫,首先需要使用pip安裝它。您可以在終端中運行以下命令來完成此操作:
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)文本打印到控制臺。
打開百度翻譯地址,然后按F12
打開開發(fā)者模式,輸入翻譯的內(nèi)容,點擊翻譯,通過下圖,可以清楚看到請求的地址和請求的參數(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、為了防止請求失敗,需要模仿瀏覽器請求,在請求時加上請求頭,我們采用fake_useragent
這個第三方庫,隨機生成不同的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")
請求成功后,會返回如下圖:
通過實際的調(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("你好")
到此,相信大家對“Python怎么用request庫實現(xiàn)翻譯接口”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。