Python爬取豆瓣电影信息
本文最后更新于:2 年前
前言
前人如R酱很多都有开发豆瓣获取的API,但是可能不知道哪天就用不上了,所以自己写一个python版本留存好了。
代码
需要一点bs4的基础,request及json的基本使用,话不多说,上代码:
import requests
from bs4 import BeautifulSoup
import json
def get_douban_info(url):
# 自定义一个请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/'
'537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
session = requests.session() # 开启一个session
session.keep_alive = False
session.headers = headers
try:
response = session.get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
json_value = soup.select('script[type="application/ld+json"]')[0].getText()
douban_info = json.loads(json_value)
print(douban_info)
except Exception as exc:
print(exc)
if __name__ == '__main__':
douban_url = "https://movie.douban.com/subject/30458949/" # 用于测试的豆瓣链接
get_douban_info(douban_url)
运行结果输出的是json,通过格式化一下输出结果展示:
{
'@context': 'http://schema.org',
'name': '无依之地 Nomadland',
'url': '/subject/30458949/',
'image': 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2630453887.jpg',
'director': [
{
'@type': 'Person',
'url': '/celebrity/1349079/',
'name': '赵婷 Chloé Zhao'
}
],
'author': [
{
'@type': 'Person',
'url': '/celebrity/1349079/',
'name': '赵婷 Chloé Zhao'
},
{
'@type': 'Person',
'url': '/celebrity/1444467/',
'name': '杰西卡·布鲁德 Jessica Bruder'
}
],
'actor': [
{
'@type': 'Person',
'url': '/celebrity/1010548/',
'name': '弗兰西斯·麦克多蒙德 Frances McDormand'
},
{
'@type': 'Person',
'url': '/celebrity/1007009/',
'name': '大卫·斯特雷泽恩 David Strathairn'
},
{
'@type': 'Person',
'url': '/celebrity/1384822/',
'name': '德里克·贾尼斯 Derrick Janis'
},
{
'@type': 'Person',
'url': '/celebrity/1148827/',
'name': '泰·斯特雷泽恩 Tay Strathairn'
},
{
'@type': 'Person',
'url': '/celebrity/1384817/',
'name': '卡特·克利福德 Cat Clifford'
},
{
'@type': 'Person',
'url': '/celebrity/1384767/',
'name': '彼得·斯皮尔斯 Peter Spears'
},
{
'@type': 'Person',
'url': '/celebrity/1444468/',
'name': '盖伊·德福雷斯特 Gay DeForest'
},
{
'@type': 'Person',
'url': '/celebrity/1444469/',
'name': '帕特里夏·格里尔 Patricia Grier'
},
{
'@type': 'Person',
'url': '/celebrity/1444470/',
'name': '琳达·梅 Linda May'
},
{
'@type': 'Person',
'url': '/celebrity/1444471/',
'name': '安吉拉·雷耶斯 Angela Reyes'
},
{
'@type': 'Person',
'url': '/celebrity/1444472/',
'name': '卡尔·R·休斯 Carl R. Hughes'
},
{
'@type': 'Person',
'url': '/celebrity/1444473/',
'name': '道格拉斯·G·苏尔 Douglas G. Soul'
},
{
'@type': 'Person',
'url': '/celebrity/1444474/',
'name': '瑞安·阿基诺 Ryan Aquino'
},
{
'@type': 'Person',
'url': '/celebrity/1444475/',
'name': '特蕾莎·布坎南 Teresa Buchanan'
},
{
'@type': 'Person',
'url': '/celebrity/1444476/',
'name': '凯莉·林恩·麦克德莫特·怀尔德 Karie Lynn McDermott Wilder'
},
{
'@type': 'Person',
'url': '/celebrity/1444477/',
'name': '布兰迪·威尔伯 Brandy Wilber'
},
{
'@type': 'Person',
'url': '/celebrity/1444478/',
'name': '马克西·埃切维里 Makenzie Etcheverry'
},
{
'@type': 'Person',
'url': '/celebrity/1444479/',
'name': '鲍勃·威尔斯 Bob Wells'
},
{
'@type': 'Person',
'url': '/celebrity/1444480/',
'name': '安妮特·威尔斯 Annette Wells'
},
{
'@type': 'Person',
'url': '/celebrity/1444481/',
'name': '瑞秋·班农 Rachel Bannon'
},
{
'@type': 'Person',
'url': '/celebrity/1444482/',
'name': '夏琳·斯旺基 Charlene Swankie'
}
],
'datePublished': '2020-09-11',
'genre': [
'剧情'
],
'duration': 'PT1H48M',
'description': '基于Jessica Bruder所著书籍《Nomadland: Surviving America in the Twenty-First Century》,讲述一个60多岁的女人在经济大萧条中失去了...',
'@type': 'Movie',
'aggregateRating': {
'@type': 'AggregateRating',
'ratingCount': '82767',
'bestRating': '10',
'worstRating': '2',
'ratingValue': '8.3'
}
}
那么我们就可以根据返回的东西构造自己的简介了。
其他的API
之前看到一个API可以使用,也在这里介绍一下吧。一个新的豆瓣API替代接口,可获取豆瓣、IMDB、烂番茄的电影/电视剧双语(中英)数据:
调用的python程序,依据上边的改版一下即可:
import requests
import json
import re
def get_douban_info_use_api(url):
img_api_url = 'https://movie.querydata.org/api/generateimage?id ={id}&lang=Cn'
api_url = 'https://movie.querydata.org/api?id='
douban_id = re.search(r"subject/(\d+)", url).group(1)
req_url = api_url + douban_id
data = requests.get(req_url).json()
print(data)
if __name__ == '__main__':
douban_url = "https://movie.douban.com/subject/30458949/"
get_douban_info_use_api(douban_url)
输出结果格式化显示为:
{
'id': '5fedf65d2c3842603f71871d',
'originalName': 'Nomadland',
'imdbVotes': 1891,
'imdbRating': '7.9',
'rottenVotes': 201,
'rottenRating': '97',
'doubanId': '30458949',
'imdbId': 'tt9770150',
'alias': '游牧人生(台) / 浪迹天地(港) / 游牧之地',
'doubanVotes': 1098,
'doubanRating': '8.7',
'year': '2020',
'type': 'Movie',
'duration': 6480,
'dateReleased': '2020-09-11T08:00:00.000+08:00',
'totalSeasons': None,
'episodes': None,
'data': [
{
'genre': '剧情',
'name': '无依之地',
'lang': 'Cn',
'language': '英语',
'poster': 'https://image.querydata.org/movie/poster/1609430622982-4fca62.jpg',
'description': '基于Jessica Bruder所著书籍《Nomadland: Surviving America in the Twenty-First Century》,讲述一个60多岁的女人在经济大萧条中失去了...',
'country': '美国'
},
{
'genre': 'Drama',
'name': 'Nomadland',
'lang': 'En',
'language': 'English',
'poster': 'https://image.querydata.org/movie/poster/1609430624461-feg6bf.jpg',
'description': 'After losing everything in the Great Recession, a woman embarks on a journey through the American West, living as a van-dwelling modern-day nomad.',
'country': 'USA, Germany'
}
],
'director': [
{
'data': [
{
'name': '赵婷',
'lang': 'Cn'
},
{
'name': 'Chloé Zhao',
'lang': 'En'
}
]
}
],
'actor': [
{
'data': [
{
'name': '卡特·克利福德',
'lang': 'Cn'
},
{
'name': 'Cat Clifford',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '德里克·贾尼斯',
'lang': 'Cn'
},
{
'name': 'Derrick Janis',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '大卫·斯特雷泽恩',
'lang': 'Cn'
},
{
'name': 'David Strathairn',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '弗兰西斯·麦克多蒙德',
'lang': 'Cn'
},
{
'name': 'Frances McDormand',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '泰·斯特雷泽恩',
'lang': 'Cn'
},
{
'name': 'Tay Strathairn',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '彼得·斯皮尔斯',
'lang': 'Cn'
},
{
'name': 'Peter Spears',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '盖伊·德福雷斯特',
'lang': 'Cn'
},
{
'name': 'Gay DeForest',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '帕特里夏·格里尔',
'lang': 'Cn'
},
{
'name': 'Patricia Grier',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '琳达·梅',
'lang': 'Cn'
},
{
'name': 'Linda May',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '安吉拉·雷耶斯',
'lang': 'Cn'
},
{
'name': 'Angela Reyes',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '卡尔·休斯',
'lang': 'Cn'
},
{
'name': 'Carl R. Hughes',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '道格拉斯·g·苏尔',
'lang': 'Cn'
},
{
'name': 'Douglas G. Soul',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '瑞安·阿基诺',
'lang': 'Cn'
},
{
'name': 'Ryan Aquino',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '特蕾莎·布坎南',
'lang': 'Cn'
},
{
'name': 'Teresa Buchanan',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '凯莉·林恩·麦克德莫特·怀尔德',
'lang': 'Cn'
},
{
'name': 'Karie Lynn McDermott Wilder',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '白兰地·威尔伯',
'lang': 'Cn'
},
{
'name': 'Brandy Wilber',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '马克西·埃切维里',
'lang': 'Cn'
},
{
'name': 'Makenzie Etcheverry',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '鲍勃·威尔斯',
'lang': 'Cn'
},
{
'name': 'Bob Wells',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '安妮特·威尔斯',
'lang': 'Cn'
},
{
'name': 'Annette Wells',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '雷切尔·班农',
'lang': 'Cn'
},
{
'name': 'Rachel Bannon',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '斯旺基',
'lang': 'Cn'
},
{
'name': 'Swankie',
'lang': 'En'
}
]
}
],
'writer': [
{
'data': [
{
'name': '赵婷',
'lang': 'Cn'
},
{
'name': 'Chloé Zhao',
'lang': 'En'
}
]
},
{
'data': [
{
'name': '杰西卡·布鲁德',
'lang': 'Cn'
},
{
'name': 'Jessica Bruder',
'lang': 'En'
}
]
}
]
}
好像基本上大同小异哈,本次教程就到这里。
总结
API好用是好用,但是总担心哪一天就用不了了。今天这个好处就是豆瓣自己提供的json格式的简介,应该能够一直用吧,可以把这些代码写进自己的项目或者工具里,如果喜欢这篇文章,可以多多分享,谢谢大家~