您现在的位置是:首页 >技术杂谈 >爬虫学习记录之Python 爬虫实战:电影 TOP250 循环爬取网站首页技术杂谈

爬虫学习记录之Python 爬虫实战:电影 TOP250 循环爬取

永不言弃h 2024-08-15 12:01:03
简介爬虫学习记录之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!')
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。