# 怎么用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
豆瓣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頁。
通過瀏覽器開發者工具(F12)檢查元素,發現關鍵信息位于:
- 電影條目:<div class="item">
- 電影名稱:<span class="title">
- 評分:<span class="rating_num">
- 基本信息:<div class="bd">
中的<p class="">
- 短評數量:<div class="star">
中的最后一個<span>
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
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']
}
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部
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)
def save_to_excel(movies, filename='douban_top100.xlsx'):
df = pd.DataFrame(movies)
df.to_excel(filename, index=False, encoding='utf-8-sig')
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
]
proxies = {
'http': 'http://127.0.0.1:1080',
'https': 'https://127.0.0.1:1080'
}
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()
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()
country_counts = df['國家'].value_counts()
country_counts.plot(kind='bar', figsize=(12,6))
plt.title('豆瓣Top100電影國家/地區分布')
plt.ylabel('電影數量')
plt.xticks(rotation=45)
plt.show()
本文詳細介紹了使用Python爬取豆瓣電影Top100的完整流程,從頁面分析到數據存儲,再到簡單的數據分析。需要注意的是,網絡爬蟲技術應當合法合規使用,尊重網站的數據權益。希望本文能幫助讀者掌握基礎的網絡爬蟲技能,為后續的數據分析項目打下基礎。
注意:實際運行時請根據豆瓣網站的最新頁面結構調整解析邏輯,并確保遵守相關法律法規和網站的使用條款。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。