Python利用Scrapy框架爬取豆瓣电影示例

下面我来详细讲解Python利用Scrapy框架爬取豆瓣电影的攻略。

爬虫框架Scrapy简介

Scrapy是一款使用Python语言编写的开源网络爬虫框架,目的是帮助开发者高效地爬取Web站点的信息内容。它通过定制配置的方式对每个请求进行处理,从而实现高效率、快速的数据抓取。

Scrapy框架具有以下特点:

  1. 强大的抓取性能,支持异步处理和并发下载;
  2. 灵活的数据解析和导出能力;
  3. 可扩展性强,提供了丰富的插件机制。

爬取豆瓣电影

下面我们以爬取豆瓣电影为例,来讲解如何使用Scrapy框架爬取网站信息。

创建Scrapy项目

首先,我们需要在电脑中安装Scrapy框架,安装方式可以通过pip命令进行,具体命令如下:

pip install scrapy

安装完成后,我们就可以通过Scrapy框架创建我们的爬虫项目了。在命令行中执行如下命令:

scrapy startproject douban_movie

执行成功后,将会在命令行所在的目录下创建名为"douban_movie"的文件夹,这个文件夹中包含了Scrapy项目的基本结构。

分析网页结构

在开始编写爬虫程序之前,我们需要先分析豆瓣电影的网页结构,确定我们需要爬取哪些信息。为此,我们可以打开豆瓣电影的网页,并通过浏览器的开发者工具来查看网页的HTML代码和页面结构。

针对豆瓣电影的网页,我们可以发现,每部电影的信息都包含在一个class为"item"的div容器中。我们需要从这个容器中抓取详细信息,包括电影名称,导演,主演,评分等信息。

编写爬虫程序

有了网页结构的分析,接下来我们就可以开始编写我们的爬虫程序了。在"douban_movie/spiders"文件夹下,创建一个名为"douban_spider.py"的文件,并输入如下代码:

import scrapy

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        movie_list = response.xpath('//div[@class="item"]')
        for movie in movie_list:
            title = movie.xpath('div[@class="info"]/div[@class="hd"]/a/span/text()').extract_first()
            star = movie.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
            director = movie.xpath('div[@class="info"]/div[@class="bd"]/p[1]/text()').extract_first().strip().split(':')[-1].strip()
            actors = movie.xpath('div[@class="info"]/div[@class="bd"]/p[2]/text()').extract_first().strip().split(':')[-1].strip()
            yield {
                'title': title,
                'star': star,
                'director': director,
                'actors': actors
            }

        next_page = response.xpath('//span[@class="next"]/a/@href')
        if next_page:
            url = response.urljoin(next_page.extract_first())
            yield scrapy.Request(url, callback=self.parse)

代码解释如下:

  1. 首先通过import scrapy导入Scrapy框架。
  2. 编写DoubanSpider类,并定义了name,allowed_domains和start_urls这三个属性。
  3. 在parse方法中,我们通过XPath选取所有class为"item"的div容器,并依次获取每部电影的详细信息。
  4. 对于每部电影,我们使用XPath选取其电影名称、主演、导演和评分等信息,并通过yield返回一个字典形式的结果。
  5. 最后,我们在parse方法末尾通过XPath查询下一页的链接地址,并通过yield返回一个新的Request对象,让程序自动爬取下一页的数据。

运行爬虫程序

到此为止,我们的爬虫程序已经完成了。为了运行程序,我们需要打开命令行窗口,在项目文件夹下输入如下命令:

scrapy crawl douban -o movie.csv

运行完毕后,我们就可以在项目文件夹中看到一个名为"movie.csv"的文件,其中保存了我们爬取到的豆瓣电影的信息。我们也可以将数据格式化为JSON或其他形式的文件。

示例1:

上面给出的代码只能爬取豆瓣电影前25部,如果我们需要爬取前100部或者更多,我们只需要在start_urls中添加对应的链接即可。

例如,如果我们需要爬取前100部电影,可以将start_urls修改为如下形式:

start_urls = ['https://movie.douban.com/top250?start={}'.format(num) for num in range(0, 100, 25)]

代码解释如下:

  1. 将start_urls修改为一个列表形式,列表中包含4个URL链接,表示爬取豆瓣电影排名前100的电影。
  2. 修改首页URL为'https://movie.douban.com/top250?start=0',并以25为步进值循环产生URL。

示例2:

上述代码中只爬取了电影的名称,导演、主演和评分,如果我们需要爬取更多的信息,我们需要通过XPath选取对应的HTML元素,并在代码中进行解析。

以下是一个简单的示例,假设我们需要爬取每部电影的时长信息,我们可以修改代码如下:

import scrapy

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['movie.douban.com']
    start_urls = ['https://movie.douban.com/top250']

    def parse(self, response):
        movie_list = response.xpath('//div[@class="item"]')
        for movie in movie_list:
            title = movie.xpath('div[@class="info"]/div[@class="hd"]/a/span/text()').extract_first()
            star = movie.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
            director = movie.xpath('div[@class="info"]/div[@class="bd"]/p[1]/text()').extract_first().strip().split(':')[-1].strip()
            actors = movie.xpath('div[@class="info"]/div[@class="bd"]/p[2]/text()').extract_first().strip().split(':')[-1].strip()
            duration = movie.xpath('div[@class="info"]/div[@class="bd"]/p[position()=3]/text()').extract_first().strip().split(':')[1].strip()
            yield {
                'title': title,
                'star': star,
                'director': director,
                'actors': actors,
                'duration': duration
            }

        next_page = response.xpath('//span[@class="next"]/a/@href')
        if next_page:
            url = response.urljoin(next_page.extract_first())
            yield scrapy.Request(url, callback=self.parse)

代码解释如下:

  1. 在代码中增加了一个新的duration属性,表示电影的时长。
  2. 通过XPath选取每部电影的时长信息,并添加到字典中返回。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用Scrapy框架爬取豆瓣电影示例 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 关于spring事务传播行为非事务方式的理解

    关于 Spring 事务传播行为非事务方式的理解 在 Spring 中,事务传播行为是决定事务如何传播的一个特性。当当前代码执行需要调用另一个方法时,如何处理这个方法的事务就取决于事务传播行为的设置。 Spring 中有 7 种事务传播行为,分别是: PROPAGATION_REQUIRED(默认) 表示在调用方法执行时,如果当前已经存在一个事务,那么这个方…

    database 2023年5月21日
    00
  • 如何在Python中插入数据到MongoDB数据库?

    以下是如何在Python中插入数据到MongoDB数据库的完整使用攻略,包括安装PyMongo库、连接MongoDB数据库、插入数据等步骤。同时,提供了两个示例以便更好理解如何在中插入数据到MongoDB数据库。 步骤1:安装PyMongo库 在Python中,我们可以使用pip命令安装Py库。以下是装PyMongo库的基本语法: pip install p…

    python 2023年5月12日
    00
  • MySQL如何指定字符集和排序规则?

    在MySQL中,可以使用以下两种方式指定字符集和排序规则: 创建数据库或表时指定字符集和排序规则 在创建数据库或表时,可以使用 CHARACTER SET 和 COLLATE 选项指定字符集和排序规则。例如,创建一个名为 mydatabase 的数据库,并将字符集设置为 utf8mb4,排序规则设置为 utf8mb4_general_ci,可以使用以下 SQ…

    MySQL 2023年4月11日
    00
  • docker Compose部署springboot+vue前端端分离

    下面是完整攻略: 1. 前置条件 在进行 Docker Compose 部署 Spring Boot + Vue 前端后端分离前,需要确保已经具备一下前置条件: 熟悉 Docker 和 Docker Compose 的基本使用方法 已经安装好 Docker 和 Docker Compose 环境 已经有 Spring Boot 和 Vue 的项目代码,并能正…

    database 2023年5月22日
    00
  • Mysql数据库定时备份脚本分享

    下面我将为大家详细讲解“MySQL数据库定时备份脚本分享”的完整攻略。 一、背景介绍 对于企业级应用程序而言,数据库备份是至关重要的工作。因此,制定一个可靠的备份策略,保证备份数据的完整性和一致性,是数据管理工作中的关键步骤。本文将向大家分享一份MySQL数据库定时备份脚本,通过定时任务,定期自动备份MySQL数据库,提高备份数据的可靠性与效率。 二、脚本实…

    database 2023年5月22日
    00
  • SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化

    SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化 在进行SQL语句优化时,JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化是比较重要的一部分。下面我们将详细介绍如何优化这些语句。 1. JOIN语句的优化 当使用JOIN语句时,我们最好使用INNER JOIN,因为它可以避免重复数据的出现。使用INNER JO…

    database 2023年5月19日
    00
  • .htaccess重定向和url重写详细介绍

    介绍 .htaccess 重定向和 URL 重写之前,我们需要了解两个概念:服务器响应码和正则表达式。 服务器响应码 服务器响应码,也称为 HTTP 状态码,是指 Web 服务器响应客户端请求时所返回的状态码。 几个常见的状态码: 200 OK:用来表示客户端的请求在服务器端被正常处理。 301 Moved Permanently:用于永久性重定向,浏览器会…

    database 2023年5月22日
    00
  • 一起raid数据恢复及回迁成功的案例

    关于“一起raid数据恢复及回迁成功的案例”的攻略,我将分为以下几个步骤进行讲解: 1. 了解 RAID RAID是指“Redundant Array of Independent Disks”,也就是独立磁盘冗余阵列。它通过将多块硬盘组合成一个数据存储单元,以提高数据读写速度和数据冗余度。因此,在操作 RAID 时,我们需要清楚其不同的级别和操作方式,包括…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部