需求:
自定义单词,获取对应单词的解释
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)