溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2022-01-17 12:06:04 來源:億速云 閱讀:190 作者:kk 欄目:開發技術
# 怎么用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 法律與道德須知

  • 嚴格遵守豆瓣的robots.txt協議
  • 設置合理的爬取間隔(建議≥3秒/頁)
  • 不要對服務器造成過大壓力
  • 僅用于學習目的,不進行商業用途

二、分析豆瓣電影頁面結構

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錯誤)

  • 解決方案:更換User-Agent,使用代理IP,增加請求間隔

8.2 數據解析失敗

  • 解決方案:添加異常處理,使用更健壯的CSS選擇器

8.3 速度太慢

  • 解決方案:使用異步請求(asyncio+aiohttp),但要注意不要給服務器造成壓力

九、項目擴展方向

  1. 增加數據字段:爬取電影的海報、劇情簡介、獲獎情況等
  2. 情感分析:對電影短評進行情感傾向分析
  3. 可視化展示:使用Pyecharts制作交互式數據看板
  4. 持久化存儲:將數據存入MySQLMongoDB數據庫

結語

本文詳細介紹了使用Python爬取豆瓣電影Top100的完整流程,從頁面分析到數據存儲,再到簡單的數據分析。需要注意的是,網絡爬蟲技術應當合法合規使用,尊重網站的數據權益。希望本文能幫助讀者掌握基礎的網絡爬蟲技能,為后續的數據分析項目打下基礎。

注意:實際運行時請根據豆瓣網站的最新頁面結構調整解析邏輯,并確保遵守相關法律法規和網站的使用條款。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女