scrapy爬虫爬取豆瓣电影top250
时间: 2025-07-04 21:11:47 浏览: 18
### 使用 Scrapy 爬取豆瓣电影 Top 250 数据
#### 构建 Scrapy 项目
要使用 Scrapy 框架爬取豆瓣电影 Top 250 数据,首先需要安装 Scrapy 并创建一个新的 Scrapy 项目。可以通过以下命令完成这些操作:
```bash
pip install scrapy
scrapy startproject douban_movie
```
这将在当前目录下生成一个名为 `douban_movie` 的项目文件夹。
---
#### 配置 Spider 文件
进入项目后,通过以下命令生成一个 Spider 文件来定义具体的爬取逻辑:
```bash
cd douban_movie
scrapy genspider top250 movie.douban.com
```
此命令会在 `spiders` 目录下生成一个名为 `top250.py` 的 Python 文件。以下是该文件的一个基本实现示例:
```python
import scrapy
class Top250Spider(scrapy.Spider):
name = 'top250'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
movies = response.css('div.item')
for movie in movies:
title = movie.css('.title::text').get()
rating = movie.css('.rating_num::text').get()
quote = movie.css('span.inq::text').get()
yield {
'title': title,
'rating': rating,
'quote': quote
}
next_page = response.css('link.next::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
```
这段代码实现了以下几个功能:
- 定义了一个名为 `top250` 的 Spider[^1]。
- 设置了允许访问的域名以及起始 URL。
- 提取每部电影的名称 (`title`)、评分 (`rating`) 和简介 (`quote`)。
- 自动处理分页,当存在下一页时继续请求新的页面[^3]。
---
#### 处理反爬机制
豆瓣网站可能存在一定的反爬措施,因此需要注意以下几点以提高成功率:
1. **设置 User-Agent**
修改项目的 `settings.py` 文件,指定合法的浏览器标识符:
```python
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'
```
2. **启用延迟下载**
同样在 `settings.py` 中配置下载间隔时间,避免频繁请求触发封禁:
```python
DOWNLOAD_DELAY = 2
```
3. **添加代理池(可选)**
如果遇到 IP 封禁问题,可以引入第三方库如 `scrapy-proxies` 来动态切换代理地址。
---
#### 存储抓取结果
Scrapy 支持多种数据导出方式,例如 JSON、CSV 或 MySQL 数据库。以下是几种常见的存储方法:
##### 导出为 JSON 文件
执行以下命令即可将抓取的结果保存为 JSON 文件:
```bash
scrapy crawl top250 -o top250.json
```
##### 导出为 CSV 文件
如果希望以表格形式查看数据,则可以选择导出为 CSV 格式:
```bash
scrapy crawl top250 -o top250.csv
```
##### 存入 MySQL 数据库
为了更灵活地管理和查询数据,还可以将其存入关系型数据库中。需先修改 `pipelines.py` 文件并更新 `settings.py` 配置项。具体步骤如下:
1. 编辑 `pipelines.py` 添加自定义管道类:
```python
import mysql.connector
class DoubanMoviePipeline:
def __init__(self):
self.conn = mysql.connector.connect(
host='localhost',
user='root',
password='your_password',
database='movies'
)
self.cursor = self.conn.cursor()
self.create_table()
def create_table(self):
self.cursor.execute("""
CREATE TABLE IF NOT EXISTS top250 (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
rating FLOAT,
quote TEXT
)
""")
def process_item(self, item, spider):
self.cursor.execute("""
INSERT INTO top250 (title, rating, quote)
VALUES (%s, %s, %s)
""", (item['title'], item['rating'], item['quote']))
self.conn.commit()
return item
def close_spider(self, spider):
self.cursor.close()
self.conn.close()
```
2. 更新 `settings.py` 开启管道支持:
```python
ITEM_PIPELINES = {'douban_movie.pipelines.DoubanMoviePipeline': 300}
```
之后运行爬虫程序时会自动将数据写入 MySQL 表格中[^2]。
---
#### 测试与调试
在正式部署前建议先测试单个页面的内容提取效果。可以在终端输入以下指令启动交互模式:
```bash
scrapy shell https://movie.douban.com/top250
```
利用返回的对象验证 CSS/XPath 表达式的准确性,确保字段定位无误后再投入批量采集阶段。
---
阅读全文
相关推荐
















