您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。