爬虫自学day4:requests模块之爬取豆瓣电影分类排行榜

您所在的位置:网站首页 豆瓣电影排行前100 爬虫自学day4:requests模块之爬取豆瓣电影分类排行榜

爬虫自学day4:requests模块之爬取豆瓣电影分类排行榜

2024-01-14 22:18| 来源: 网络整理| 查看: 265

豆瓣电影排行榜界面: 在这里插入图片描述 选择喜剧分类: 在这里插入图片描述 我们要爬取的数据是:电影名称、导演、演员、上映时间、国家等这些数据。

如何进行爬取: 这些信息是当前页面的局部信息,那么是否会遇到数据解析。 除了数据解析还可以使用哪种方式实现?

爬取当前页面的URL会得到整张页面。如何只获取我们想要的数据,我们可以看一下会不会和day3所学习的破解百度翻译类似,采用了Ajax请求,请求到json数据。

我们发现在上一个页面中,当我们滑动鼠标滚轮的时候,当鼠标滚轮滑到底部时,滚轮会自动返回到中部左右,故说明滚动到底部时发起了Ajax请求,请求到了另外一批电影数据。地址栏URL没变,页面局部刷新

打开抓包工具验证: 检查–>network–>XHR 拖动滚轮走 拖到到底部时捕获到了一盒Ajax请求数据包: 在这里插入图片描述 打开看看: 在这里插入图片描述 在这里插入图片描述 得出: 是一个GET请求,携带的参数为5个如图一所示。 那么意味着对这个url发起一个get请求让他携带这些参数就可以拿到一组json数据? 不一定,我们去content-type看一下:是application/json ,那么肯定是一组json数据了。

打开Response就可以看到我们请求到这一批新的电影数据。

爬取从第一部电影开始的20部电影 代码1:

import json import requests if __name__ == "__main__": ''' 第一步:url的指定: https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=140&limit=20 问号后的参数都封装到字典里 ''' url = 'https://movie.douban.com/j/chart/top_list' param = { 'type':'24', 'interval_id':'100:90', 'action':'', 'start':'1',#开始的位置,140是从第140步电影取,故可动态修改 'limit':'20',#限定的个数,20是一次取20个电影 } #进行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' } ''' 第二步:请求发送 ''' response = requests.get(url=url,params=param,headers=headers) ''' 第三步:获取响应数据 ''' list_data = response.json() ''' 第四步:持久化存储 ''' #filename = word+'.json' fp = open('./douban.json','w',encoding='utf-8') #中文不能使用ASCII码,赋成false json.dump(list_data,fp=fp,ensure_ascii=False) print('over')

得到的json数据是: 在这里插入图片描述 把他放在json格式化工具中显示一下:

看到爬到的第一部电影《美丽人生》的信息: 在这里插入图片描述 动态修改limit和start参数就可以动态或许任何电影信息: 代码2: 自定义爬取从第二部电影开始的两部电影:

# -*- coding: utf-8 -*- """ Created on Fri Nov 13 17:30:50 2020 @author: 1 """ import json import requests if __name__ == "__main__": ''' 第一步:url的指定: https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=140&limit=20 问号后的参数都封装到字典里 ''' url = 'https://movie.douban.com/j/chart/top_list' start = input('enter start number') limit = input('how many films you want to get') param = { 'type':'24', 'interval_id':'100:90', 'action':'', 'start':start,#开始的位置,140是从第140步电影取,故可动态修改 'limit':limit,#限定的个数,20是一次取20个电影 } #进行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' } ''' 第二步:请求发送 ''' response = requests.get(url=url,params=param,headers=headers) ''' 第三步:获取响应数据 ''' list_data = response.json() ''' 第四步:持久化存储 ''' #filename = word+'.json' fp = open('./douban.json','w',encoding='utf-8') #中文不能使用ASCII码,赋成false json.dump(list_data,fp=fp,ensure_ascii=False) print('over')

得到的json数据(部分):

[ { "rating":[ "9.5", "50" ], "rank":3, "cover_url":"https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2206737207.jpg", "is_playable":true, "id":"1303408", "types":[ "喜剧", "动作", "爱情" ], "regions":[ "美国" ], "title":"福尔摩斯二世", "url":"https://movie.douban.com/subject/1303408/", "release_date":"1924-04-21", "actor_count":11, "vote_count":17002, "score":"9.5", "actors":[ "巴斯特·基顿", "凯瑟琳·麦奎尔", "乔·基顿", "Ward Crane", "Jane Connelly", "George Davis", "Doris Deane", "Betsy Ann Hisle", "丘比·摩根", "John Patrick", "Ford West" ], "is_watched":false }, { "rating":[ "9.5", "50" ], "rank":4, "cover_url":"https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2527089368.jpg", "is_playable":false, "id":"30203557", "types":[ "喜剧" ], "regions":[ "中国香港" ], "title":"黄子华栋笃笑之金盆𠺘口", "url":"https://movie.douban.com/subject/30203557/", "release_date":"2018-07-06", "actor_count":1, "vote_count":2188, "score":"9.5", "actors":[

总结: 这次和破解百度翻译比较类似,百度翻译是局部信息更新,我们也只需要翻译的那部分信息,需要去找单词的sug里的URL,在POST请求里将word写成一个动态的参数封装到data赋给POST请求即可。这次是一个GET请求,这次是动态修改limit和start。对页面刷新,自动进行Ajax请求的爬取有了更完整的体会和实践。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3