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格式的简介,应该能够一直用吧,可以把这些代码写进自己的项目或者工具里,如果喜欢这篇文章,可以多多分享,谢谢大家~

参考文章


Using BeautifulSoup to find tag with two specific styles

一个新的豆瓣API替代接口,可获取豆瓣、IMDB、烂番茄的电影/电视剧双语(中英)数据



本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!