IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 爬虫实战 | 自制在线翻译小程序 - 爬取 360 在线翻译 -> 正文阅读

[Python知识库]爬虫实战 | 自制在线翻译小程序 - 爬取 360 在线翻译

看完这篇文章,你会学到:
1、requests 库的 post 方法;
2、requests 对象的 status_code 属性、.json() 方法;
3、字典的 .get()方法

需求分析

我们要爬取的是 360翻译
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3fwQZwQD-1626940938229)(E:\6.程序设计\Markdown Files\0images\image-20210722142819914.png)]
右键单击网页,选择 ”检查“,或“审查元素”,调出开发者界面。点击选项卡中的“网络”或“Network"。
**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XxCR8mBK-1626940938236)(E:\6.程序设计\Markdown Files\0images\image-20210722142323872.png)]**
这里会记录下我们和网页所做的所有请求。

此时我们再点一次”翻译“按钮。
这时候,下面多了几条网络请求。
**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uQXsVv9S-1626940938240)(E:\6.程序设计\Markdown Files\0images\image-20210722142904480.png)]**
点击第一条,按下右侧选项卡中的“预览”,发现里面的内容正好是我们所需要的内容。**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7aidNswQ-1626940938253)(E:\6.程序设计\Markdown Files\0images\image-20210722142950098.png)]**
于是,我们点击右侧选项卡中的“标头”,查看获取这些内容的方式。
**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwIWm9BQ-1626940938256)(E:\6.程序设计\Markdown Files\0images\image-20210722143138023.png)]**
可以看到,请求的 url 为 https://fanyi.so.com/index/search 加参数。
请求方法为 post。

接着,我们滑到最下面,查看发送请求所需的参数。**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9yb9ABJU-1626940938259)(E:\6.程序设计\Markdown Files\0images\image-20210722144546308.png)]**
图中的 query 参数即为我们要翻译的内容。

经验证,英→中时,eng 参数为 1,中→英时,eng 参数为 0。不传入参数时即自动判断语言。
而 validate 和 ignore_trans 也都是不必要的参数。

因此,我们只需要传入 query 参数就可以了。

接下来,我们看请求头,也就是 headers。
**[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WljVPLaU-1626940938262)(E:\6.程序设计\Markdown Files\0images\image-20210722145055233.png)]**
将请求头全部复制下来,转成字典类型就可以用了。

不过,这么多的请求头太过于冗杂。
经过试验,我发现只有 pro: fanyi 这一项是必须的,缺失会影响信息获取。因此我们只需要传入这一项就可以了。

开始爬取

第一步:导入 requests

import requests

第一步:完善请求信息

# 请求 url
url = 'https://fanyi.so.com/index/search'
# 传入信息
data = {'query': 'for'}
# 请求头
headers = {
'pro': 'fanyi',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64'
}

第二步:发出 post 请求

post 请求格式:

requests.post(url, data=None, json=None, **kwargs)
参数说明
url请求地址
data传送的表单数据,字典类型
json传送的表单数据,字典类型,会被自动编码
headers请求标头
>>> response = requests.post(url=url, # 发出 post 请求
                             data=data, 
                             headers=headers)
>>> response	# 请求对象
<Response [200]>

查看响应状态码,若为 200,即为响应成功。

>>> response.status_code	# 查看响应状态码
200

第三步:解析响应信息

因为返回的是 json 格式,因此我们要用返回对象的 json()方法解析 json 信息。

>>> response = response.json()	# 解析 json 格式信息
>>> response
{
    'data': {
        'explain': {
            'english_explain': [], 
            'word': 'for', 
            'caiyun': {
                'info': {
                    'lbsynonym': ['representing'], 
                    'antonym': [], 
                    'word_exchange': []
                }
            }, 
            'related_words': ['representing'], 
            'word_level': ['TEM4', 'CET4'], 
            'exsentence': [], 
            'phonetic': None, 
            'web_translations': [
                {
                    'translation': '补充', 
                    'example': ' 『短语』to work for sb/sth 为…工作...以下省略99字'
                }
            ], 
            'translation': [
                'prep.(表示对象)为,给,对;受雇于;...以下省略288字', 
                'conj.因为;由于…的缘故;鉴于'
            ], 
            'speech': {
                '美': '/audio?from=en&to=zh...省略',
                '英': '/audio?from=en&to=zh...省略'
            }
        }, 
        'fanyi': '为了', 
        'speak_url': {
            'speak_url': '/audio?from=en&to=zh...省略', 
            'tSpeak_url': '/audio?from=en&to=zh...省略', 
            'word_speak_url': '/audio?from=en&to=zh...省略',
            'word_type': 'en2zh'
        }, 
        'vendor': 'caiyun'
    }, 
    'error': 0, 
    'msg': 'succ'
}

我们发现,只有其中的一些信息是我们需要的,如翻译、释义和拓展。

翻译:返回字符串。

>>> fanyi = response['data']['fanyi']
>>> fanyi
为了

释义:返回一个列表,包含了不同词性和意思。

>>> means = response['data']['explain']['translation']
>>> means
['prep.(表示对象)为,给,对;受雇于;...以下省略290字', 'conj.因为;由于…的缘故;鉴于']

拓展:返回一个包含 概括:描述 形式字典的列表。

>>> more  = response['data']['explain']['web_translations']
>>> more
[{'translation': '补充', 
  'example': ' 『短语』to work for sb/sth 为…工作  『短语』word for word 逐字地 ...以下省略90字'}]

但是,某些情况不一定以上信息都有,因此我们必须使用字典的 .get() 方法。
方法语法:

dict.get(key, default=None)

key – 字典中要查找的键。
default – 如果指定键的值不存在时,返回该默认值。

fanyi = response.get('data', {}).get('fanyi', '')	# 翻译
means = response.get('date', {}).get('explain', {}).get('translation', [])	# 释义
more = response.get('date', {}).get('explain', {}).get('web_translation', {})	# 拓展

我们将它包装起来:

完整代码

import requests

# 传入参数
datas = {
'query': 'for',
}

# 请求标头
headers = {
'pro': 'fanyi',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64',
}

# 请求 url
url = 'https://fanyi.so.com/index/search'

def fanyi(self, kw:str):
    # 发送请求
    response = requests.post(url,data=datas,headers=headers)

    # 判断状态码
    if response.status_code != 200:
        print('Error:', js.status_code)
        return

    # 解析 json
    response = response.json()
    
    # 获取关键信息
    fanyi = response.get('data', {}).get('fanyi', '')	# 翻译
	means = response.get('date', {}).get('explain', {}).get('translation', [])	# 释义
	more = response.get('date', {}).get('explain', {}).get('web_translation', {})	# 拓展

    result = {
    'fanyi': fanyi,
    'means': means,
    'more': more,
    }

    return result

试验:

>>> fanyi('at')
{'fanyi': '在', 
 'means': [
     'prep.(表示位置、地点)在…(里),到…;(表示某人在参与某种活动时)在…...以下省略220字', 
     'n.阿特(老挝货币单位,100阿特=1基普)'
 ], 
 'more': [
     {'translation': '形近词', 
      'example': 'at'},
     {'translation': '补充', 
      'example': " 『短语』to be at it 又来了(表示某人又在做你不喜欢的事)...以下省略25字"}
 ]
}

>>> fanyi('到达')
{'fanyi': 'Arrive', 
 'means': {
     '[dàodá]': {
         '〈动〉': ['arrive (in/at); get to; reach']
     }
 }, 
 'more': []
}

非常成功!

总结

以上就是这篇文章的全部内容了。

原创不易,如果你觉得这篇文章很有用的话
点赞评论收藏关注再走吧!


yeanky
2021/7/22

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 23:06:26  更:2021-08-10 23:06:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:44:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码