Scrapy爬虫 爬取豆瓣TOP250

本文详细指导如何使用Scrapy框架爬取豆瓣电影Top250的电影信息,并解决爬取结果不按顺序的问题,涉及spider、items和settings的修改

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


使用Scrapy爬虫框架爬取豆瓣电影TOP250

分析网页

第一页
start=0

在这里插入图片描述

第二页
start=25

在这里插入图片描述

最后一页
start=225

在这里插入图片描述
可以看出网页的网址是有规律的

创建Scrapy爬虫框架

C:\Users\dell>cd Desktop\python_test\
C:\Users\dell\Desktop\python_test>scrapy startproject dbmovie
C:\Users\dell\Desktop\python_test>cd dbmovie\dbmovie
C:\Users\dell\Desktop\python_test\dbmovie\dbmovie>scrapy genspider dbmovie_spider movie.douban.com

修改spider脚本

import scrapy
from dbmovie.items import DoubanItem

class DbmovieSpiderSpider(scrapy.Spider):
    name = 'dbmovie_spider'
    allowed_domains = ['movie.douban.com/top250']
    list=[]
    for page in range(0,226,25):
        url='start='+str(page)+'&filter='
        start_urls='https://movie.douban.com/top250?'+url
        list.append(start_urls)
    start_urls = list

    def parse(self, response):
        item=DoubanItem()
        movies=response.xpath('//ol[@class="grid_view"]/li')
        for movie in movies:
            item['ranking']=movie.xpath('.//div[@class="star"]/span[4]/text()').extract()[0]
            item['movie_name']=movie.xpath('.//div[@class="hd"]/a/span[1]/text()').extract()[0]
            item['score']=movie.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').extract()[0]
            item['describe']=movie.xpath('.//span[@class="inq"]/text()').extract()
            yield item

修改items脚本

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
   
    # 评论人数
    ranking=scrapy.Field()
    # 电影名称
    movie_name=scrapy.Field()
    # 评分
    score=scrapy.Field()
    # 电影描述
    describe=scrapy.Field()

修改settings脚本

修改内容

DEFAULT_REQUEST_HEADERS = {
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
   'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36'
}
FEED_URL="douban.csv"
FEED_FORMAT='csv'
FEED_EXPORT_ENCODING="gbk"

运行

在命令行输入

# 指定保存文件名或目录
scrapy crawl dbmovie_spider -o douban.csv

可以看到爬取结果并不是按照顺序排列的
大家可以尝试如何爬取带顺序的结果
在这里插入图片描述

### 使用 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 表达式的准确性,确保字段定位无误后再投入批量采集阶段。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据攻城小狮子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值