动态加载
需求:爬取豆瓣网中的电影详情数据,
分析网站:
- 当滚轮滑动到底部的时候,页面会发起ajax请求,且请求到一组电影详情数据。
- 当滚轮不滑动的时候,页面显示的电影数据,通过对浏览器地址栏的url发起请求是请求不到的。
动态加载的数据
- 可见非即可得
- 概念:通过非浏览器地址栏url请求到的数据(另外的一个新的请求请求到的数据)
当我们对一个陌生的网站进行指定数据爬取之前,我们在写代码之前必须要做的一个事情就是校验你想要爬取的数据是否为动态加载的数据
是动态加载的数据
- 基于抓包工具进行全局搜索,锁定动态加载数据对应的数据包即可。从数据包中提取请求的url和请求方式和请求参数。
不是动态加载的数据
- 直接对地址栏的url发起请求就可以获取指定数据
import requests
url = 'https://movie.douban.com/j/chart/top_list'
#参数动态化
params = {
"type": "17",
"interval_id": "100:90",
"action": "",
"start": "20",
"limit": "10",
}
response = requests.get(url=url,headers=headers,params=params)
page_text = response.json() #json返回的是序列号好的对象
#将电影名称和评分进行解析
for dic in page_text:
name = dic['title']
score = dic['score']
print(name+':'+score)
问题:如何检测页面中的数据是否为动态加载的数据?
基于抓包工具进行局部搜索
- 搜索到:不是动态加载数据
- 搜索不到:是动态加载数据
- 肯德基餐厅查询:http://www.kfc.com.cn/kfccda/storelist/index.aspx
分析:
- 数据为动态加载数据
- 通过抓包工具的全局搜索捕获动态加载数据
import requests
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
data = {
"cname": "",
"pid": "",
"keyword": "北京",
"pageIndex": "1",
"pageSize": "10",
}
#参数:data是用来实现参数动态化,等同于get方法中的params参数的作用
response = requests.post(url=url,headers=headers,data=data)
page_text = response.json()
for dic in page_text['Table1']:
pos = dic['addressDetail']
print(pos)
import requests
#想要获取所有页码对应的位置信息
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
for pageNum in range(1,8):
data = {
"cname": "",
"pid": "",
"keyword": "北京",
"pageIndex": str(pageNum),
"pageSize": "10",
}
#参数:data是用来实现参数动态化,等同于get方法中的params参数的作用
response = requests.post(url=url,headers=headers,data=data)
page_text = response.json()
for dic in page_text['Table1']:
pos = dic['addressDetail']
print(pos)