一、异步加载
异步加载是指通过并发的方式发送多个请求,实现同时加载多个页面,并将页面的内容提取出来。相比于同步加载,异步加载可以大幅提高爬取速度。
简单来说:url表面没有发生变化的情况下 ,加载出了其他数据(内容),是一个动态数据。
产生方式:
1.js代码 触发(鼠标的点击,滑动)
2.ajax异步加载 进度条向下滑动,url没有发生变化,产生新的数据
二、json数据的介绍
JSON(JavaScript Object Notation)是一种用于数据交换的轻量级文本格式。它由键值对组成,类似于Python字典或JavaScript对象。JSON的格式简洁清晰,易于阅读和编写,并且可以被各种编程语言解析和生成。
JSON数据的基本结构是键值对(key-value)形式,键和值之间用冒号分隔,键值对之间用逗号分隔。键必须是字符串类型,值可以是字符串、数字、布尔值、对象(另一个键值对的集合)或数组(值的有序列表)。json是用来填充网页的。
在这里给大家介绍一个解析json文件的网站:json.cn
格式转换
这里需要用到一个库json
- json和python数据的转换
import json
if __name__ == '__main__':
dict_data = {
"name": "思思",
"age": 18
}
print(dict_data, type(dict_data)) # {'name': '思思', 'age': 18} <class 'dict'>
# 转化成json类型的数据
json_data = json.dumps(dict_data, ensure_ascii=False) # indents表示每一个键值对的缩进空格数量
print(json_data, type(json_data)) # json在python中实质上是一个字符串,默认使用的是ASCLL编码 {"name": "思思", "age": 18} <class 'str'>
# 注意:在python中json默认的数据格式是string字符串
# 将json数据转化成python数据
python_data = json.loads(json_data)
print(python_data, type(python_data)) # {'name': '思思', 'age': 18} <class 'dict'>
}
- json和文件的转换
import json
# 将Python格式的数据转化为json’文件‘
dict_data = {
'name': 'sisi',
'age': 18
}
file_obj = open('json01.json','w')
# 少一个s直接是跟json文件打交道
json.dump(dict_data,file_obj,ensure_ascii=False)
file_obj.close()
# 将json文件转化成一个Python可操作对象
file_obj = open('json01.json','r')
python_data = json.load(file_obj)
file_obj.close()
- 记忆技巧
注意:json.dumps()和json.dump(),json.loads()和json.load()的区别,有s的是直接和json数据打交道;没有s的是和json文件打交道
-
python数据 >> json数据 : json.dumps(python数据,ensure_ascii=False)
-
python数据 >> json文件 :json.dump(python字典,json文件对象,ensure_ascii=False)
-
json数据 >> python数据:json.loads(json数据)
-
json文件 >> python数据:json.load(json文件对象)
三、豆瓣翻页爬取
import requests
import time
if __name__ == '__main__':
pages = int(input('请输入你要抓取的页数:'))
for page in range(pages):
url_ = f'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start={page * 20}&limit=20'
headers_ = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0'
}
response_ = requests.get(url_, headers=headers_)
str_data = response_.text
with open(f'douban{page + 1}.json', 'w', encoding='utf-8') as f:
f.write(str_data)
print(f'第{page + 1}页爬取成功!')
# 每爬取一页等待一会,防止被反爬
time.sleep(3)