Python怎麼用request庫實作翻譯介面

王林
發布: 2023-05-14 22:13:22
轉載
954 人瀏覽過

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開啟開發者模式,輸入翻譯的內容,點擊翻譯,透過下圖,可以清楚看到請求的位址和請求的參數

Python怎麼用request庫實作翻譯介面

#百度翻譯透過向https://fanyi.baidu.com/v2transapi發送post請求,發送的資料中只有sign是不斷變化的,搜尋v2transapi發現sign欄位是透過js透過你要傳送的資料字串進行加密得到的。

Python怎麼用request庫實作翻譯介面

透過百度翻譯的js分析得出加密的關鍵程式碼如下:

Python怎麼用request庫實作翻譯介面

現在已經搞清楚了整個呼叫的流程,所有的參數都可以自己建構。這樣就可以寫程式碼了。

寫入介面程式碼

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的方法,queryjsb方法的參數。

呼叫成功後,返回如下:

Python怎麼用request庫實作翻譯介面

3、取得token值,透過觀察百度翻譯頁面的原始碼,發現token是存放在頁面中的,這樣我們就可以透過請求頁面取得到token.

Python怎麼用request庫實作翻譯介面

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")
登入後複製

請求成功後,會傳回如下圖:

Python怎麼用request庫實作翻譯介面

透過實際的呼叫中發現不是每次請求成功的,所以需要多次進行請求,透過一個循環操作,當清楚成功就跳出循環,關鍵程式碼如下:

        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")
登入後複製

這樣我們就已經完成利用百度翻譯接口,做成自己的翻譯接口調用了。可以依照自己的需求採用FlaskFastapi開發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={
            &#39;User-Agent&#39;: UserAgent( ).random,
            "Host":"fanyi.baidu.com",
            "X-Requested-With":"XMLHttpRequest",
            "sec-ch-ua":&#39;"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: &#39;(.*)&#39;,",res,re.M)[0]
        
    def generate_sign(self,query):
        try:
            if os.path.isfile("./baidu.js"):
                with open("./baidu.js",&#39;r&#39;,encoding="utf-8") as f:
                    baidu_js = f.read( )
            ctx = execjs.compile(baidu_js)
            return ctx.call(&#39;b&#39;,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 = &#39;https://fanyi.baidu.com/v2transapi&#39;
       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 =&#39;https://fanyi.baidu.com/v2transapi&#39;
    sign = generate_sign("你好")
    data = {
        "from":"zh",
        "to":&#39; en&#39;,
        "query":"你好",
        "transtype":"translang",
        "simple_means_flag":"3",
        "sign": sign,
        "token": self.token,
        "domain": "common"
        }
    res = requests.post(
        url=url,
        params={"from": "zh","to":&#39;en&#39;},
        data=data,
        headers = {
            &#39;User-Agent&#39;: UserAgent( ).random,
        }
    )
    
    res .json()
    
if _name__ == "__main__":
    baidu_tran = Baidu_Translate()
    sign = baidu_tran.generate_sign("你好")
登入後複製

以上是Python怎麼用request庫實作翻譯介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板