在day2中讲到了UA检测,UA伪装。在接下来的案例中都会用到。UA伪装讲解
在这次爬取中,我们想要爬取的不再是整张页面,而是这张页面局部的文本数据。不用数据解析获得局部的页面数据。
如何实现?
我们发现百度翻译dog的翻译信息是存放在如下这样一个页面的:
我们只想拿到这个翻译结果。
我们发现在百度翻译界面,当我们在文本框删除dog后下面的翻译信息也随之清空了,输入dog后,不用触控任何一个按键就有信息局部刷新了。
特性:页面局部刷新
意味着:当在这个文本框录入单词后,会自动的进行Ajax请求发送。Ajax成功后,会将页面局部内容进行刷新。
打开抓包工具,捕获对应的Ajax请求:
- 右键检查->Network->XHR(ALL对应的是所有的请求对应的数据包,XHR对应的Ajax请求对应的数据包
- 我们发现cat这个单词三个sug:对应的参数分别为c;ca;cat。故每一个Ajax请求对应的是每一个字符的翻译结果。我们需要的是第三个Ajax请求数据包,即cat
- 拿到数据包对应的url,并且是POST请求。
- 看一下响应信息response headers中的content type:故说明当我们的url发起请求时,服务器端响应回来的应该是一组json串。
- 截取内容
Request URL: https://fanyi.baidu.com/sug
content-type: application/json
得出的结论是:
1、这个是一个POST请求,并且携带了参数
2、响应数据是一组json数据这组json串就是我们要去捕获的数据。
完整代码:
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 4 14:51:36 2020
@author: 1
"""
import json
import requests
if __name__ == "__main__":
'''
第一步:url的指定
'''
post_url = 'https://fanyi.baidu.com/sug'
#进行UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
}
'''
第二步:请求发送
'''
#post里的data相当于get里的params一样的,一样要是个字典数据。
#我们当前的参数只有一个kw=cat,可以直接将kw赋为cat,这里写成动态的
#post请求参数处理
word = input('enter a word')
data = {
'kw':word
}
response = requests.post(url=post_url,data=data,headers=headers)
'''
第三步:获取响应数据
'''
#json方法返回obj(如果确认服务器响应数据是json才可以使用json方法进行对象的返回)
dic_obj = response.json()
print(dic_obj)
'''
第四步:持久化存储
'''
filename = word+'.json'
fp = open(filename,'w',encoding='utf-8')
#中文不能使用ASCII码,赋成false
json.dump(dic_obj,fp=fp,ensure_ascii=False)
print('over')
结果:
得到love.json:
{“errno”: 0, “data”: [{“k”: “love”, “v”: “n. 爱; 热爱; 慈爱; 爱情; 恋爱; 喜好; 喜爱; v. 爱; 热爱; 喜欢; 喜爱; 很喜”}, {“k”: “lovely”, “v”: “adj. 美丽的; 优美的; 有吸引力的; 迷人的; 令人愉快的; 极好的; 亲切友好的; 慷慨大方”}, {“k”: “lover”, “v”: “n. (婚外的)情人,情侣; 爱好者; 热爱者;”}, {“k”: “love you”, “v”: " 爱你; 醉后决定爱上你; 英;"}, {“k”: “loved”, “v”: “v. 爱; 热爱; 喜欢; 喜爱; 很喜欢; 很愿意; love的过去分词和过去式;”}]}