爬虫 - 使用金山翻译 API

2019-08-16  本文已影响0人  Vector_Wan

回头再看这篇好久之前写的文章,我觉得有必要再加一点什么了。要强调“版权意识”,我们在使用别人的接口的时候一定要注意这个接口你是否有权利使用。本文使用的接口仅作为学习练习使用,不要将这个接口用于收费软件的编写中。

一直在学理论,今天实在看不下去了,还是实际操作一波吧,

今天我们来研究研究接口,如果你的程序里面想要使用翻译的功能就可以使用这篇文章介绍的小技巧实现。

我们先来找金山的这个翻译接口,接口可不会直接给你,我们需要到它的源码中找一下,我们先访问金山翻译的页面:http://fy.iciba.com/

然后右键检查,依次点击 Network 、清空, 输入要查询的文字,点击翻译,这时候我们就会发现请求列表中出现了一个 ajax 请求,它所对应的 URl 就是我们想要的。

我们继续往下翻可以找到需要传递的数据,还有我们浏览器对应的版本。

因为你翻译完上面的地址栏里面的地址并没有变化,可以推断出来这是一个 POST 请求。所以我们只需要使用 POST 请求向 http://fy.iciba.com/ajax.php?a=fy 发送 f、t、w 这三个参数就可以,后来根据推断可以发现 f 是起始语言 t 是翻译语言 w 就是我们要翻译的词或者句子。

我们现在应该很容易就写出请求数据的部分,我们直接让程序打印出来看看我们获得了什么,

# @Time   : 2019/8/13 17:02
# @Author : Vector_Wan
# @Email  : 995626309@qq.com
# File    : JinShan.py
# Software: PyCharm
import requests
import sys

class JinShan:
    def __init__(self):
        self.url = 'http://fy.iciba.com/ajax.php?a=fy'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest'
        }

    def get_data(self, word):
        data = {
            'f':'auto',
            't':'auto',
            'w':word
        }
        r = requests.post(self.url, headers=self.headers, data=data)
        print(r.text)

if __name__ == '__main__':
    jianshan = JinShan()
    word = sys.argv[1]
    jianshan.get_data(word)

因为我们使用了 sys.argv 所以需要在终端里面运行,运行过程及结果如下:

>>> (venv) D:\python-env\spider>python JinShan.py orange
{"status":0,"content":{"ph_en":"\u02c8\u0252r\u026and\u0292","ph_am":"\u02c8\u0254r\u026and\u0292","ph_en_mp3":"http:\/\/res.iciba.com\/resource\/a
mp3\/oxford\/0\/7d\/9a\/7d9a2fe873a7d3712b01e3fe67308497.mp3","ph_am_mp3":"http:\/\/res.iciba.com\/resource\/amp3\/1\/0\/fe\/01\/fe01d67a002dfa0f3a
c084298142eccd.mp3","ph_tts_mp3":"http:\/\/res-tts.iciba.com\/f\/e\/0\/fe01d67a002dfa0f3ac084298142eccd.mp3","word_mean":["n. \u6854\u5b50\uff0c\u6
a59\u5b50;[\u690d]\u6854\u6811;\u6a59\u8272;\u6854\u8272;","adj. \u6a59\u8272\u7684;\u6a58\u8272\u7684;\u6854\u7ea2\u8272\u7684;"]}}

可以看到我们最后得到了一个 JSON 数据,有一个状态码,估计请求失败的时候就不是 0 了,然后就是 内容(content),这里面包含了很多,但是编码方式是错误的,我们应该可以看出来我们所需要的单词意思应该是在 "word_mean" 里面保存的。
我们继续修改一下代码,看看我们的猜测对不对:

# @Time   : 2019/8/13 17:02
# @Author : Vector_Wan
# @Email  : 995626309@qq.com
# File    : JinShan.py
# Software: PyCharm
import requests
import sys
import json

class JinShan:
    def __init__(self):
        self.url = 'http://fy.iciba.com/ajax.php?a=fy'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest'
        }

    def get_data(self, word):
        data = {
            'f':'auto',
            't':'auto',
            'w':word
        }
        r = requests.post(self.url, headers=self.headers, data=data)
        return r.text

    def seach(self, word):
        rs = self.get_data(word)
        json_data = json.loads(rs, encoding='utf-8')
        print(json_data)


if __name__ == '__main__':
    jianshan = JinShan()
    word = sys.argv[1]
    jianshan.seach(word)
>>> (venv) D:\python-env\spider>python JinShan.py orange
{'status': 0, 'content': {'ph_en': 'ˈɒrɪndʒ', 'ph_am': 'ˈɔrɪndʒ', 'ph_en_mp3': 'http://res.iciba.com/resource/amp3/oxford/0/7d/9a/7d9a2fe873a7d3712
b01e3fe67308497.mp3', 'ph_am_mp3': 'http://res.iciba.com/resource/amp3/1/0/fe/01/fe01d67a002dfa0f3ac084298142eccd.mp3', 'ph_tts_mp3': 'http://res-t
ts.iciba.com/f/e/0/fe01d67a002dfa0f3ac084298142eccd.mp3', 'word_mean': ['n. 桔子,橙子;[植]桔树;橙色;桔色;', 'adj. 橙色的;橘色的;桔红色的;']}}

跟我们猜测的一样,那我们直接获取它就可以了,
最后给出完整源代码。

import requests
import json
import sys

class JinShan:
    def __init__(self):
        self.url = 'http://fy.iciba.com/ajax.php?a=fy'
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest'  ## 表示这是一个 ajax 请求
        }


    def get_data(self, word):
        post_data = {
            'f':'auto',
            't':'auto',
            'w':word
        }
        r = requests.post(self.url, data=post_data, headers=self.headers)
        return r.text


    def search(self, word):
        rs = self.get_data(word)
        # print(rs)
        json_data = json.loads(rs, encoding='utf-8')
        # print(json_data)
        if json_data['status'] == 0:
            print(json_data['content']['word_mean'])
        if json_data['status'] == 1:
            print(json_data['content']['out'])

if __name__ == '__main__':
    word = sys.argv[1]
    js = JinShan()
    js.search(word)

其实使用接口还是很强大的,它可以让你在程序里面使用和网页一样的翻译功能,比如翻译一段话也是可以的:

>>> (venv) D:\python-env\spider>python JinShan.py 测试:这是一个网络接口测试!
Test: this is a network interface test!

上一篇下一篇

猜你喜欢

热点阅读