如何用Python爬虫爬取猫眼等网站上的电影信息?

学校要求的项目是从猫眼和豆瓣上抓取 2015 年至今的电影信息,爬取数据需包含但不限于电影名,电影题材,电影演员,电影导演,当前累计票房,上映时间。

而且要求“数据爬取功能需满足登录用户在系统中输入一段时间,系统能够将时间段内爬取返还给用户”。

需要用分布式爬虫吗?我是第一次接触 python 爬虫。不知道如何解决这些问题。


如何用Python爬虫爬取猫眼等网站上的电影信息?
6 回复

github 上找下,这个肯定有类似现成的轮子。


import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random

# 伪装浏览器头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Connection': 'keep-alive'
}

def get_movie_info(url):
    """获取单页电影信息"""
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.raise_for_status()
        response.encoding = 'utf-8'
        
        soup = BeautifulSoup(response.text, 'html.parser')
        movies = []
        
        # 猫眼电影列表项选择器(需要根据实际网站结构调整)
        items = soup.select('.movie-item')
        
        for item in items:
            try:
                # 电影名称
                name = item.select_one('.movie-title').text.strip()
                
                # 评分
                score_elem = item.select_one('.score')
                score = score_elem.text.strip() if score_elem else '暂无评分'
                
                # 上映时间
                release_elem = item.select_one('.release-time')
                release = release_elem.text.strip() if release_elem else '未知'
                
                # 演员(示例选择器,实际需调整)
                actors_elem = item.select_one('.actors')
                actors = actors_elem.text.strip() if actors_elem else '未知'
                
                movies.append({
                    '电影名称': name,
                    '评分': score,
                    '上映时间': release,
                    '主演': actors
                })
                
            except AttributeError as e:
                print(f"解析单个电影时出错: {e}")
                continue
                
        return movies
        
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return []

def crawl_maoyan(pages=5):
    """爬取多页电影数据"""
    base_url = "https://maoyan.com/films?offset={}"
    all_movies = []
    
    for page in range(pages):
        offset = page * 30  # 猫眼每页30部电影
        url = base_url.format(offset)
        print(f"正在爬取第{page+1}页: {url}")
        
        movies = get_movie_info(url)
        all_movies.extend(movies)
        
        # 随机延迟避免被封
        time.sleep(random.uniform(1, 3))
    
    return all_movies

def save_to_csv(movies, filename='maoyan_movies.csv'):
    """保存数据到CSV文件"""
    if movies:
        df = pd.DataFrame(movies)
        df.to_csv(filename, index=False, encoding='utf-8-sig')
        print(f"数据已保存到 {filename}, 共{len(movies)}条记录")
    else:
        print("没有获取到数据")

if __name__ == "__main__":
    # 爬取5页电影数据
    movies_data = crawl_maoyan(pages=5)
    
    # 保存数据
    save_to_csv(movies_data)
    
    # 显示前几条数据
    if movies_data:
        print("\n前5条电影信息:")
        for i, movie in enumerate(movies_data[:5], 1):
            print(f"{i}. {movie['电影名称']} - 评分: {movie['评分']}")

# 重要说明:
# 1. 实际使用时需要检查猫眼网站的实际HTML结构,调整CSS选择器
# 2. 可能需要处理动态加载的内容(考虑使用Selenium)
# 3. 遵守网站的robots.txt和爬虫协议
# 4. 添加适当的异常处理和日志记录

核心要点:用requests获取页面,BeautifulSoup解析HTML,注意伪装请求头和设置延迟。

豆瓣有 api
猫眼的关键数据用字体加密的.

先爬数据再处理给用户返回,比如时间段

![]( )

看了一下,猫眼的票房是有做字体加密的,如果是第一次写爬虫的话可能有点难度;豆瓣是入门级,无难度随便爬。
“数据爬取功能需满足登录用户在系统中输入一段时间,系统能够将时间段内爬取返还给用户”这个需求的实现可以有两种方式:
1、数据实时性要求较高的
接口得到用户输入的时间段参数后再去爬,爬完格式化好了返回,缺点是速度可能较慢、容易触发反爬。
2、数据实时性要求不那么高的
爬虫和接口分开,爬虫每隔一段时间爬一次数据并存到数据库,接口得到时间段参数之后去查数据库就行了

量少没必要分布式,拿 requests 写都行

自学,写了很多小网站爬虫,可以看一下 --> https://github.com/wc110302/My-spider

回到顶部