Python使用scrapy爬取豆瓣TOP250详情页并导出json文件,在一个部分写出完整代码
时间: 2025-04-02 17:12:36 浏览: 41
### 使用Scrapy爬取豆瓣Top 250电影详情页数据并保存到JSON文件
以下是实现该功能的完整代码示例:
#### 1. 创建Scrapy项目
首先,创建一个新的Scrapy项目,并进入该项目目录。
```bash
pip3 install scrapy # 如果尚未安装Scrapy库,则先执行此命令
scrapy startproject douban_top250
cd douban_top250
scrapy genspider douban_movies movie.douban.com
```
上述命令会生成一个名为`douban_movies`的Spider脚本[^4]。
---
#### 2. 编辑`items.py`
定义要抓取的数据字段。编辑`douban_top250/items.py`文件如下:
```python
import scrapy
class DoubanMovieItem(scrapy.Item):
title = scrapy.Field() # 影片名称
rating = scrapy.Field() # 影片评分
director = scrapy.Field() # 导演姓名
actors = scrapy.Field() # 主演列表
release_year = scrapy.Field() # 上映年份
url = scrapy.Field() # 详情页面链接
```
---
#### 3. 修改`spiders/douban_movies.py`
在`spiders/douban_movies.py`中编写具体的爬虫逻辑。以下是一个完整的Spider实现:
```python
import scrapy
from ..items import DoubanMovieItem
class DoubanMoviesSpider(scrapy.Spider):
name = 'douban_movies'
allowed_domains = ['movie.douban.com']
start_urls = [
f'https://movie.douban.com/top250?start={page * 25}' for page in range(10)
]
def parse(self, response):
movies = response.xpath('//div[@class="item"]')
for movie in movies:
item = DoubanMovieItem()
item['title'] = movie.xpath('.//span[@class="title"]/text()').get().strip()
item['rating'] = movie.xpath('.//span[@class="rating_num"]/text()').get().strip()
detail_url = movie.xpath('.//a/@href').get().strip()
item['url'] = detail_url
yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item})
def parse_detail(self, response):
item = response.meta['item']
info = response.xpath('//div[@id="info"]')
directors = info.xpath('.//span[contains(text(), "导演")]/following-sibling::span/a/text()').getall()
item['director'] = ', '.join(directors)
actors = info.xpath('.//span[contains(@class, "actor")]//a/text()').getall()
item['actors'] = ', '.join(actors)
year = info.xpath('.//span[@class="year"]/text()').re(r'(\d{4})')
item['release_year'] = ''.join(year) if year else ''
yield item
```
在此代码中,通过XPath提取了每部电影的主要信息以及其详情页的内容。
---
#### 4. 配置`settings.py`
为了确保数据能够被正确处理和存储,在`douban_top250/settings.py`中启用自定义管道。
```python
ITEM_PIPELINES = {
'douban_top250.pipelines.MoviesPipeline': 300,
}
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'
DOWNLOAD_DELAY = 1 # 设置下载延迟以避免请求过频
ROBOTSTXT_OBEY = False # 不遵循robots.txt协议(仅限测试环境)
```
---
#### 5. 实现`pipelines.py`
按照引用描述,修改`douban_top250/pipelines.py`文件以便将数据保存为JSON格式[^2]。
```python
import json
class MoviesPipeline:
def open_spider(self, spider):
"""启动爬虫时,打开 items.json 文件"""
self.file = open('movies_data.json', 'w', encoding='utf-8')
def close_spider(self, spider):
"""关闭爬虫时,关闭 JSON 文件"""
self.file.close()
def process_item(self, item, spider):
"""将抓取到的数据序列化为 JSON 并写入文件"""
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
```
---
#### 6. 执行爬虫
最后,运行以下命令启动爬虫并开始抓取数据[^1]。
```bash
scrapy crawl douban_movies
```
这将会把所有抓取到的电影数据保存至当前工作目录下的`movies_data.json`文件中。
---
### 注意事项
- 确保目标网站未更改HTML结构;如果发生变更,需调整XPath表达式。
- 尊重目标站点的服务条款,合理设置访问频率以免对其服务器造成负担。
阅读全文
相关推荐


















