怎么用python爬取豆瓣前一百电影

发布时间:2022-01-17 12:06:04 作者:kk
来源:亿速云 阅读:176
# 怎么用Python爬取豆瓣前一百电影

## 前言

在当今大数据时代,网络爬虫已成为获取互联网数据的重要技术手段。Python凭借其丰富的库和简洁的语法,成为网络爬虫开发的首选语言。本文将详细介绍如何使用Python爬取豆瓣电影Top250中的前100部电影信息(由于豆瓣Top250是固定榜单,前100名需要从完整榜单中提取),包括电影名称、评分、导演、主演、上映年份等关键信息。

## 一、准备工作

### 1.1 技术准备

在开始爬取之前,需要确保已安装以下Python库:

```python
import requests
from bs4 import BeautifulSoup
import re
import time
import csv
import pandas as pd

安装方法:

pip install requests beautifulsoup4 pandas

1.2 法律与道德须知

二、分析豆瓣电影页面结构

2.1 页面URL分析

豆瓣Top250的URL分页规律:

https://movie.douban.com/top250?start=0   # 第1页
https://movie.douban.com/top250?start=25  # 第2页
...
https://movie.douban.com/top250?start=225 # 第10页

每页显示25部电影,前100名需要爬取1-4页。

2.2 HTML结构分析

通过浏览器开发者工具(F12)检查元素,发现关键信息位于: - 电影条目:<div class="item"> - 电影名称:<span class="title"> - 评分:<span class="rating_num"> - 基本信息:<div class="bd">中的<p class=""> - 短评数量:<div class="star">中的最后一个<span>

三、爬虫实现步骤

3.1 基础爬取函数

def get_one_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except requests.exceptions.RequestException:
        print(f"请求失败: {url}")
        return None

3.2 解析页面数据

def parse_one_page(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('div', class_='item')
    
    for item in items:
        yield {
            '排名': item.find('em').get_text(),
            '电影名称': item.find('span', class_='title').get_text(),
            '评分': item.find('span', class_='rating_num').get_text(),
            '评价人数': item.find('div', class_='star').find_all('span')[-1].get_text()[:-3],
            '导演与主演': item.find('p', class_='').get_text().strip().replace('\n', ' ').replace(' ', ''),
            '年份': re.search(r'\d{4}', item.find('p', class_='').get_text()).group(),
            '国家': re.search(r'/\s(.*?)\s/', item.find('p', class_='').get_text()).group(1),
            '类型': item.find('p', class_='').get_text().split('/')[-1].strip(),
            '链接': item.find('a')['href']
        }

3.3 主爬取逻辑

def main():
    base_url = "https://movie.douban.com/top250?start="
    movies = []
    
    for i in range(0, 100, 25):  # 爬取前4页
        url = base_url + str(i)
        html = get_one_page(url)
        movies.extend(list(parse_one_page(html)))
        time.sleep(3)  # 遵守爬虫道德
        
    return movies[:100]  # 确保只返回100部

四、数据存储与处理

4.1 保存为CSV文件

def save_to_csv(movies, filename='douban_top100.csv'):
    with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
        fieldnames = ['排名', '电影名称', '评分', '评价人数', '导演与主演', '年份', '国家', '类型', '链接']
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(movies)

4.2 保存为Excel

def save_to_excel(movies, filename='douban_top100.xlsx'):
    df = pd.DataFrame(movies)
    df.to_excel(filename, index=False, encoding='utf-8-sig')

五、反反爬策略

5.1 常见反爬措施

  1. User-Agent轮换
user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...',
    # 添加更多User-Agent
]
  1. IP代理池
proxies = {
    'http': 'http://127.0.0.1:1080',
    'https': 'https://127.0.0.1:1080'
}
  1. 请求间隔随机化
time.sleep(random.uniform(1, 5))

六、完整代码示例

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

def get_one_page(url):
    headers = {
        'User-Agent': random.choice(user_agents)
    }
    try:
        response = requests.get(url, headers=headers, proxies=proxies)
        if response.status_code == 200:
            return response.text
        return None
    except Exception as e:
        print(f"请求失败: {url}, 错误: {e}")
        return None

def parse_one_page(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('div', class_='item')
    
    for item in items:
        try:
            yield {
                '排名': item.find('em').get_text(),
                '电影名称': item.find('span', class_='title').get_text(),
                '评分': item.find('span', class_='rating_num').get_text(),
                '评价人数': item.find('div', class_='star').find_all('span')[-1].get_text()[:-3],
                '导演与主演': ' '.join(item.find('p', class_='').get_text().strip().split()),
                '年份': re.search(r'\d{4}', item.find('p', class_='').get_text()).group(),
                '国家': re.search(r'/\s(.*?)\s/', item.find('p', class_='').get_text()).group(1),
                '类型': item.find('p', class_='').get_text().split('/')[-1].strip(),
                '链接': item.find('a')['href']
            }
        except Exception as e:
            print(f"解析出错: {e}")
            continue

def main():
    base_url = "https://movie.douban.com/top250?start="
    movies = []
    
    for i in range(0, 100, 25):
        url = base_url + str(i)
        html = get_one_page(url)
        if html:
            movies.extend(list(parse_one_page(html)))
        time.sleep(random.uniform(2, 5))
        
    save_to_csv(movies)
    save_to_excel(movies)
    print(f"成功爬取{len(movies)}部电影数据")
    
if __name__ == '__main__':
    main()

七、数据分析示例

7.1 评分分布分析

import matplotlib.pyplot as plt

df = pd.read_csv('douban_top100.csv')
df['评分'] = df['评分'].astype(float)

plt.figure(figsize=(10,6))
plt.hist(df['评分'], bins=10, edgecolor='black')
plt.title('豆瓣Top100电影评分分布')
plt.xlabel('评分')
plt.ylabel('电影数量')
plt.show()

7.2 国家/地区统计

country_counts = df['国家'].value_counts()
country_counts.plot(kind='bar', figsize=(12,6))
plt.title('豆瓣Top100电影国家/地区分布')
plt.ylabel('电影数量')
plt.xticks(rotation=45)
plt.show()

八、常见问题与解决方案

8.1 请求被拒绝(403错误)

8.2 数据解析失败

8.3 速度太慢

九、项目扩展方向

  1. 增加数据字段:爬取电影的海报、剧情简介、获奖情况等
  2. 情感分析:对电影短评进行情感倾向分析
  3. 可视化展示:使用Pyecharts制作交互式数据看板
  4. 持久化存储:将数据存入MySQLMongoDB数据库

结语

本文详细介绍了使用Python爬取豆瓣电影Top100的完整流程,从页面分析到数据存储,再到简单的数据分析。需要注意的是,网络爬虫技术应当合法合规使用,尊重网站的数据权益。希望本文能帮助读者掌握基础的网络爬虫技能,为后续的数据分析项目打下基础。

注意:实际运行时请根据豆瓣网站的最新页面结构调整解析逻辑,并确保遵守相关法律法规和网站的使用条款。 “`

推荐阅读:
  1. Python爬取豆瓣高分电影前250名
  2. Python利用Scrapy框架爬取豆瓣电影示例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:C#数据类型转换有哪些

下一篇:怎么用python画个奥运五环

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》