现在我打算爬取这个页面:
话不多说,先上代码:
import requests
# 爬取豆瓣电影中的动作片详情数据
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}
url = 'movie.douban/typerank?type_name=动作&type=5&interval_id=100:90&action='
response = requests.get(url, headers=headers)
page_text = response.text
with open('./douban.html', 'w', encoding='utf-8') as f:
f.write(page_text)
代码运行后,打开 douban.html:
我们发现,程序并没有爬取到相关数据。这是为什么呢?
动态加载数据的捕获- 什么叫做动态加载的数据?
我们通过requests模块进行爬取数据无法每次都实现可见即可得,有些数据是通过非浏览器地址栏中的url请求到的数据,而是其他请求 请求到的数据,那么这些通过请求请求到的数据就是动态加载的数据
- 如何检测网页中是否存在动态加载数据
基于抓包工具动态进行局部搜索:
在当前网页中打开抓包工具,捕获到地址栏url对应的数据包,在该数据包中response选项卡搜索我们想要爬的数据,如果搜索到了就不是动态加载数据,如果没有搜索到,那就是动态加载数据
如果数据为动态加载,那么我们如何铺货到动态加载的数据
基于抓包工具进行全局搜索
- 定位到动态加载数据对应的数据包,从该数据包中就可以提取出
- 请求的url
- 请求方式
- 请求携带的参数
- 看到响应的数据
现在我们就可以写代码进行爬取了:
url = 'movie.douban/j/chart/top_list'
params = {
'type': '5',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'
}
response = requests.get(url=url, params=params, headers=headers)
# .json() 将获取的字符串形式的json数据反序列化成字典或列表对象
page_text = response.json()
print(page_text)
# 解析出电影的名称 评分
for movie in page_text:
name = movie['title']
score = movie['score']
print(name, score)
思考:
基于抓包工具进行全局搜索不一定每次都能定位到动态加载数据对应的数据包?
原因:如果动态加载的数据是经过加密的密文数据。(后续会详解)
关注 Python涛哥,学习更多Python知识!
,