您现在的位置是:首页 >技术杂谈 >爬虫学习记录之Python 爬虫实战:电影 TOP250 循环爬取网站首页技术杂谈
爬虫学习记录之Python 爬虫实战:电影 TOP250 循环爬取
【简介】利用 Python 的 requests 库实现循环爬取电影 TOP250 榜单,对每个电影的详细信息进行抓取,并将抓取的数据保存为 JSON 格式的文件。
1.导入所需库和模块
本项目使用的是 requests 库和 json 库,因此需要导入这两个库。
import json
import requests
2. 构造请求参数并发送请求
电影 TOP250 的数据可以通过以下 URL 获取:
post_url = ‘https://movie.douban.com/j/chart/top_list’
首先,我们需要通过浏览器开发者工具或其他工具查看该 URL 的请求方式与请求参数。如果使用浏览器开发者工具,可以在 Network 选项卡中查看所有请求的信息。如果使用其他工具,则需要查阅该工具的使用手册获取请求信息。
根据查看到的请求信息,我们需要构造以下请求参数:
param = {
'type': '24',
'interval_id': '100:90',
'action': '',
'start': '0', # 从第六十个电影开始取
'limit': '20' # 一次性取二十个
}
参数说明:
type
:电影类型,这里我们选择“剧情”类型;
interval_id
:电影时间,这里我们选择“2021”年;
action
:无需指定;
start
:数据开始偏移量,从第 60 个电影开始取;
limit
:每次获取的数据量,这里我们设置为 20。
发送请求的代码如下:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57'
}
resource = requests.get(url=post_url, params=param, headers=headers)
res = resource.json()
其中,headers
是模拟浏览器请求的头部信息。requests.get()
方法是请求网络资源的方法,params
参数是请求数据中的参数,resource.json()
方法则将返回的 json
数据解析成对象列表。
3. 解析数据并保存到文件
得到 json 数据之后,我们需要对其进行解析,并将需要的数据提取出来。这里,我们需要获取每个电影的名称、评分、导演、编剧、主演等信息。解析代码如下:
movies = []
for movie in res:
data = {}
data['title'] = movie['title']
data['rating'] = movie['rating'][0]
data['directors'] = movie['directors'][0]
data['casts'] = movie['casts'][0]
movies.append(data)
这段代码遍历了每个电影的 json 对象,提取出需要的信息,然后保存到列表 movies 中。
最后,我们需要将获取到的数据保存为 JSON 格式的文件。保存代码如下:
fp = open('douban.json', 'w', encoding='utf-8')
json.dump(movies, fp=fp, ensure_ascii=False)
print('over!')
其中,json.dump()
方法将列表对象 movies
写入 JSON 文件中,ensure_ascii=False
参数表示将中文数据写入文件时不使用 ASCII 编码。
4. 完整代码
import json
import requests
if __name__ == '__main__':
# 指定url
post_url = "https://movie.douban.com/j/chart/top_list"
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.57'
}
# 携带数据
param = {
'type': '24',
'interval_id': '100:90',
'action': '',
'start': '0',# 从第六十个电影开始取
'limit': '20'# 一次性取二十个
}
# 请求发送
resource = requests.get(url=post_url, params=param, headers=headers)
res = resource.json()
# 数据解析
movies = []
for movie in res:
data = {}
data['title'] = movie['title']
data['rating'] = movie['rating'][0]
data['directors'] = movie['directors'][0]
data['casts'] = movie['casts'][0]
movies.append(data)
# 数据保存
fp = open('douban.json', 'w', encoding='utf-8')
json.dump(movies, fp=fp, ensure_ascii=False)
print('over!')