Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren

So verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren

王林
王林nach vorne
2023-05-14 22:13:22899Durchsuche

Grundlegende Verwendung der Anforderungsbibliothek

Installation

Um die Anforderungsbibliothek in Python verwenden zu können, müssen Sie sie zunächst mit pip installieren. Sie können dies tun, indem Sie den folgenden Befehl im Terminal ausführen:

pip install requests

Using

Nach der Installation der Bibliothek können Sie damit HTTP-Anfragen stellen. Hier ist ein Beispiel dafür, wie man eine GET-Anfrage stellt:

import requests

response = requests.get('https://www.baidu.com')
print(response.text)

In diesem Beispiel importieren wir die Anforderungsbibliothek und verwenden dann die get-Methode, um eine GET-Anfrage an https://www.baidu.com zu stellen. Die Antwort des Servers wird in der Antwortvariablen gespeichert und wir geben den Antworttext an die Konsole aus.

Sie können auch Parameter an die get-Methode übergeben, um Abfrageparameter in die Anfrage einzuschließen:

import requests

params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://www.example.com', params=params)
print(response.url)

In diesem Beispiel übergeben wir ein Wörterbuch mit Abfrageparametern an den params-Parameter der get-Methode. Die generierte URL enthält Abfrageparameter und wir geben die URL an die Konsole aus.

Sie können auch die Post-Methode verwenden, um POST-Anfragen zu stellen:

import requests

data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('https://www.example.com', data=data)
print(response.text)

In diesem Beispiel übergeben wir ein Wörterbuch mit Daten an den Datenparameter der Post-Methode. Die Daten werden im Hauptteil der Anfrage gesendet und wir geben den Antworttext an die Konsole aus.

Entwickeln Sie Ihre eigene Übersetzungsschnittstelle

Analysieren Sie die Baidu-Übersetzung

Öffnen Sie die Baidu-Übersetzungsadresse, drücken Sie dann F12, um den Entwicklermodus zu öffnen, geben Sie den übersetzten Inhalt ein, klicken Sie auf Übersetzen, Sie können ihn deutlich durchschauen das Bild unten Angeforderte Adresse und angeforderte ParameterF12打开开发者模式,输入翻译的内容,点击翻译,通过下图,可以清楚看到请求的地址和请求的参数

So verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren

百度翻译通过向https://fanyi.baidu.com/v2transapi发送post请求,发送的数据中只有sign是不断变化的,搜索v2transapi发现sign字段是通过js通过你要发送的数据字符串进行加密得到的。

So verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren

通过百度翻译的js分析得出加密的关键代码如下:

So verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren

现在已经搞清楚了整个调用的流程,所有的参数都可以自己构造。这样就可以写代码了。

写接口代码

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方法的参数。

调用成功后,返回如下:

So verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren

3、获取token值,通过观察百度翻译页面的源码,发现token是存放在页面中的,这样我们就可以通过请求页面获取到token.

So verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren

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")

请求成功后,会返回如下图:

So verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren

通过实际的调用中发现不是每次请求成功的,所以需要多次进行请求,通过一个循环操作,当清楚成功就跳出循环,关键代码如下:

        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

Wie verwendet Python die Anforderungsbibliothek, um „Implementieren Sie die Übersetzungsschnittstelle“ />🎜🎜Baidu Translation sendet eine Post-Anfrage an https://fanyi.baidu.com/v2transapi. Nur das Vorzeichen in den gesendeten Daten ändert sich ständig. Durchsuchen Sie v2transapi und stellen Sie fest, dass das Vorzeichenfeld die Daten sind Zeichenfolge, die Sie über js senden möchten. Durch Verschlüsselung erhalten. 🎜🎜<img src=🎜 🎜über Baidu Translate Die js-Analyse zeigt, dass der Schlüsselcode für die Verschlüsselung wie folgt lautet: 🎜🎜🎜🎜Jetzt haben wir den gesamten Aufrufprozess herausgefunden und alle Parameter können selbst erstellt werden. Auf diese Weise können Sie Code schreiben. 🎜🎜Schnittstellencode schreiben🎜🎜1. Um Anforderungsfehler zu verhindern, müssen wir Browseranforderungen nachahmen und Anforderungsheader hinzufügen, wenn wir Anforderungen stellen. Wir verwenden die Drittanbieterbibliothek fake_useragent, um zufällig verschiedene Benutzeragent. Der Schlüsselcode lautet wie folgt: 🎜
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("你好")
🎜2. Da wir den verschlüsselten js-Code nicht verstehen können, rufen wir den Drittanbieter von python direkt auf Die Bibliothek führt js-Code aus. Sie müssen die execjs-Bibliothek vor der Verwendung installieren. Führen Sie den folgenden Code aus: 🎜rrreee🎜Die Methode zur Verwendung dieser Bibliothek ist ebenfalls Sehr einfach. Oben haben wir beispielsweise den verschlüsselten js-Code eingefügt, eine neue js-Datei erstellt und den Inhalt hineinkopiert . Der Schlüsselcode lautet wie folgt: 🎜rrreee🎜Lesen Sie zuerst die js-Datei in den Cache und rufen Sie dann das Objekt über execjs auf. Schließlich wird die Methode in der Datei js durch Aufrufen der Methode call ausgeführt, wobei b die Methode ist, die js entspricht. code>, query ist der Parameter der b-Methode in js. 🎜🎜Nachdem der Anruf erfolgreich war, lautet die Rückgabe wie folgt:🎜🎜Anleitung Verwenden Sie die Anforderungsbibliothek, um die Übersetzung in der Python-Schnittstelle zu implementieren > wird auf der Seite gespeichert, sodass wir die Seite Get <code>token</code> anfordern können.🎜🎜<img src=🎜rrreee🎜4. Bisher sind alle Anforderungsparameter verfügbar, sodass wir mit der Erstellung der Anforderung beginnen können. Der Kerncode lautet wie folgt: 🎜rrreee🎜Nach erfolgreicher Anfrage wird das folgende Bild zurückgegeben: 🎜🎜 Wie verwendet Python die Anforderungsbibliothek, um die Übersetzungsschnittstelle zu implementieren?“ />🎜🎜Durch den tatsächlichen Aufruf wird festgestellt, dass nicht jede Anforderung erfolgreich ist, sodass mehrere Anforderungen über eine Schleifenoperation gestellt werden müssen. Wenn klar ist, dass es erfolgreich ist, wird die Schleife übersprungen. Der Schlüsselcode lautet wie folgt: 🎜rrreee🎜Auf diese Weise haben wir die Verwendung der Baidu-Übersetzungsschnittstelle abgeschlossen, um unseren eigenen Übersetzungsschnittstellenaufruf durchzuführen. Mit <code>Flask</code> oder <code>Fastapi</code> können Sie API-Schnittstellen nach Ihren eigenen Bedürfnissen entwickeln. Nachfolgend finden Sie alle Codes 🎜rrreee

Das obige ist der detaillierte Inhalt vonSo verwenden Sie die Anforderungsbibliothek, um die Übersetzungsschnittstelle in Python zu implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen