首页 新闻 会员 周边 捐助

爬虫 使用有道的翻译 实现实时翻译时 遇到的问题

0
[待解决问题]

先看代码
import requests
import json

# 伪装UA
head = {
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive',
    'Content-Length': '237',
    'Cookie': 'OUTFOX_SEARCH_USER_ID=2124447499@10.169.0.84; OUTFOX_SEARCH_USER_ID_NCOO=2140051262.0271645; JSESSIONID=abc4vTx_JMIIJ8br8NOLx; ___rl__test__cookies=1620963482450',
    'Host': 'fanyi.youdao.com',
    'Origin': 'https://fanyi.youdao.com',
    'Referer': 'https://fanyi.youdao.com/',
    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
    'sec-ch-ua-mobile': '?0',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 FS',
    'X-Requested-With': 'XMLHttpRequest'
}
url = 'https://fanyi.youdao.com/'
post_url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
# 处理url的参数
word = input("enter a word:")
data = {
    'i': word,
    'from': 'AUTO',
    'to': 'AUTO',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '16209634824560',
    'sign': 'e5f972b3408ecc85a3a5a988c4903d37',
    'lts': '1620963482456',
    'bv': '9ff8102373b1562471f4b6881a5653e9',
    'doctype': 'json',
    'version': ' 2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME'
}
response = requests.post(post_url, data=data, headers=head)
# 使用json获取数据 
# json返回的是对象数据
dic_obj = response.json()
print(dic_obj)
# print(dic_obj['translateResult'][0])
# 持久化存储
fileName = word + '.json'
fp = open(fileName, 'w', encoding='utf-8')
json.dump(dic_obj, fp=fp, ensure_ascii=False)

fp.close()

print('Over!!')

翻译句子时提示的错误

单翻译单词时就能翻译

有没有大佬能帮忙看看是怎么回事

木三136的主页 木三136 | 初学一级 | 园豆:159
提问于:2021-05-14 17:26

返回的json格式改成文本格式试试

属于自己的世界 3年前
< >
分享
所有回答(3)
0

把json格式改成文本格式看看

吾言! | 园豆:208 (菜鸟二级) | 2021-05-18 18:53

首先感谢您的回答,不知道您说的是进行持久化存储的文件格式吗?
您可能弄错了我出现的问题,是在使用爬虫翻译句子时获得的json文件中是没有内容的,而翻译单词时获得的json文件中是有内容的,您能帮吗看看嘛

支持(0) 反对(0) 木三136 | 园豆:159 (初学一级) | 2021-05-18 19:04

@木三136: 那是有道翻译不出来吧,你可以考虑用下谷歌翻译

支持(0) 反对(0) AllanGuan | 园豆:200 (初学一级) | 2021-05-20 16:21

@AllanGuan: 不是的 是可以翻译出来的 只是爬下来的json中是错误的 但是网页的json文件中是有正确的翻译的 您可以帮忙看看嘛 而且我之前用的百度翻译也是这个情况

支持(0) 反对(0) 木三136 | 园豆:159 (初学一级) | 2021-05-20 16:38

@木三136: 其实我就是一个菜鸟,看到这个问题,试着回答一下,我搞不定

支持(0) 反对(0) 吾言! | 园豆:208 (菜鸟二级) | 2021-05-22 10:36
0

不是单翻译单词可以翻译,句子不行。是这个写死参数只能翻译你最初输入的那个单词,你换别的单词也不行的。你多看几个请求,salt、sign、lts都是在变的。你的参数不对,有道返回给你的就是{'errorCode': 50}

Masako | 园豆:1893 (小虾三级) | 2021-05-20 17:07

首先感谢您的回答 您说的是对的 的确是只能翻译同一个单词
我又简单写了一个 调用的是百度翻译的接口 您能在帮忙看看嘛 写的比较匆忙 望谅解

    import requests
    import json
    #伪装UA
    head={
        'user_agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'}
    url='https://www.baidu.com/s'
    post_url='https://fanyi.baidu.com/sug'
    #处理url的参数
    word=input("enter a word:")
    data={
        'kw':word
    }
    response=requests.post(post_url,data=data,headers=head)
    #使用json获取数据 
    #json返回的是对象数据
    dic_obj=response.json()
    print(dic_obj['data'][0]['v'])
    print(type(dic_obj))
    #持久化存储
    fileName=word+'.json'
    fp=open(fileName,'w',encoding='utf-8')
    json.dump(dic_obj,fp=fp,ensure_ascii=False)
    # fp.close()
    print('Over!!')

目前只能翻译单词 不能翻译句子 您能帮忙看下吗

支持(0) 反对(0) 木三136 | 园豆:159 (初学一级) | 2021-05-20 17:25

@木三136: 你这个sug的链接,确实翻译单词没问题,翻译句子的时候会重定向到https://fanyi.baidu.com/v2transapi?from=en&to=zh这里,这个里面才有数据的,你注意一下你的请求流里面的这个链接。

支持(0) 反对(0) Masako | 园豆:1893 (小虾三级) | 2021-05-20 18:07

@Masako: 是的 您说的对 这是完善了一下的 代码 您能再看看不 谢谢啦

    import requests
    import json
    #伪装UA
    head={


        'Accept': '*/*',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Content-Length': '143',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': 'BIDUPSID=118D1A9A3D9CACD6F22131CC09A4D46E; PSTM=1613702320; BAIDUID=118D1A9A3D9CACD61F1A245E26BCF4DD:FG=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; SOUND_SPD_SWITCH=1; HISTORY_SWITCH=1; SOUND_PREFER_SWITCH=1; MCITY=-151%3A; __yjs_duid=1_aa7e348879236beb1ae2bbbac09356591618962380675; H_WISE_SIDS=110085_127969_131423_154619_165136_169066_169648_169772_170704_170817_170935_171235_171710_172466_172897_173032_173045_173124_173414_173574_173602_173610_173612_173625_173922_174199_174263_174433_174470_174519_174771_174806_174856; BDUSS=N-ZFFjUHBiNEEzZ3NxQnp-NFhqd3Q4OXQ5UX5-aGxzZU5RT3R3bHpPb1BxckZnRVFBQUFBJCQAAAAAAAAAAAEAAADS2F3SxL7I~TEzNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8dimAPHYpgRH; BDUSS_BFESS=N-ZFFjUHBiNEEzZ3NxQnp-NFhqd3Q4OXQ5UX5-aGxzZU5RT3R3bHpPb1BxckZnRVFBQUFBJCQAAAAAAAAAAAEAAADS2F3SxL7I~TEzNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8dimAPHYpgRH; BCLID_BFESS=12021804533830897837; BDSFRCVID_BFESS=-l4OJeCmHC9W4JQeZRJ8UwMavmKK0gOTHbucICHypIqcgD4VJeC6EG0Ptf8g0Ku-cAmKogKK0gOTH6KF_2uxOjjg8UtVJeC6EG0Ptf8g0M5; H_BDCLCKID_SF_BFESS=tR4HoILKJCK3f-opMtI_KJLH-qKX5-RLf-jQ_p7F5lOVOh8w3TOk0tLl04COLRbuK6cLahkM5h7xOboG-UrTybFQyqQ2KM0JQeQ-5KQN3KJmfbL9bT3v5DuSLfci2-biWbRM2MbdJqvP_IoG2Mn8M4bb3qOpBtQmJeTxoUJ25DnJhhCGe4bK-TrLeHLfJM5; DOUBLE_LANG_SWITCH=1; H_PS_PSSID=33839_33815_31660_33848_33675_33607_26350; BAIDUID_BFESS=118D1A9A3D9CACD61F1A245E26BCF4DD:FG=1; delPer=0; PSINO=1; BA_HECTOR=85840h2ga10g80059v1gacaib0r; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1619507747,1620962880,1621330974,1621502547; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1621502547; __yjs_st=2_NmM5MWRmZGUzZWVjNDExNWRjMzJjOGEzYjBjOWZmMDg4Yzc3NjA0MjY0OGMxYTllMWY4YjRkN2NjOWYxOTg0YzFlNGNhYTY1ZmFiNzkzZDUwMzhlM2IwMTQzZDIzOWIxMTdmYWMyNTg4YzE3NGY0MWJhNTQ3ZDViMTFmZTAxNjQyYjk5ZjRmYTc1NDZmMWRmYWViN2FjMTY4OGIwZjhlNjhhZWJlZmEzMWMyNTQ0ZWU3MjBkMDQyNjhmYzJiYTI3OWNkYWNmY2I3ZjA3NWM4Njg4ZDI5ZWMyNDI0MmI0MGVjNDQ2ZTU5ZGFjZThhMDUwN2EyMzZjN2IwYTcyZTJjZl83XzQ5M2I3OTFj; ab_sr=1.0.0_OGZiZDJkOTk2OGI0MjViMjYyOGQ3MWVjZjAyMDVmNDY2N2FmNmExZjgyMzNmOGM1YWFkZTExYzFmYjNiNTU4ZmIyZjk4OWEyYjczZjQ3MzM1MDExYTcwNWE0NDEwYzU2',
        'Host': 'fanyi.baidu.com',
        'Origin': 'https://fanyi.baidu.com',
        'Referer': 'https://fanyi.baidu.com/translate?aldtype=16047&query=i+am+student%0D%0A&keyfrom=baidu&smartresult=dict&lang=auto2zh',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"',
        'sec-ch-ua-mobile': '?0',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 FS',
        'X-Requested-With': 'XMLHttpRequest'

    }
    url='https://www.baidu.com/s'
    post_url='https://fanyi.baidu.com/v2transapi?from=en&to=zh'
    #处理url的参数
    word=input("enter a word:")
    data={
        'from': 'en',
        'to': 'zh',
        'query': word,
        'transtype': 'realtime',
        'simple_means_flag': '3',
        'sign': '676245.963236',
        'token': 'b5e64505da6a06b2eef888dad2d15dae',
        'domain': 'common'
    }
    response=requests.post(post_url,data=data,headers=head)
    #使用json获取数据 
    #json返回的是对象数据
    dic_obj=response.json()
    print(dic_obj)
    #         print(dic_obj['data'][0]['v'])
    #         print(type(dic_obj))
    #持久化存储
    fileName=word+'.json'
    fp=open(fileName,'w',encoding='utf-8')
    json.dump(dic_obj,fp=fp,ensure_ascii=False)

    # fp.close()

    print('Over!!')

另外 这个代码目前有个问题就是 只能翻译某一个句子 检查发现是 sign: 676245.963236 的参数的问题 这几个数字指的是什么目前还没发现 您再看看

支持(0) 反对(0) 木三136 | 园豆:159 (初学一级) | 2021-05-20 19:19

@木三136: 这个一般是网站自己计算的,用于验证的,你得知道他的算法,再根据你的参数去计算

支持(0) 反对(0) Masako | 园豆:1893 (小虾三级) | 2021-05-21 10:29

@Masako: 通过阅读百度翻译提供的API文档,发现sign是一段32位的数字签名 但是需要使用百度给的密匙
这是百度翻译的原文字说明:
生成方法:
Step1. 将请求参数中的 APPID(appid), 翻译query(q, 注意为UTF-8编码), 随机数(salt), 以及平台分配的密钥(可在管理控制台查看) 按照 appid+q+salt+密钥的顺序拼接得到字符串1。
Step2. 对字符串1做md5,得到32位小写的sign。

支持(0) 反对(0) 木三136 | 园豆:159 (初学一级) | 2021-05-21 11:01

这是不是意味着 通过使用百度的API和自己爬 产生sign 所使用的是两种算法
这是不是表示不太可能自己找到生成sign的方法了
您有什么意见或建议吗

支持(0) 反对(0) 木三136 | 园豆:159 (初学一级) | 2021-05-21 11:04
0

这个是有道翻译做了反爬虫策略,除非破解他的加密算法,不然的话,可能不行

likey66 | 园豆:202 (菜鸟二级) | 2021-06-08 17:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册