python 爬虫 百度翻译 json()报错


import requests
if __name__ =="__main__":
    post_url='https://fanyi.baidu.com/v2transapi?from=en&to=zh'
    translation=input('请问您的要翻译的英文为:')
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
    }
    data={
        'from': 'en',
        'to': 'zh',
        'query':translation,
        'simple_means_flag': '3',
        'sign': '871501.634748',
        'token': 'a96496fe5d184896b689d4f248a711cb',
        'domain':'common'
    }
    params={
        'from': 'en',
        'to': 'zh'
    }
    response=requests.post(url=post_url,data=data,headers=headers,params=params)
    dic_obj=response.json()
    print(dic_obj)

报错内容为:
{'errno': 997, 'errmsg': '未知错误', 'query': 'dog', 'from': 'en', 'to': 'zh', 'error': 997}
请问是有什么反爬吗?

img

img


这是找到的目标页面

百度翻译有对应的免费API
https://fanyi.baidu.com/home
在下面链接注册申请即可使用


import json
import random
import hashlib
from urllib import parse
import http.client

class BaiduTranslate:
    def __init__(self,fromLang,toLang):
        self.url = "/api/trans/vip/translate"
        self.appid="***" #申请的账号
        self.secretKey = '***'#账号密码
        self.fromLang = fromLang
        self.toLang = toLang
        self.salt = random.randint(32768, 65536)

    def BdTrans(self,text):
        sign = self.appid + text + str(self.salt) + self.secretKey
        md = hashlib.md5()
        md.update(sign.encode(encoding='utf-8'))
        sign = md.hexdigest()
        myurl = self.url + \
                '?appid=' + self.appid + \
                '&q=' + parse.quote(text) + \
                '&from=' + self.fromLang + \
                '&to=' + self.toLang + \
                '&salt=' + str(self.salt) + \
                '&sign=' + sign
        try:
            httpClient = http.client.HTTPConnection('api.fanyi.baidu.com')
            httpClient.request('GET', myurl)
            response = httpClient.getresponse()
            html = response.read().decode('utf-8')
            html = json.loads(html)
            dst = html["trans_result"][0]["dst"]
            return  True , dst
        except Exception as e:
            return False , e
if __name__=='__main__':
    BaiduTranslate_test = BaiduTranslate('zh','en')
    Results = BaiduTranslate_test.BdTrans("你好,世界!")#要翻译的词组
    print(Results)

img

有帮助请点一下右上角的采纳,谢谢

img

from tkinter import *
from urllib import request
from urllib import parse
import json
import hashlib
import random
import time
def translate_Word(en_str):
global result
# time.sleep(3)
URL = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
#en_str=input("请输入要翻译的内容:")
#创建Form_Data字典,存储向服务器发送的Data
#Form_Data={'from':'en','to':'zh','query':en_str,'transtype':'hash'}
Form_Data = {}
Form_Data['from'] = 'en'
Form_Data['to'] = 'zh'
Form_Data['q'] = en_str #要翻译数据
Form_Data['transtype'] = 'hash'
Form_Data['appid'] = '20151113000005349' #申请的APP ID
Form_Data['salt'] = str(random.randint(32768, 65536)) #随机数
Key="osubCEzlGjzvw8qdQc41" #平台分配的密钥
m=Form_Data['appid']+en_str+Form_Data['salt']+Key
m_MD5 = hashlib.md5(m.encode('utf8'))
Form_Data['sign'] = m_MD5.hexdigest()
time.sleep(1)
data = parse.urlencode(Form_Data).encode('utf-8')
# time.sleep(3)#使用urlencode方法转换标准格式
response = request.urlopen(URL,data)

#传递Request对象和转换完格式的数据
html = response.read().decode('utf-8')              #读取信息并解码
translate_results = json.loads(html)                #使用JSON
print(translate_results)                         #打印出JSON数据
try:
    translate_results = translate_results['trans_result'][0]['dst']    #找到翻译结果
    print("翻译的结果是:%s" % translate_results)  # 打印翻译信息
    result=translate_results
except:
    translate_Word(en_str)
# finally:
#     return  translate_results

def leftClick(event):
global result
#翻译按钮事件函数
#print( "x轴坐标:", event.x)
#print( "y轴坐标:", event.y)
en_str=Entry1.get() #获取要翻译的内容
print(en_str)

vText=translate_Word(en_str)

translate_Word(en_str)
#Entry2.config(Entry2,text=vText) #修改提示标签文字
s.set("")
Entry2.insert(0,result)
def leftClick2(event): #清空按钮事件函数
s.set("")
#Entry2.config(Entry2,text=vText) #修改提示标签文字
Entry2.insert(0,"")

if name == "main":
result=""
root = Tk()
root.title("单词翻译器")
root['width']=250;root['height']=130
Label(root,text = '输入要翻译的内容:',width=15).place(x=1,y=1) #绝对坐标(1,1)
Entry1=Entry(root,width=20)
Entry1.place(x=110,y=1) #绝对坐标(110,1)
Label(root,text = '翻译的结果:',width=18).place(x=1,y=20) #绝对坐标(1,20)
s=StringVar() #一个StringVar()对象
s.set("")
Entry2=Entry(root,width=20,textvariable=s)
Entry2.place(x=110,y=20) #绝对坐标(110,20)

Button1=Button(root,text = '翻译',width=8)
Button1.place(x=40,y=80)    #绝对坐标(40,80)
Button2=Button(root,text = '清空',width=8)
Button2.place(x=110,y=80)   #绝对坐标(110,80)
#给Label绑定鼠标监听事件
Button1.bind("<Button-1>",leftClick)                  #翻译按钮
Button2.bind("<Button-1>",leftClick2)                 #清空按钮
root.mainloop()

百度有加密.https://mp.weixin.qq.com/s/li_UBzEUvLmaL207eFhyvw 看这个文字.详细介绍了