要使用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庫實作翻譯介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!