目录
一.那么问题来了,有622条数据,有没有必要一次加载到页面中?
我们想要爬取豆瓣网上分类是剧情的电影
进入官网---->电影----->排行榜----->分类排行榜------>剧情
点击进入
我们会发现满足条件的有622部电影,
一.那么问题来了,有622条数据,有没有必要一次加载到页面中?
答:没有必要
界面不会把这些电影都给用户展现出来,当我们滑动滚动条的时候,会发现当滑动条快完的时候,滑动条又会变长,自己试一试,体会一下
(1)数据量大,在通信过程中要花费大量的时候,会让用户等待很久,用户体验较差
(2)由于数据量较大,一次加载到内存中会占用大量的内存空间
(3)由于用户只关心前几页的数据,后面的数据如果使用通信得来,或加载到内存江北视为浪费资源
二.解决方案:使用ajax做局部刷新
1.爬取整个界面
url 就是请求的地址
编写代码
import requests
url='https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=100:90&action='
response=requests.get(url)
with open('douban.html','w',encoding=response.encoding) as fp:
fp.write(response.text)
运行程序:
在火狐浏览器上运行响应回来的界面:
没有有关电影的东西
2.通过ajax做局部刷新
(1)导入模块
import requests
(2)分析接口,总结规律
第一页:https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=0&limit=20
第二页:https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=20&limit=20
第三页:https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=40&limit=20
.............................
(3)代码
第一种:直接 +拼接
import requests
for page in range(1,11,1):
url='https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&limit=20&start='+str((page-1)*20)
print('第%s页:'%page,url)
response=requests.get(url)
for movie in response.json():
title=movie['title']
address=movie['url']
with open('douban_movie.txt','a',encoding=response.encoding) as fp:
fp.write(title+':'+'\t'+address+'\n')
第二种:写成json格式
import requests
for page in range(1, 11, 1):
url = 'https://movie.douban.com/j/chart/top_list'
print('第%s页:'%page,url)
data_dic = {
'type': '11',
'interval_id': '100:90',
'limit': '20',
'start': str((page - 1) * 20)
}
response=requests.get(url,data_dic)
# print(response.json())
for movie in response.json():
title=movie['title']
address=movie['url']
with open('douban_movie.txt','a',encoding=response.encoding) as fp:
fp.write(title+":\t"+address+"\n")
运行结果
看吧 爬虫还是挺有用的吧!!!
3.优化代码
爬取数据,能一次性爬完,绝不多次访问
指不定哪天就进不去了,所以能爬的时候都把它爬完
import requests
url = 'https://movie.douban.com/j/chart/top_list'
data_dic = {
'type': '11',
'interval_id': '100:90',
'limit': '622',
'start': '0'
}
response=requests.get(url,data_dic)
# print(response.json())
for movie in response.json():
title=movie['title']
address=movie['url']
with open('douban_movie.txt','a',encoding=response.encoding) as fp:
fp.write(title+':\t'+address+'\n')
运行完后,这622部电影的名字和地址都保存在douban_movie.txt里面了