python實戰(zhàn)篇:利用request庫打造自己的翻譯接口

通過閱讀之前python基礎(chǔ)篇的文章,基本上對python這門語言有了初步的了解?;A(chǔ)篇的文章都是介紹python的一些語法和函數(shù)的使用方法。實戰(zhàn)篇是通過一個完整的案例講解python在實際開發(fā)中運用方法。今天通過做一個翻譯的接口來介紹一下request庫的基本用法。

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變量中,我們將響應文本打印到控制臺。

還可以將參數(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方法進行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ā)送,我們將響應文本打印到控制臺。

開發(fā)自己的翻譯接口

分析百度翻譯

打開百度翻譯地址,然后按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ù)字符串進行加密得到的。

通過百度翻譯的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)容復制進去。關(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是對應js的方法,queryjsb方法的參數(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)不是每次請求成功的,所以需要多次進行請求,通過一個循環(huán)操作,當清楚成功就跳出循環(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ù)自己的需求采用FlaskFastapi開發(fā)API接口了。下面是全部的代碼

本文由mdnice多平臺發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容