鱼C论坛

 找回密码
 立即注册
查看: 1439|回复: 11

[已解决]利用requests库来实现访问有道词典的问题

[复制链接]
发表于 2019-10-21 19:49:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位好,之前看了小甲鱼的视频,他用 urllib 访问了有道,并将有道“搬”到了本地,可以实现远程查词或翻译句子,现在打算用 requests 库来代替,本以为很轻松的事情,一下子折腾了很久,废话不多说,直接上代码。

  1. #coding=utf-8

  2. import requests
  3. import json
  4. import random
  5. import time

  6. while True :
  7.         inputContent = str(input('请输入需要翻译的内容:'))
  8.         if inputContent == 'q!' :
  9.                 break
  10.         url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
  11.         headers = {
  12.                 'User-Agent': 'Chrome/70.0.3538.110 (Windows NT 6.1; WOW64)'
  13.         }
  14.         dict1 = {
  15.                 'i': inputContent,
  16.                 'doctype': 'json'
  17.         }
  18.         response = requests.post(url, headers=headers, data=json.dumps(dict1))
  19.         htm = response.json()
  20.         # print(htm)

  21.         target = json.loads(htm)
  22.         print("翻译结果:%s" % (target['translateResult'][0][0]['tgt']))
  23.         time.sleep(int(random.uniform(5, 9)))
复制代码


以上代码中,dict1 是作为 data 参数传入的,但是由于是以 post 方式提交数据,所以这里用 json 的 dumps 方法进行了封装。(虽然字典中只有两个参数,但是亲测,没有问题)
第 21 行的代码,response 试过用 content,text,json() 三个方法,但是都没用,打印出来的结果都是整面网页的源代码。
不知道是不是我理解的问题,还是整个用法都弄错了,感觉这里无论如何都不会反悔 json 格式的响应信息;同时,利用 post 方法提交了信息后,有道上面也没有将翻译结果显示出来(打印的结果中未见提交结果和翻译结果)。
在此请教各位鱼油的指点,请各位不吝赐教,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-21 21:13:10 | 显示全部楼层    本楼为最佳答案   
参考我的帖子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 21:46:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-21 22:57:17 | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2019-10-21 23:57 编辑

dict1不用你去封装,直接赋值给data

  1. #coding=utf-8

  2. import requests
  3. import random
  4. import time

  5. while True :
  6.     inputContent = str(input('请输入需要翻译的内容:'))
  7.     if inputContent == 'q!' :
  8.         break
  9.     url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
  10.     headers = {
  11.         'User-Agent': 'Chrome/70.0.3538.110 (Windows NT 6.1; WOW64)'
  12.     }
  13.     dict1 = {
  14.         'i': inputContent,
  15.         'doctype': 'json'
  16.     }
  17.     response = requests.post(url, headers=headers, data=dict1)
  18.     target = response.json()
  19.     # print(target)

  20.     print("翻译结果:%s" % (target['translateResult'][0][0]['tgt']))
  21.     time.sleep(int(random.uniform(5, 9)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-22 10:52:32 | 显示全部楼层
#使用requests的方法
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

while True:
    content = input('请输入你要翻译的内容:')
    if content == 'q!':
        break
    data = {}
    data['i'] = content
    data['from'] = 'AUTO'
    data['to'] = 'AUTO'
    data['smartresult'] = 'dict'
    data['client'] = 'fanyideskweb'
    #salt: 15690563557822
    #sign: 4c6a235afc919e936df31f097690eb44
    #ts: 1569056355782
    #bv: a4f4c82afd8bdba188e568d101be3f53
    data['doctype'] = 'json'
    data['version'] = '2.1'
    data['keyfrom'] = 'fanyi.web'
    data['action'] = 'FY_BY_REALTlME'
    '''
    html = requests.get(url)
    html_bytes = html.content
    html_str = html_bytes.decode()
    print(html_str)
    '''
    html_formdata = requests.post(url,data=data).content.decode()
    target = json.loads(html_formdata)
    #html_formdata = requests.post(url,json=data).content.decode()  #有些网页是json格式
    for i in range(len(target['translateResult'][0])):
        print('\n','target: %s'%(target),'\n','\n','翻译结果是:%s'%target['translateResult'][0][i]['tgt'],'\n')
    time.sleep(5)   #延迟5s再进入下一次循环



data表格有哪些是非必须的你可以多试几次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-22 10:53:08 | 显示全部楼层

谢谢大神指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-22 10:53:21 | 显示全部楼层
  1. #使用requests的方法
  2. url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'

  3. while True:
  4.     content = input('请输入你要翻译的内容:')
  5.     if content == 'q!':
  6.         break
  7.     data = {}
  8.     data['i'] = content
  9.     data['from'] = 'AUTO'
  10.     data['to'] = 'AUTO'
  11.     data['smartresult'] = 'dict'
  12.     data['client'] = 'fanyideskweb'
  13.     #salt: 15690563557822
  14.     #sign: 4c6a235afc919e936df31f097690eb44
  15.     #ts: 1569056355782
  16.     #bv: a4f4c82afd8bdba188e568d101be3f53
  17.     data['doctype'] = 'json'
  18.     data['version'] = '2.1'
  19.     data['keyfrom'] = 'fanyi.web'
  20.     data['action'] = 'FY_BY_REALTlME'
  21.     '''
  22.     html = requests.get(url)
  23.     html_bytes = html.content
  24.     html_str = html_bytes.decode()
  25.     print(html_str)
  26.     '''
  27.     html_formdata = requests.post(url,data=data).content.decode()
  28.     target = json.loads(html_formdata)
  29.     #html_formdata = requests.post(url,json=data).content.decode()  #有些网页是json格式
  30.     for i in range(len(target['translateResult'][0])):
  31.         print('\n','target: %s'%(target),'\n','\n','翻译结果是:%s'%target['translateResult'][0][i]['tgt'],'\n')
  32.     time.sleep(5)   #延迟5s再进入下一次循环

复制代码


data表格有很多是非必须的你可以多试几次
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-22 10:54:49 | 显示全部楼层
XiaoPaiShen 发表于 2019-10-21 22:57
dict1不用你去封装,直接赋值给data

谢谢,这里确实不用封装,不过核心问题除了这一个地方,还有就是后面第 25 行代码也要取消,因为使用了响应的 json 解析,所以不用再去 json.loads() 一遍了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-22 13:34:43 From FishC Mobile | 显示全部楼层
foxiangzun 发表于 2019-10-22 10:54
谢谢,这里确实不用封装,不过核心问题除了这一个地方,还有就是后面第 25 行代码也要取消,因为使用了响 ...

我在代码中直接改了,要不然代码不可能运行结果正确。json模块的引用也去掉了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-22 13:41:33 | 显示全部楼层
XiaoPaiShen 发表于 2019-10-22 13:34
我在代码中直接改了,要不然代码不可能运行结果正确。json模块的引用也去掉了。

恩,发现了,确实不需要再用 json 去解析一遍,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-22 13:42:24 | 显示全部楼层
niuthon 发表于 2019-10-22 10:53
data表格有很多是非必须的你可以多试几次

尝试过了,和 data 部分无关,主要是 data 封装的时候不需要用 json 格式去刻意封装,解析的到时候也不需要引用 json 的解析方式。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-22 15:24:28 | 显示全部楼层
foxiangzun 发表于 2019-10-22 13:42
尝试过了,和 data 部分无关,主要是 data 封装的时候不需要用 json 格式去刻意封装,解析的到时候也不需 ...

是的,我的列子里面也没有用json,下面还有一行注释。这个是以前我练习的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 02:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表