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
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.
Ö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
打开开发者模式,输入翻译的内容,点击翻译,通过下图,可以清楚看到请求的地址和请求的参数
百度翻译通过向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
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 < zu generieren code>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={ '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("你好")
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:🎜🎜🎜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: 🎜🎜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!