先看代码
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!!')
翻译句子时提示的错误
单翻译单词时就能翻译
有没有大佬能帮忙看看是怎么回事
把json格式改成文本格式看看
首先感谢您的回答,不知道您说的是进行持久化存储的文件格式吗?
您可能弄错了我出现的问题,是在使用爬虫翻译句子时获得的json文件中是没有内容的,而翻译单词时获得的json文件中是有内容的,您能帮吗看看嘛
@木三136: 那是有道翻译不出来吧,你可以考虑用下谷歌翻译
@AllanGuan: 不是的 是可以翻译出来的 只是爬下来的json中是错误的 但是网页的json文件中是有正确的翻译的 您可以帮忙看看嘛 而且我之前用的百度翻译也是这个情况
@木三136: 其实我就是一个菜鸟,看到这个问题,试着回答一下,我搞不定
不是单翻译单词可以翻译,句子不行。是这个写死参数只能翻译你最初输入的那个单词,你换别的单词也不行的。你多看几个请求,salt、sign、lts都是在变的。你的参数不对,有道返回给你的就是{'errorCode': 50}
首先感谢您的回答 您说的是对的 的确是只能翻译同一个单词
我又简单写了一个 调用的是百度翻译的接口 您能在帮忙看看嘛 写的比较匆忙 望谅解
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!!')
目前只能翻译单词 不能翻译句子 您能帮忙看下吗
@木三136: 你这个sug的链接,确实翻译单词没问题,翻译句子的时候会重定向到https://fanyi.baidu.com/v2transapi?from=en&to=zh这里,这个里面才有数据的,你注意一下你的请求流里面的这个链接。
@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 的参数的问题 这几个数字指的是什么目前还没发现 您再看看
@木三136: 这个一般是网站自己计算的,用于验证的,你得知道他的算法,再根据你的参数去计算
@Masako: 通过阅读百度翻译提供的API文档,发现sign是一段32位的数字签名 但是需要使用百度给的密匙
这是百度翻译的原文字说明:
生成方法:
Step1. 将请求参数中的 APPID(appid), 翻译query(q, 注意为UTF-8编码), 随机数(salt), 以及平台分配的密钥(可在管理控制台查看) 按照 appid+q+salt+密钥的顺序拼接得到字符串1。
Step2. 对字符串1做md5,得到32位小写的sign。
这是不是意味着 通过使用百度的API和自己爬 产生sign 所使用的是两种算法
这是不是表示不太可能自己找到生成sign的方法了
您有什么意见或建议吗
这个是有道翻译做了反爬虫策略,除非破解他的加密算法,不然的话,可能不行
返回的json格式改成文本格式试试
– 属于自己的世界 3年前