豆瓣电影排行榜界面:
选择喜剧分类:
我们要爬取的数据是:电影名称、导演、演员、上映时间、国家等这些数据。
如何进行爬取:
这些信息是当前页面的局部信息,那么是否会遇到数据解析。
除了数据解析还可以使用哪种方式实现?
爬取当前页面的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请求的爬取有了更完整的体会和实践。