通用爬虫案例5:百度翻译

需求:
自定义单词,获取对应单词的解释

Ajax局部刷新技术:e.g.京东
如果判断出数据是Ajax加载的,开发者工具中需要选择XHR
XHR:XML HTTP PEQUEST(异步加载)

导入requests

import requests

定义请求头

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}

自定义查找的单词

kw = input('请输入想要查找的单词:')

定义参数字典

data = {
    'kw': 'as'
}

post请求的参数是存放在From Data中的
post请求传参需要使用data参数而不再是params参数

发起请求,接收响应

response = requests.post(url='https://fanyi.baidu.com/sug',headers=headers,data=data)
# print(response.text)  # {"errno":0,"data":[{"k":"as","v":"prep. \u50cf; \u5982\u540c; \u4f5c\u4e3a; \u5f53\u4f5c; adv. (\u6bd4\u8f83\u65f6\u7528)\u50cf\u2026\u4e00\u6837\uff0c\u5982\u540c; (\u6307\u4e8b\u60c5\u4ee5\u540c\u6837\u7684\u65b9"},{"k":"ask","v":"v. \u95ee; \u8be2\u95ee; \u8981\u6c42; \u8bf7\u6c42; \u6073\u6c42(\u7ed9\u4e88); \u5f81\u6c42;"},{"k":"assistant","v":"n. \u52a9\u7406; \u52a9\u624b; \u52a9\u6559(\u5728\u56fd\u5916\u7559\u5b66\u7684\u5927\u5b66\u751f\uff0c\u6559\u6388\u672c\u56fd\u8bed); adj. \u52a9\u7406\u7684; \u526f\u7684;"},{"k":"assume","v":"v. \u5047\u5b9a; \u5047\u8bbe; \u8ba4\u4e3a; \u627f\u62c5(\u8d23\u4efb); \u5c31(\u804c); \u53d6\u5f97(\u6743\u529b); \u5448\u73b0(\u5916\u89c2\u3001\u6837\u5b50); \u663e\u9732"},{"k":"associate","v":"v. \u8054\u60f3; \u8054\u7cfb; \u4ea4\u5f80; (\u5c24\u6307)\u6df7\u5728\u4e00\u8d77; \u8868\u660e\u652f\u6301; \u8868\u793a\u540c\u610f; adj. \u975e\u6b63\u5f0f\u7684; \u51c6\u7684"}]}
# print(type(response.text))  # <class 'str'>

Ajax加载的数据就是字符串字符串是字典格式的,针对于这种格式,我们叫json格式

发现问题:中文不显示,显示的是中文的编码
中文编码范围:[\u4e00-\u9fa5]
获取Ajax数据加载的数据时,获取的是response中的内容,而不是preview中的内容

解决中文编码问题,使用json()方法
作用:将json格式字符串转换成Python的字典或者列表类型

print(response.json())  # {'errno': 0, 'data': [{'k': 'as', 'v': 'prep. 像; 如同; 作为; 当作; adv. (比较时用)像…一样,如同; (指事情以同样的方'}, {'k': 'ask', 'v': 'v. 问; 询问; 要求; 请求; 恳求(给予); 征求;'}, {'k': 'assistant', 'v': 'n. 助理; 助手; 助教(在国外留学的大学生,教授本国语); adj. 助理的; 副的;'}, {'k': 'assume', 'v': 'v. 假定; 假设; 认为; 承担(责任); 就(职); 取得(权力); 呈现(外观、样子); 显露'}, {'k': 'associate', 'v': 'v. 联想; 联系; 交往; (尤指)混在一起; 表明支持; 表示同意; adj. 非正式的; 准的'}]}
print(type(response.json()))  # <class 'dict'>
content = response.json()

获取数据

data_list = content['data']

print(data_list)  # [{'k': 'as', 'v': 'prep. 像; 如同; 作为; 当作; adv. (比较时用)像…一样,如同; (指事情以同样的方'}, {'k': 'ask', 'v': 'v. 问; 询问; 要求; 请求; 恳求(给予); 征求;'}, {'k': 'assistant', 'v': 'n. 助理; 助手; 助教(在国外留学的大学生,教授本国语); adj. 助理的; 副的;'}, {'k': 'assume', 'v': 'v. 假定; 假设; 认为; 承担(责任); 就(职); 取得(权力); 呈现(外观、样子); 显露'}, {'k': 'associate', 'v': 'v. 联想; 联系; 交往; (尤指)混在一起; 表明支持; 表示同意; adj. 非正式的; 准的'}]

循环获取每一个内容

for data in data_list:
    # print(data)
#     {'k': 'as', 'v': 'prep. 像; 如同; 作为; 当作; adv. (比较时用)像…一样,如同; (指事情以同样的方'}
#     {'k': 'ask', 'v': 'v. 问; 询问; 要求; 请求; 恳求(给予); 征求;'}
#     {'k': 'assistant', 'v': 'n. 助理; 助手; 助教(在国外留学的大学生,教授本国语); adj. 助理的; 副的;'}
#     {'k': 'assume', 'v': 'v. 假定; 假设; 认为; 承担(责任); 就(职); 取得(权力); 呈现(外观、样子); 显露'}
#     {'k': 'associate', 'v': 'v. 联想; 联系; 交往; (尤指)混在一起; 表明支持; 表示同意; adj. 非正式的; 准的'}

获取单词

word = data['k']

获取解释

    explain = data['v']
    print(word,explain)
# as prep. 像; 如同; 作为; 当作; adv. (比较时用)像…一样,如同; (指事情以同样的方
# ask v. 问; 询问; 要求; 请求; 恳求(给予); 征求;
# assistant n. 助理; 助手; 助教(在国外留学的大学生,教授本国语); adj. 助理的; 副的;
# assume v. 假定; 假设; 认为; 承担(责任); 就(职); 取得(权力); 呈现(外观、样子); 显露
# associate v. 联想; 联系; 交往; (尤指)混在一起; 表明支持; 表示同意; adj. 非正式的; 准的

整合代码

import requests

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
}

自定义查找的单词

使用死循环(永真循环),保证代码一直运行

while True:
    kw = input('请输入想要查找的单词:')

    data = {
        'kw': kw
    }

    response = requests.post(url='https://fanyi.baidu.com/sug', headers=headers, data=data)

    content = response.json()

    data_list = content['data']

    for data in data_list:
        word = data['k']
        explain = data['v']
        print(word, explain)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值