파이썬에서 요청 라이브러리를 사용하려면 먼저 pip를 사용하여 설치해야 합니다. 터미널에서 다음 명령을 실행하면 됩니다.
pip install requests
라이브러리를 설치한 후 이를 사용하여 HTTP 요청을 할 수 있습니다. 다음은 GET 요청을 만드는 방법에 대한 예입니다.
import requests response = requests.get('https://www.baidu.com') print(response.text)
이 예에서는 요청 라이브러리를 가져온 다음 get 메서드를 사용하여 https://www.baidu.com에 대한 GET 요청을 만듭니다. 서버의 응답은 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
를 눌러 개발자 모드를 열고 번역된 내용을 입력하고 번역을 클릭하면 명확하게 볼 수 있습니다. 아래 그림 요청된 주소와 요청된 매개변수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
js
분석 결과 암호화 키 코드는 다음과 같습니다. 🎜🎜🎜🎜이제 전체 호출 프로세스를 파악했으며 모든 매개변수를 직접 구성할 수 있습니다. 이렇게 하면 코드를 작성할 수 있습니다. 🎜🎜인터페이스 코드 작성🎜🎜1. 요청 실패를 방지하려면 요청 시 타사 라이브러리 fake_useragent
를 사용하여 브라우저 요청을 모방하고 요청 헤더를 추가해야 합니다. 코드> 사용자 에이전트. 키 코드는 다음과 같습니다. 🎜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("你好")
sign
매개변수를 생성합니다. 암호화된 js
코드를 이해할 수 없기 때문에 python의 제3자를 직접 호출합니다.
라이브러리는 js
코드를 실행합니다. 사용하기 전에 execjs
라이브러리를 설치해야 합니다. 🎜rrreee🎜이 라이브러리를 사용하는 방법도 있습니다. 예를 들어 위에서는 Baidu의 암호화된 js
코드가 추출되었고 새로운 js
파일이 생성되었으며 내용이 여기에 복사되었습니다. . 키 코드는 다음과 같습니다. 🎜rrreee🎜먼저 js 파일을 캐시로 읽어온 후 execjs
를 통해 객체를 호출합니다. 마지막으로 js
파일의 메서드는 call
메서드를 호출하여 실행됩니다. 여기서 b
는 js에 해당하는 메서드입니다. code>, query
는 js
의 b
메소드 매개변수입니다. 🎜🎜통화 성공 후 반환은 다음과 같습니다.🎜🎜🎜🎜3. token
값을 얻습니다. Baidu 번역 페이지의 소스 코드를 관찰하여 token
이 페이지에 저장되어 Get token
페이지를 요청할 수 있습니다.🎜🎜🎜rrreee🎜4. 지금까지 모든 요청 매개변수를 사용할 수 있으므로 요청 구성을 시작할 수 있습니다. 핵심 코드는 다음과 같습니다. 🎜rrreee🎜요청이 성공하면 다음 이미지가 반환됩니다. 🎜🎜🎜🎜실제 호출을 통해 모든 요청이 성공하는 것은 아니므로 루프 작업을 통해 여러 요청을 수행해야 함을 알 수 있습니다. 성공이 확실하면 루프가 튀어나옵니다. 핵심 코드는 다음과 같습니다. 🎜 rrreee🎜 이로써 Baidu 번역 인터페이스를 사용하여 자체 번역 인터페이스 호출을 완료했습니다. Flask
또는 Fastapi
를 사용하여 필요에 따라 API 인터페이스를 개발할 수 있습니다. 아래는 모든 코드입니다 🎜rrreee위 내용은 요청 라이브러리를 사용하여 Python에서 번역 인터페이스를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!