通过Python爬虫自建豆瓣电影API

项目简介

在开发微信小程序「影库MDb」时,使用了豆瓣api来获取电影信息,后来由于豆瓣apikey失效了,小程序就无法正常访问,而个人主体貌似无法申请官方apikey,所以自己抽时间通过爬虫的方式写了个电影接口。这里把项目中的电影接口部分单独提取出来,分享给有需要的朋友。
本项目使用Python Flask框架搭建,采用爬取豆瓣官网的方式,获取并处理电影信息,返回的Json数据,便于小程序使用。
主要实现的功能有获取电影列表,获取电影信息、图片、演员等,以及获取影人信息、图片、作品,具体可参考api文档。

开发技术

编程语言:Python 3.7
WEB框架:Flask
WSGI服务器:Waitress

使用方法

先部署环境,安装依赖。

pip install -r requirements.txt

直接运行run.py即可,我设置的5000端口,可改为其它,部署后可通过nginx来代理。

python run.py

成功运行之后可以通过 http://localhost:5000+对应URL和参数 来获取数据,URL和参数详见API文档。

不建议直接部署使用,因为每次请求都要现爬取并处理数据,占用资源,响应比较慢,并且爬虫受限。可以在此基础上进行开发,将数据保存到本地数据库,然后定期更新数据。如果要部署使用,建议在config目录的配置文件里的HEADERS和PROXIES加上对应配置,来解决豆瓣爬虫限制。

使用建议

  • 豆瓣官网有反爬机制,单ip有访问限制,所以建议增加ip代理池。
  • 部分影视不登录豆瓣账号无法查看信息,所以建议增加cookie。
  • 建议将爬取处理好的数据保存到本地数据库(推荐mongodb),处理逻辑是:访问接口->查询本地数据库->有返回数据,没有现爬数据并存储。
  • 如果将数据存到本地,电影的一些数据会变化,建议添加个时间字段,用于定期更新数据。
  • 由于我是在Windows服务器运行,使用的是Waitress,Linux建议更换其它WSGI服务器。

API文档

文档说明

  • 接口固定返回格式如下,以下‘返回参数说明’中只含data中的参数
{
    "code": 200, // 响应状态码
    "data": {}, // 数据
    "msg": "成功" // 状态提示
  }
  • 返回示例中的数据仅截取部分,非完整数据。

1. 电影列表

简要描述
  • 获取电影列表,包括正在热映、即将上映、热门电影、热门电视、豆瓣TOP250
  • 请求参数中的listname可选值为:nowplaying、later、hotmovie、hottv、top250,分别对应上面5个列表
请求URL
  • /api/douban/list
请求方式
  • GET
参数
参数名必选类型说明
listnamestring列表名
startint起点,默认为0
返回示例
  {
    "code": 200,
    "data": {
        "count": 25,
        "list": [
            {
                "average": 9.7,
                "id": "1292052",
                "no": 1,
                "poster": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg",
                "stars": "50",
                "title": "肖申克的救赎"
            },
            {
                "average": 9.6,
                "id": "1291546",
                "no": 2,
                "poster": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p2561716440.jpg",
                "stars": "50",
                "title": "霸王别姬"
            },
            ...
        ],
        "listname": "top250",
        "start": 0
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
listarray电影列表
listnamestring当前列表名
startint当前起点
totalint该列表总数
备注
  • 本为从本地数据库获取,改直接爬取后,start参数只对top250有效,且*25

2.1 电影基本信息

简要描述
  • 获取电影基本信息
请求URL
  • /api/douban/movie
请求方式
  • GET
参数
参数名必选类型说明
idstring电影id
返回示例
{
    "code": 200,
    "data": {
        "actor": [
            "蒂姆·罗宾斯 Tim Robbins",
            "摩根·弗里曼 Morgan Freeman",
            ...
        ],
        "aka_title": [
            "月黑高飞(港)",
            "刺激1995(台)",
            "地狱诺言",
            "铁窗岁月",
            "消香克的救赎"
        ],
        "alt": "https://movie.douban.com/subject/1292052/",
        "author": [
            "弗兰克·德拉邦特 Frank Darabont",
            "斯蒂芬·金 Stephen King"
        ],
        "average": 9.7,
        "casts": "蒂姆·罗宾斯/摩根·弗里曼/鲍勃·冈顿/威廉姆·赛德勒",
        "celebrities": [
            {
                "avatar": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p230.jpg",
                "id": "1047973",
                "name": "弗兰克·德拉邦特",
                "role": "导演"
            },
            {
                "avatar": "https://img9.doubanio.com/view/celebrity/s_ratio_celebrity/public/p17525.jpg",
                "id": "1054521",
                "name": "蒂姆·罗宾斯",
                "role": "饰 安迪·杜佛兰 Andy Dufresne"
            },
            ...
        ],
        "celebrities_num": 43,
        "collect_count": 3517566,
        "countries": [
            "美国"
        ],
        "director": [
            "弗兰克·德拉邦特 Frank Darabont"
        ],
        "durations": [
            "142分钟"
        ],
        "episodes": "",
        "genres": [
            "剧情",
            "犯罪"
        ],
        "id": "1292052",
        "imdb_id": "tt0111161",
        "imdb_score": "",
        "languages": [
            "英语"
        ],
        "org_title": "The Shawshank Redemption",
        "photo_num": 771,
        "photos": [
            "https://img2.doubanio.com/view/photo/m/public/p2561714803.jpg",
            "https://img9.doubanio.com/view/photo/m/public/p2309770674.jpg",
            "https://img3.doubanio.com/view/photo/m/public/p456482220.jpg",
            ...
        ],
        "poster": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg",
        "pubdates": [
            "1994-09-10(多伦多电影节)",
            "1994-10-14(美国)"
        ],
        "rating_count": 2308132,
        "recommend": [
            {
                "average": "",
                "id": "1292720",
                "poster": "https://img2.doubanio.com/view/photo/s_ratio_poster/public/p2372307693.webp",
                "stars": "",
                "title": "阿甘正传"
            },
            {
                "average": "",
                "id": "1849031",
                "poster": "https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2614359276.webp",
                "stars": "",
                "title": "当幸福来敲门"
            },
            ...
        ],
        "star_detail": [
            85.4,
            13.2,
            1.3,
            0.1,
            0.1
        ],
        "stars": "50",
        "summary": "一场谋杀案使银行家安迪(蒂姆•罗宾斯 Tim Robbins 饰)蒙冤入狱,谋杀妻子及其情人的指控将囚禁他终生。在肖申克监狱的首次现身就让监狱“大哥”瑞德(摩根•弗里曼 Morgan Freeman 饰)对他另眼相看...",
        "tags": [
            "经典",
            "励志",
             ...
        ],
        "title": "肖申克的救赎",
        "type": "Movie",
        "watching_count": 0,
        "wish_count": 361551,
        "year": 1994
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
idstring电影id
typestring类型,电影/剧集
titlestring中文名
org_titlestring原名
aka_titlearray其它译名
altstring豆瓣链接
yearint年份
posterstring海报链接
summarystring简介
genresarray类型
durationsarray时长
countriesarray国家
languagesarray语言
pubdatesarray上映时间
imdb_idstringIMDB id
episodesstring集数,仅type为剧集时有
averagefloat评分
starsstring星级
star_detailarray各星级占百分比
rating_countint评分人数
wish_countint想看人数
watching_countint在看人数
collect_countint看过人数
photo_numint图片总数
photosstring电影剧照,最多30张
celebrities_numint演职总数
celebritiesstring主要演职,最多6位
recommendarray相关推荐,最多10部
tagsarray电影标签
directorarray导演
authorarray编剧
actorarray演员
备注

2.2 电影演职人员

简要描述
  • 获取该电影全部演职人员
请求URL
  • /api/douban/movie/cast
请求方式
  • GET
参数
参数名必选类型说明
idstring电影id
返回示例
{
    "code": 200,
    "data": {
        "casts": [
            {
                "celebrities": [
                    {
                        "avatar": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p230.jpg",
                        "id": "1047973",
                        "name": "弗兰克·德拉邦特 Frank Darabont",
                        "role": "导演 Director"
                    }
                ],
                "role": "导演 Director"
            },
            {
                "celebrities": [
                    {
                        "avatar": "https://img9.doubanio.com/view/celebrity/s_ratio_celebrity/public/p17525.jpg",
                        "id": "1054521",
                        "name": "蒂姆·罗宾斯 Tim Robbins",
                        "role": "演员 Actor (饰 安迪·杜佛兰 Andy Dufresne)"
                    },
                    {
                        "avatar": "https://img3.doubanio.com/view/celebrity/s_ratio_celebrity/public/p34642.jpg",
                        "id": "1054534",
                        "name": "摩根·弗里曼 Morgan Freeman",
                        "role": "演员 Actor (饰 艾利斯·波伊德·“瑞德”·瑞丁 Ellis Boyd 'Red' Redding)"
                    },
                    ...
                ],
                "role": "演员 Cast"
            },
            ...
        ],
        "id": "1292052"
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
idstring电影id
castsarray演职人员数组
– rolestring职位中英名
– celebritiesarray该职位的人员信息
– – idstring职员豆瓣id
– – avatarstring职员头像链接
– – namestring职员中/英文名
– – rolestring扮演角色
备注

2.3 电影剧照海报

简要描述
  • 获取该电影剧照和海报
请求URL
  • /api/douban/movie/pic
请求方式
  • GET
参数
参数名必选类型说明
idstring电影id
typestring图片类型:S为剧照,R为海报
startint起点 *30
返回示例
 {
    "code": 200,
    "data": {
        "id": "1292052",
        "photos": [
            "https://img2.doubanio.com/view/photo/m/public/p2561714803.jpg",
            "https://img9.doubanio.com/view/photo/m/public/p2309770674.jpg",
            "https://img3.doubanio.com/view/photo/m/public/p456482220.jpg",
            ...
        ],
        "start": 0,
        "total": 575
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
idstring电影id
startint当前起点
totalint图片总数
photosarray图片链接,一次最多30张
备注
  • 图片大小默认为中等尺寸m,原图改链接中的m为r

2.4 电影获奖信息

简要描述
  • 获取该电影获奖信息
请求URL
  • /api/douban/movie/awards
请求方式
  • GET
参数
参数名必选类型说明
idstring电影id
返回示例
{
    "code": 200,
    "data": {
        "awards": [
            {
                "list": [
                    "最佳影片(提名) 妮基·马文",
                    "最佳男主角(提名) 摩根·弗里曼",
                    "最佳改编剧本(提名) 弗兰克·德拉邦特",
                     ...
                ],
                "name": "第67届奥斯卡金像奖(1995)"
            },
            {
                "list": [
                    "最佳外语片"
                ],
                "name": "第19届日本电影学院奖(1996)"
            },
            ...
        ],
        "id": "1292052"
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
idstring电影id
awardsarray获奖信息
– namestring电影节/奖名称
– listarray获得的奖项列表
备注

2.5 电影额外信息

简要描述
  • 获取电影额外信息,这里只保留了pt_info
请求URL
  • /api/douban/movie/extra
请求方式
  • GET
参数
参数名必选类型说明
idstring电影id
fieldstring此处只有pt_info
返回示例
 {
    "code": 200,
    "data": {
        "id": "1292052",
        "pt_info": "[img]https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp[/img]\n\n◎译  名 肖申克的救赎/月黑高飞(港)/刺激1995(台)/地狱诺言/铁窗岁月/消香克的救赎\n◎片  名 The Shawshank Redemption\n ...太长不展示了"
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
idstring电影id
pt_infostring生成的PT_info
备注
  • 一般用不上

3.1 影人基本信息

简要描述
  • 获取影人基本信息
请求URL
  • /api/douban/person
请求方式
  • GET
参数
参数名必选类型说明
idstring影人id
返回示例
{
    "code": 200,
    "data": {
        "avatar": "https://img1.doubanio.com/view/celebrity/s_ratio_celebrity/public/p56339.jpg",
        "birthday": "1965-04-04",
        "born_place": "美国,纽约",
        "constellation": "白羊座",
        "gender": "男",
        "id": "1016681",
        "imdb_id": "nm0000375",
        "name": "小罗伯特·唐尼",
        "name_en": "Robert Downey Jr.",
        "partners": [
            {
                "avatar": "https://img9.doubanio.com/view/celebrity/s_ratio_celebrity/public/p15885.jpg",
                "id": "1040505",
                "name": "马克·鲁弗洛"
            },
           ...
        ],
        "photo_num": 1092,
        "photos": [
            "https://img9.doubanio.com/view/photo/m/public/p960012104.jpg",
            "https://img2.doubanio.com/view/photo/m/public/p2562580933.jpg",
            "https://img9.doubanio.com/view/photo/m/public/p737203514.jpg",
            ...
        ],
        "profession": [
            "演员",
            "制片人",
            "编剧",
            "配音"
        ],
        "summary": "小罗伯特·唐尼,美国男演员。7岁时在父亲的电影《Greaser's Palace》中饰演角色,8岁时父亲递给了他人生第一支大麻烟,10岁时全家居住在伦敦,他参加了切尔西著名的Perry House School 学习古典芭蕾。...",
        "work_num": 130,
        "works": [
            {
                "average": 0.0,
                "id": "10546745",
                "poster": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1966199971.jpg",
                "stars": "00",
                "title": "木偶奇遇记"
            },
            {
                "average": 0.0,
                "id": "20451138",
                "poster": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2570486869.jpg",
                "stars": "00",
                "title": "大侦探福尔摩斯3"
            },
           ...
        ]
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
idstring影人id
namestring中文名
name_enstring英文名
genderstring性别
avatarstring头像链接
birthdaystring出生日期
born_placestring出生地
constellationstring星座
professionarray职业
summarystring简介
imdb_idstringIMDB id
photo_numint图片总数
photosarray图片链接,最多30张
work_numint作品总数
worksarray最新作品,最多10部
partnersarray合作2次以上的人,最多6位
备注
  • 暂无

3.2 影人图片

简要描述
  • 获取影人图片
请求URL
  • /api/douban/person/pic
请求方式
  • GET
参数
参数名必选类型说明
idstring影人id
startint起点 *30
返回示例
 {
    "code": 200,
    "data": {
        "id": "1016681",
        "photos": [
            "https://img9.doubanio.com/view/photo/m/public/p960012104.jpg",
            "https://img2.doubanio.com/view/photo/m/public/p2562580933.jpg",
            "https://img9.doubanio.com/view/photo/m/public/p737203514.jpg",
            ...
        ],
        "start": 0,
        "total": 1092
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
idstring影人id
startint当前起点
totalint图片总数
photosarray图片链接,一次最多30张
备注
  • 图片大小默认为中等尺寸m,原图改链接中的m为r

3.3 影人作品

简要描述
  • 获取影人作品
请求URL
  • /api/douban/person/work
请求方式
  • GET
参数
参数名必选类型说明
idstring影人id
sortstring排序方式,按时间time,按评价vote
startint起点 *10
返回示例
{
    "code": 200,
    "data": {
        "id": "1016681",
        "start": 0,
        "total": 130,
        "works": [
            {
                "average": 0.0,
                "id": "10546745",
                "poster": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p1966199971.jpg",
                "stars": "00",
                "title": "木偶奇遇记"
            },
            {
                "average": 0.0,
                "id": "20451138",
                "poster": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2570486869.jpg",
                "stars": "00",
                "title": "大侦探福尔摩斯3"
            },
            {
                "average": 5.9,
                "id": "27000981",
                "poster": "https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2614594787.jpg",
                "stars": "30",
                "title": "多力特的奇幻冒险"
            },
            ...
        ]
    },
    "msg": "获取成功"
}
返回参数说明
参数名类型说明
idstring影人id
startint当前起点
totalint作品总数
worksarray作品列表,一次最多10部
备注

评论

  1. 博主
    2 年前
    2022-2-07 14:36:31

    由于豆瓣网站调整,部分爬虫可能有问题。

发送评论 编辑评论


				
上一篇
下一篇