Python学习记录-项目案例实现:爬虫篇 02

项目案例实现|Python爬虫 02:破解百度翻译

  • 项目来源
  • 项目需求
  • 具体分析
    • 1. 指定URL
    • 2. UA伪装
    • 3. 发送请求
    • 4. 获取响应结果
    • 5. 持久化存储
    • 6. 个性化需求
  • 项目代码
  • 运行结果
  • 检验
  • 注意事项

项目来源

本项目来源B站UP主路飞学城视频:视频链接点这里

项目需求

利用Python爬虫实现百度翻译,获取单词词性以及释义

具体分析

1. 指定URL

首先进入百度翻译界面,随机输入一个单词后使用抓包工具,通过对所抓取的包的分析可知,翻译内容存储于一个ajax包sug中。
Python学习记录-项目案例实现:爬虫篇 02_第1张图片
将该包中的URL粘贴到代码段,即获取了所需发送请求的URL地址

url = 'https://fanyi.baidu.com/sug'

2. UA伪装

headers = {
     
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    }

3. 发送请求

根据抓包工具所示,该请求为一个post请求,与get请求不同,post请求必须传递参数。在本包中,参数即为所查单词,以’serendipity’为例。
Python学习记录-项目案例实现:爬虫篇 02_第2张图片
发送请求,传入的参数封装在data字典中:

data = {
     'kw': serendipity}
response = requests.post(url=url, data=data, headers=headers)

4. 获取响应结果

在抓包工具中查看得知,所返回的响应数据是一串json串,故调用json方法即可获取。

dic_obj = response.json()

5. 持久化存储

对json格式的持久化存储,可导入json模块中的dump进行执行。

fp = open(filename, 'w', encoding='utf-8')
json.dump(dic_obj, fp=fp, ensure_ascii=False)  # ensure_ascii=False表示不使用ascii码

6. 个性化需求

以上只是对某个特定的单词进行查询,不能做到对任意单词进行模拟查询,要实现这一点,只需加上一个input(),将data字典中的value值改为input捕获到的值即可。

项目代码

# -*- coding: utf-8 -*-
# @author   : QIN
# @time     : 2021/1/10 16:24
# @function :
import requests
import json


if __name__ == '__main__':
    # 指定URL
    post_url = 'https://fanyi.baidu.com/sug'
    word = input('输入查询单词:')
    data = {
     'kw': word}
    # 进行UA伪装
    header = {
     
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    }
    # 发送请求
    res = requests.post(url=post_url, data=data, headers=header)
    dic_obj = res.json()
    # 持久化保存
    filename = word + '.json'
    fp = open(filename, 'w', encoding='utf-8')
    json.dump(dic_obj, fp=fp, ensure_ascii=False)
    print('结果保存成功!')

运行结果

以单词’exotic’为例

输入查询单词:exotic
结果保存成功!

Python学习记录-项目案例实现:爬虫篇 02_第3张图片

用json解析器对生成的json文件进行解析,得如下结果

{
“errno”: 0,
“data”: [{
“k”: “exotic”,
“v”: “adj. 异国的; 外来的; 异乎寻常的,奇异的; 吸引人的 n. 舶来品,外来物; 脱衣舞女”
}, {
“k”: “Exotic”,
“v”: “adj. 外来的,外国来的”
}, {
“k”: “exotica”,
“v”: “n. 异族事物,新奇事物; 尖蕊鸢尾”
}, {
“k”: “Exotica”,
“v”: “[电影]色情酒店”
}, {
“k”: “exotics”,
“v”: “外来植物”
}]
}

与百度翻译界面释义比对
Python学习记录-项目案例实现:爬虫篇 02_第4张图片
基本释义正确,即项目完成!

检验

下面再次检测三个单词:

  • constraint
输入查询单词:constraint
结果保存成功!

{
“errno”: 0,
“data”: [{
“k”: “constraint”,
“v”: “n. 约束; 限制; 强制”
}, {
“k”: “constraints”,
“v”: “n. 约束; 限制; 强制( constraint的名词复数 )”
}]
}

Python学习记录-项目案例实现:爬虫篇 02_第5张图片

  • paradise
输入查询单词:paradise
结果保存成功!

{
“errno”: 0,
“data”: [{
“k”: “paradise”,
“v”: “n. 天堂; 乐园; 伊甸园; 极乐”
}, {
“k”: “Paradise”,
“v”: “[地名] [圭亚那、美国、南非共和国、新西兰] 帕拉代斯; [电影]仙境”
}, {
“k”: “PARADISE”,
“v”: “abbr. phased array radar and diverse integrated se”
}, {
“k”: “paradises”,
“v”: “n. 天堂( paradise的名词复数 ); 伊甸园; 完美快乐的境界; 理想[完美]的地方”
}, {
“k”: “Paradise Lost”,
“v”: “n. <失乐园>; [电影]在记忆的森林里”
}]
}

Python学习记录-项目案例实现:爬虫篇 02_第6张图片

  • infinite
输入查询单词:infinite
结果保存成功!

{
“errno”: 0,
“data”: [{
“k”: “infinite”,
“v”: “adj. 无限的,无穷的; 无数的,许许多多的; 极大的 n. 无限,无穷; [数] 无穷大; <宗”
}, {
“k”: “Infinite”,
“v”: “韩国7人偶像组合”
}, {
“k”: “infinitely”,
“v”: “adv. 极其; 无限地,无穷地”
}, {
“k”: “infinite form”,
“v”: “不定形式”
}, {
“k”: “infinite life”,
“v”: “无限寿命”
}]
}

Python学习记录-项目案例实现:爬虫篇 02_第7张图片

注意事项

  • 发送的请求为一个post请求,需要携带参数,参数在抓包工具中获取,且需要封装在一个字典中
  • 要根据抓包工具确定响应数据的类型是text还是json,不同类型的持久化存储的方式不同

你可能感兴趣的:(python,json,web,爬虫)