豆瓣电影爬虫,让我看看最近都有什么电影

325 阅读2分钟

最近天气越来越热了,电影院也上映了许多新电影,很适合去电影院看一看,豆瓣电影提供了一个页面来展示正在上映的新片。不过,这个页面提供的信息比较简略,如果想了解电影的详细信息,还需要点开一个个看,非常不方便。不过,这个页面也储存了电影的演员等详细信息,我们可以写一个爬虫来获取信息并存储到EXCEL表格。

image.png

我们先访问一下豆瓣: movie.douban.com/cinema/nowp… 作者是厦门的,因此查看厦门的信息,大家可以根据需要查询其他城市。

我们用到requests、Beautifulsoup、pandas库来完成这个爬虫,先导入三个库。

import requests
from bs4 import BeautifulSoup
import pandas as pd

然后用requests访问豆瓣,并加上请求头。

url = 'https://movie.douban.com/cinema/nowplaying/xiamen/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

用Beautifulsoup来解析数据,同时我们在网页上按F12,发现电影信息存在<ul class="lists">标签下,用find_all方法进行查询,获得一个列表,列表由0开始,发现我们需要的电影信息存在第三位,因此soup.find_all("ul","class"=="lists")[2],然后我们再用find_all方法将每条电影信息存入列表。

image.png

soup = BeautifulSoup(response.text, 'html.parser')
soup = soup.find_all("ul","class"=="lists")[2]
soups = soup.find_all('li',class_="list-item")

最后遍历列表提取我们需要的信息,包括电影名、评分、上映时间、导演、演员等,这里可以利用数据的标签获取需要的信息。这里要记得创建一个空列表movies来存储所有电影的信息,用一个字典data来给每部电影的信息分类。

movies = []
for movie in soups:
    title = movie["data-title"]
    rating = movie["data-score"]
    release_date = movie["data-release"]
    director = movie["data-director"]
    actors = movie["data-actors"]
    duration = movie["data-duration"]
    link = movie.find("a")["href"]
    data = {
        '电影名': title,
        '评分': rating,
        '上映时间': release_date,
        '导演': director,
        '演员': ''.join(actors),
        "时长":duration,
        '链接': link
    }
    movies.append(data)

最后,将数据下载到本地,可以通过更改df.to_excel将数据保存到你需要的地方。

image.png

df = pd.DataFrame(movies)
df.to_excel('douban_movies.xlsx', index=False)

下面是完整代码。

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'https://movie.douban.com/cinema/nowplaying/xiamen/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)

soup = BeautifulSoup(response.text, 'html.parser')
soup = soup.find_all("ul","class"=="lists")[2]
soups = soup.find_all('li',class_="list-item")
# print(soups)
movies = []
for movie in soups:
    title = movie["data-title"]
    rating = movie["data-score"]
    release_date = movie["data-release"]
    director = movie["data-director"]
    actors = movie["data-actors"]
    duration = movie["data-duration"]
    link = movie.find("a")["href"]
    data = {
        '电影名': title,
        '评分': rating,
        '上映时间': release_date,
        '导演': director,
        '演员': ''.join(actors),
        "时长":duration,
        '链接': link
    }
    movies.append(data)
# print(movies)
df = pd.DataFrame(movies)
df.to_excel('douban_movies.xlsx', index=False)