scrapy爬豆瓣电影和评论教程
时间: 2025-05-21 21:31:20 浏览: 25
### 使用 Scrapy 爬取豆瓣电影和评论的教程
#### 创建 Scrapy 项目
要使用 Scrapy 开始爬取豆瓣电影及其评论,首先需要创建一个新的 Scrapy 项目。可以通过以下命令完成此操作:
```bash
scrapy startproject douban_movie_reviews
```
这将在当前目录下生成一个名为 `douban_movie_reviews` 的新项目。
---
#### 定义 Items 数据结构
为了存储爬取到的数据,在项目的 `items.py` 文件中定义所需的字段。对于豆瓣电影和其评论的信息,可以参考如下代码:
```python
import scrapy
class MovieItem(scrapy.Item):
movie_name = scrapy.Field() # 电影名称
director = scrapy.Field() # 导演
actors = scrapy.Field() # 主演
release_date = scrapy.Field() # 上映日期
rating = scrapy.Field() # 用户评分
review_count = scrapy.Field() # 总评论数
reviews = scrapy.Field() # 单条评论内容
```
以上代码定义了一个用于保存电影基本信息以及单条评论的内容模型[^2]。
---
#### 配置 Spider
接下来配置具体的爬虫逻辑。假设目标是从某个特定页面获取电影详情页链接并进一步提取每部电影下的用户评论,则可以在 spiders 目录下新建一个 Python 文件(如 `douban_spider.py`),其中实现主要业务逻辑。
以下是完整的爬虫脚本示例:
```python
import scrapy
from ..items import MovieItem
class DoubanSpider(scrapy.Spider):
name = "douban"
allowed_domains = ["movie.douban.com"]
custom_settings = {
'DOWNLOAD_DELAY': 1, # 设置下载延迟防止被封禁 IP 地址
'CONCURRENT_REQUESTS_PER_DOMAIN': 8,
'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}
def start_requests(self):
urls = [
f'https://movie.douban.com/top250?start={i * 25}' for i in range(10)
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
movies_links = response.css('div.hd a::attr(href)').getall()
for link in movies_links[:]:
yield scrapy.Request(link, self.parse_movie_details)
def parse_movie_details(self, response):
item = MovieItem()
item['movie_name'] = response.xpath('//span[@property="v:itemreviewed"]/text()').extract_first().strip(),
item['director'] = ', '.join(response.xpath("//a[@rel='v:directedBy']/text()").extract()),
item['actors'] = ','.join([actor.strip() for actor in response.xpath("//a[@rel='v:starring']/text()").extract()]),
item['release_date'] = ''.join(response.xpath("//span[@property='v:initialReleaseDate']/text()").extract()).split('(')[0].strip(),
item['rating'] = float(response.xpath("//strong[@property='v:average']/text()").extract_first()),
comments_url = response.url + 'comments/'
request = scrapy.Request(comments_url, callback=self.parse_comments)
request.meta['item'] = item
yield request
def parse_comments(self, response):
item = response.meta['item']
all_reviews = []
comment_blocks = response.css('.comment-item')
for block in comment_blocks:
username = block.css('.comment-info > a ::text').get(default='')
content = block.css('.short ::text').get(default='')
single_review = {'username': username, 'content': content}
all_reviews.append(single_review)
item['reviews'] = all_reviews
next_page = response.css('#paginator .next a::attr(href)').get()
if next_page is not None and len(all_reviews) < int(item.get('review_count', 0)):
new_request = response.follow(next_page, callback=self.parse_comments)
new_request.meta['item'] = item
yield new_request
else:
yield item
```
上述代码实现了从首页抓取电影列表 -> 进入具体影片页面解析元数据 -> 访问该片对应的短评区逐级加载更多评论直至全部收集完毕的整体流程[^3][^4]。
---
#### 处理反爬机制
由于豆瓣网站存在一定的防爬措施,建议采取以下策略规避风险:
- **设置合理的请求间隔时间**:通过调整参数 `'DOWNLOAD_DELAY'` 来降低访问频率;
- **模拟浏览器行为**:修改 User-Agent 字符串伪装成正常用户的浏览习惯;
- 如果遇到验证码或其他复杂验证手段,则可能需要用到 Selenium 或 Puppeteer 结合动态渲染技术辅助解决。
---
#### 存储结果
最后一步就是决定如何持久化所获得的结果集,默认情况下会打印至终端输出流;如果想将其导出为 JSON 文件形式的话只需执行下面这条指令即可:
```bash
scrapy crawl douban -o output.json
```
这样就可以得到一份包含所有指定范围内热门影视作品连同它们底下若干精选留言记录在内的汇总文档了!
---
阅读全文
相关推荐


















