在数据分析和机器学习的实践中,数据的获取往往是第一步。对于电影爱好者来说,豆瓣TOP250榜单无疑是一个极具价值的数据来源。本文将带你用 Python 编写爬虫,轻松抓取豆瓣TOP250电影的信息,并分享一些实战中的避坑经验。我们将探讨如何利用 Python 爬取豆瓣 TOP250 数据,为后续的数据分析做好准备。
准备工作
首先,我们需要安装必要的 Python 库。这里主要用到 requests 用于发送 HTTP 请求,BeautifulSoup4 用于解析 HTML 内容,以及 lxml 作为 BeautifulSoup 的解析器。
pip install requests beautifulsoup4 lxml
核心代码实现
以下是爬取豆瓣TOP250的核心代码,包含了请求发送、页面解析和数据提取等步骤。
import requests
from bs4 import BeautifulSoup
import csv
# 设置请求头,模拟浏览器访问
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'
}
# 豆瓣 TOP250 电影的 URL
url = 'https://movie.douban.com/top250'
# 创建 CSV 文件保存数据
with open('douban_top250.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['电影排名', '电影名称', '导演', '主演', '上映年份', '评分', '评价人数', '链接'])
for i in range(0, 250, 25): # 豆瓣每页显示 25 部电影,共 10 页
start_url = url + f'?start={i}&filter='
response = requests.get(start_url, headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
movie_list = soup.find('ol', class_='grid_view').find_all('li')
for movie in movie_list:
rank = movie.find('em', class_='').text # 电影排名
title = movie.find('span', class_='title').text # 电影名称
detail = movie.find('div', class_='bd').p.text.strip().split('\n')
director_actors = detail[0].strip().replace(' ', '').replace('\xa0', '') # 导演和主演
director = director_actors.split('导演:')[1].split('主演:')[0] if '导演:' in director_actors else '' # 导演
actors = director_actors.split('主演:')[1] if '主演:' in director_actors else '' # 主演
year = detail[1].strip().split('/')[0].strip() # 上映年份
rating = movie.find('span', class_='rating_num').text # 评分
votes = movie.find('div', class_='star').find_all('span')[-1].text.replace('人评价', '') # 评价人数
link = movie.find('div', class_='hd').a['href'] # 电影链接
writer.writerow([rank, title, director, actors, year, rating, votes, link])
print('数据爬取完成,已保存到 douban_top250.csv')
爬虫优化与反爬策略
豆瓣有一定的反爬机制,为了保证爬虫的稳定运行,我们需要采取一些优化措施:
- User-Agent 伪装:通过设置
User-Agent模拟浏览器访问,避免被识别为爬虫。可以维护一个User-Agent池,每次请求随机选择一个。 - 请求频率控制:设置合理的请求间隔,避免对服务器造成过大压力。可以使用
time.sleep()函数来控制请求频率。 - IP 代理:使用 IP 代理可以有效避免 IP 被封禁。可以购买付费的 IP 代理服务,或者使用免费的代理 IP(但稳定性较差)。
- 异常处理:添加异常处理机制,例如使用
try...except捕获requests.exceptions.RequestException异常,避免程序因网络问题而崩溃。
实战避坑经验
- 页面结构变化:豆瓣的页面结构可能会发生变化,需要定期检查爬虫代码,并根据新的页面结构进行调整。
- 编码问题:豆瓣页面采用 UTF-8 编码,需要确保 Python 代码也使用 UTF-8 编码,避免出现乱码问题。
- 反爬升级:豆瓣的反爬策略可能会不断升级,需要不断学习新的反爬技术,并更新爬虫代码。
- 数据清洗:爬取到的数据可能存在一些噪音,例如空格、换行符等,需要进行数据清洗,保证数据的质量。
数据存储与分析
爬取到的数据可以保存到 CSV 文件中,也可以保存到数据库中,例如 MySQL 或 MongoDB。 使用 Python 的 pandas 库可以方便地对数据进行分析和可视化。
总结
本文介绍了如何使用 Python 爬取豆瓣TOP250电影的数据,并分享了一些实战中的避坑经验。希望本文能够帮助你快速入门 Python 爬虫,并成功抓取豆瓣TOP250的数据。记住,在进行爬虫活动时,一定要遵守网站的 robots.txt 协议,尊重网站的权益。同时,高并发的爬虫可能会对目标网站的服务器造成压力,我们可以考虑使用 Nginx 反向代理和负载均衡来分摊流量,避免对服务器造成过大的影响。如果并发连接数过高,还可以考虑使用宝塔面板进行服务器管理和优化。
冠军资讯
键盘上的咸鱼