Python利用request庫實(shí)現(xiàn)翻譯接口
通過閱讀之前python基礎(chǔ)篇的文章,基本上對(duì)python這門語言有了初步的了解?;A(chǔ)篇的文章都是介紹python的一些語法和函數(shù)的使用方法。實(shí)戰(zhàn)篇是通過一個(gè)完整的案例講解python在實(shí)際開發(fā)中運(yùn)用方法。今天通過做一個(gè)翻譯的接口來介紹一下request
庫的基本用法。
request庫的基本使用
安裝
要使用Python中的requests庫,首先需要使用pip安裝它。您可以在終端中運(yùn)行以下命令來完成此操作:
pip install requests
使用
安裝庫后,您可以使用它來進(jìn)行HTTP請(qǐng)求。以下是如何進(jìn)行GET請(qǐng)求的示例:
import requests response = requests.get('https://www.baidu.com') print(response.text)
在此示例中,我們導(dǎo)入requests庫,然后使用get方法進(jìn)行GET請(qǐng)求到https://www.baidu.com。服務(wù)器的響應(yīng)存儲(chǔ)在response變量中,我們將響應(yīng)文本打印到控制臺(tái)。
還可以將參數(shù)傳遞給get方法,以在請(qǐng)求中包含查詢參數(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打印到控制臺(tái)。
還可以使用post方法進(jìn)行POST請(qǐng)求:
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ù)將在請(qǐng)求的正文中發(fā)送,我們將響應(yīng)文本打印到控制臺(tái)。
開發(fā)自己的翻譯接口
分析百度翻譯
打開百度翻譯地址,然后按F12
打開開發(fā)者模式,輸入翻譯的內(nèi)容,點(diǎn)擊翻譯,通過下圖,可以清楚看到請(qǐng)求的地址和請(qǐng)求的參數(shù)
百度翻譯通過向https://fanyi.baidu.com/v2transapi發(fā)送post請(qǐng)求,發(fā)送的數(shù)據(jù)中只有sign是不斷變化的,搜索v2transapi發(fā)現(xiàn)sign字段是通過js通過你要發(fā)送的數(shù)據(jù)字符串進(jìn)行加密得到的。
通過百度翻譯的js
分析得出加密的關(guān)鍵代碼如下:
現(xiàn)在已經(jīng)搞清楚了整個(gè)調(diào)用的流程,所有的參數(shù)都可以自己構(gòu)造。這樣就可以寫代碼了。
寫接口代碼
1、為了防止請(qǐng)求失敗,需要模仿瀏覽器請(qǐng)求,在請(qǐng)求時(shí)加上請(qǐng)求頭,我們采用fake_useragent
這個(gè)第三方庫,隨機(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
這個(gè)庫使用方法也很簡單,例如,上面我們已經(jīng)把百度的加密js
代碼已經(jīng)提取出來了,并新建一個(gè)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)用該對(duì)象。最后通過調(diào)用call
方法執(zhí)行js
文件的里面的方法,其中b
是對(duì)應(yīng)js
的方法,query
是js
中b
方法的參數(shù)。
調(diào)用成功后,返回如下:
3、獲取token
值,通過觀察百度翻譯頁面的源碼,發(fā)現(xiàn)token
是存放在頁面中的,這樣我們就可以通過請(qǐng)求頁面獲取到token
.
res = request.get("https://fanyi.baidu.com").content.decode() token = re.findall(r"token: '(.*)',", res, re.M)[0]
4、到目前為止所有的請(qǐng)求參數(shù)已經(jīng)有了,這樣我們就可以開始構(gòu)造請(qǐng)求。核心代碼如下:
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")
請(qǐng)求成功后,會(huì)返回如下圖:
通過實(shí)際的調(diào)用中發(fā)現(xiàn)不是每次請(qǐng)求成功的,所以需要多次進(jìn)行請(qǐng)求,通過一個(gè)循環(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)上下班搶個(gè)順風(fēng)單腳本
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)上下班搶個(gè)順風(fēng)單腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02python向xls寫入數(shù)據(jù)(包括合并,邊框,對(duì)齊,列寬)
這篇文章主要介紹了python向xls寫入數(shù)據(jù)(包括合并,邊框,對(duì)齊,列寬),幫助大家更好的利用python處理表格,感興趣的朋友可以了解下2021-02-02淺談Django中view對(duì)數(shù)據(jù)庫的調(diào)用方法
今天小編就為大家分享一篇淺談Django中view對(duì)數(shù)據(jù)庫的調(diào)用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07JSONLINT:python的json數(shù)據(jù)驗(yàn)證庫實(shí)例解析
本文介紹的 jsonlint 啟發(fā)自 python 的表單驗(yàn)證工具 wtforms,wtforms 通過繼承 Form 類也能進(jìn)行 json 數(shù)據(jù)驗(yàn)證,下面通過一些例子給大家詳細(xì)介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-11-11將python文件打包exe獨(dú)立運(yùn)行程序方法詳解
這篇文章主要介紹了將python文件打包exe獨(dú)立運(yùn)行程序方法詳解,需要的朋友可以參考下2020-02-02python實(shí)現(xiàn)跳表SkipList的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)跳表SkipList的示例代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07