溫馨提示×

溫馨提示×

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

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

Python怎么爬取豆瓣電影排行信息

發布時間:2021-11-23 11:36:13 來源:億速云 閱讀:340 作者:iii 欄目:大數據
# Python怎么爬取豆瓣電影排行信息

## 目錄
1. [引言](#引言)
2. [準備工作](#準備工作)
   - [環境配置](#環境配置)
   - [分析目標網頁](#分析目標網頁)
3. [基礎爬蟲實現](#基礎爬蟲實現)
   - [requests庫使用](#requests庫使用)
   - [解析HTML](#解析html)
4. [進階技巧](#進階技巧)
   - [處理反爬機制](#處理反爬機制)
   - [數據存儲](#數據存儲)
5. [完整代碼示例](#完整代碼示例)
6. [注意事項](#注意事項)
7. [總結](#總結)

---

## 引言

在當今大數據時代,網絡爬蟲技術已成為獲取互聯網信息的重要手段。豆瓣電影作為國內權威的電影評分平臺,其排行榜數據對影視分析、市場研究等具有重要意義。本文將詳細介紹如何使用Python爬取豆瓣電影Top250的完整流程,涵蓋從基礎請求到數據存儲的全過程。

---

## 準備工作

### 環境配置

```python
# 所需庫安裝
pip install requests beautifulsoup4 pandas

核心工具說明: - requests:網絡請求庫 - BeautifulSoup:HTML解析庫 - pandas:數據處理庫

分析目標網頁

打開豆瓣電影Top250頁面(https://movie.douban.com/top250),通過瀏覽器開發者工具(F12)觀察:

  1. 頁面結構:每頁25條,共10頁
  2. 數據位置:電影信息位于<div class="item">標簽內
  3. 翻頁邏輯:URL參數?start=控制偏移量

關鍵數據字段: - 電影名稱 - 評分 - 評價人數 - 經典臺詞 - 導演/主演信息


基礎爬蟲實現

requests庫使用

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}

def get_page(url):
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
    except requests.RequestException as e:
        print(f'請求失敗: {e}')
        return None

解析HTML

from bs4 import BeautifulSoup

def parse_html(html):
    soup = BeautifulSoup(html, 'lxml')
    items = soup.find_all('div', class_='item')
    
    for item in items:
        title = item.find('span', class_='title').text
        rating = item.find('span', class_='rating_num').text
        yield {
            'title': title,
            'rating': rating
        }

進階技巧

處理反爬機制

  1. 請求頭偽裝
headers = {
    'User-Agent': 'Mozilla/5.0',
    'Referer': 'https://movie.douban.com/',
    'Cookie': '您的實際cookie'
}
  1. IP代理設置
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'http://10.10.1.10:1080'
}
response = requests.get(url, proxies=proxies)
  1. 請求間隔控制
import time
time.sleep(random.uniform(1, 3))

數據存儲

  1. CSV存儲
import pandas as pd

df = pd.DataFrame(data_list)
df.to_csv('douban_top250.csv', index=False)
  1. MySQL存儲
import pymysql

conn = pymysql.connect(host='localhost', user='root', password='123456', db='spider')
cursor = conn.cursor()
insert_sql = "INSERT INTO movies(title, rating) VALUES(%s, %s)"
cursor.executemany(insert_sql, data_list)
conn.commit()

完整代碼示例

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

class DoubanSpider:
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
        }
        self.base_url = 'https://movie.douban.com/top250?start='
    
    def get_page(self, offset):
        url = self.base_url + str(offset)
        try:
            response = requests.get(url, headers=self.headers)
            if response.status_code == 200:
                return response.text
            return None
        except Exception as e:
            print(e)
            return None
    
    def parse_page(self, html):
        soup = BeautifulSoup(html, 'lxml')
        items = soup.find_all('div', class_='item')
        
        for item in items:
            yield {
                '排名': item.find('em').text,
                '標題': item.find('span', class_='title').text,
                '評分': item.find('span', class_='rating_num').text,
                '評價人數': item.find('div', class_='star').find_all('span')[-1].text[:-3],
                '短評': item.find('span', class_='inq').text if item.find('span', class_='inq') else ''
            }
    
    def save_to_csv(self, items):
        df = pd.DataFrame(items)
        df.to_csv('douban_top250.csv', mode='a', header=False, index=False)
    
    def main(self):
        all_items = []
        for i in range(0, 250, 25):
            html = self.get_page(i)
            items = self.parse_page(html)
            all_items.extend(items)
            time.sleep(random.randint(1,3))
        
        self.save_to_csv(all_items)

if __name__ == '__main__':
    spider = DoubanSpider()
    spider.main()

注意事項

  1. 法律合規性

    • 遵守豆瓣robots.txt協議
    • 控制請求頻率(建議≥3秒/次)
    • 僅用于學習研究
  2. 異常處理

    • 網絡請求異常
    • 數據解析異常
    • 存儲過程異常
  3. 性能優化

    • 使用連接池
    • 異步請求(aiohttp)
    • 分布式爬蟲架構

總結

本文詳細講解了: 1. 豆瓣電影數據的抓取全流程 2. 反爬措施的應對方案 3. 數據的多種存儲方式

進階學習方向: - Scrapy框架的使用 - 動態頁面渲染(Selenium) - 驗證碼識別技術

通過合理控制爬取頻率,我們可以高效獲取豆瓣電影數據,為后續數據分析提供可靠的數據源。

(注:實際字數根據具體內容展開可達5500字左右,此處為框架性示例) “`

這篇文章提供了完整的Markdown格式內容,包含: 1. 詳細的技術實現步驟 2. 代碼示例和解釋 3. 反爬策略說明 4. 數據存儲方案 5. 完整的可執行代碼

如需擴展到5500字,可以在每個章節添加: - 更多原理性說明 - 異常處理細節 - 性能優化方案 - 法律風險分析 - 其他相關技術對比等內容

向AI問一下細節

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

AI

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