您好,登錄后才能下訂單哦!
本篇內容主要講解“Python怎么用request庫實現翻譯接口”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python怎么用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
打開開發者模式,輸入翻譯的內容,點擊翻譯,通過下圖,可以清楚看到請求的地址和請求的參數
百度翻譯通過向https://fanyi.baidu.com/v2transapi發送post請求,發送的數據中只有sign是不斷變化的,搜索v2transapi發現sign字段是通過js通過你要發送的數據字符串進行加密得到的。
通過百度翻譯的js
分析得出加密的關鍵代碼如下:
現在已經搞清楚了整個調用的流程,所有的參數都可以自己構造。這樣就可以寫代碼了。
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
的方法,query
是js
中b
方法的參數。
調用成功后,返回如下:
3、獲取token
值,通過觀察百度翻譯頁面的源碼,發現token
是存放在頁面中的,這樣我們就可以通過請求頁面獲取到token
.
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")
請求成功后,會返回如下圖:
通過實際的調用中發現不是每次請求成功的,所以需要多次進行請求,通過一個循環操作,當清楚成功就跳出循環,關鍵代碼如下:
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")
這樣我們就已經完成利用百度翻譯接口,做成自己的翻譯接口調用了。可以根據自己的需求采用Flask
或Fastapi
開發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庫實現翻譯接口”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。