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日

相关文章

  • 基于Kafka和Elasticsearch构建实时站内搜索功能的实践

    目前我们在构建一个多租户多产品类网站,为了让用户更好的找到他们所需要的产品,我们需要构建站内搜索功能,并且它应该是实时更新的。本文将会讨论构建这一功能的核心基础设施,以及支持此搜索能力的技术栈。 作者:京东物流 纪卓志 目前我们在构建一个多租户多产品类网站,为了让用户更好的找到他们所需要的产品,我们需要构建站内搜索功能,并且它应该是实时更新的。本文将会讨论构…

    MySQL 2023年4月10日
    00
  • 总结一周内学习的Sql经验(一)

    我来为您详细讲解“总结一周内学习的Sql经验(一)”的完整攻略。 1. 学习资料 首先,学习Sql的基本资料可以在网上轻易获得。其中,最基础的学习材料是 W3School SQL入门,它涵盖了 SQL 语法、表设计、数据库设计、SQL 查询语法等基础内容。此外,还可以通过MOOC平台,例如 Coursera 和 edX 等学习大牌大学的数据库课程。通过这些课…

    database 2023年5月19日
    00
  • MySQL表名不区分大小写的设置方法

    MySQL表名不区分大小写的设置方法可以通过修改配置文件my.cnf或者在启动mysql服务时添加参数的方式进行设置。这里分别介绍这两种方式的操作步骤。 通过修改my.cnf配置文件进行设置 查找my.cnf文件所在位置。 可以在终端中执行以下命令直接查询my.cnf文件的位置: mysql –help | grep -A 1 "Default …

    database 2023年5月22日
    00
  • thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决

    当在 Linux 服务器上部署 ThinkPHP 项目时,如果出现“模板不存在”的错误提示信息,通常会有以下两种情况: 模板文件路径错误 模板文件缓存导致的路径错误 针对这两种情况,我们可以采取以下措施解决: 模板文件路径错误 如果是因为模板文件路径错误导致的问题,通常可以查看以下两个文件: ThinkPHP/Conf/convention.php:该文件是…

    database 2023年5月18日
    00
  • 实例介绍SQL注入以及如何解决

    我们来详细讲解一下“实例介绍SQL注入以及如何解决”的完整攻略。 什么是SQL注入 SQL注入是一种攻击方式,攻击者通过非法构造的输入,伪造或利用应用程序的逻辑漏洞,通过从应用程序的数据库中查询或操纵数据,来达到破坏目的的一种攻击手段。 攻击者通过输入恶意的SQL查询语句,绕过应用程序的身份验证和授权控制,直接访问数据库。攻击者可以利用这种缺陷,窃取、修改、…

    database 2023年5月18日
    00
  • MySql各种查询方式详解

    MySql各种查询方式详解 前言 MySql是一种开源的关系型数据库管理系统,具有跨平台、高性能、高可靠性等特点,被广泛应用于Web开发及其他领域。在MySql中,查询是最基本的操作之一,而各种不同的查询方式也给我们在实际使用中带来了不同的便利。本文将介绍MySql中各种常见的查询方式,供读者参考。 简单查询 简单查询是指只涉及到单个表的查询方式,常用的操作…

    database 2023年5月22日
    00
  • 简单聊聊SQL注入的原理以及一般步骤

    SQL注入是一种常见的攻击方式,攻击者可以利用这种漏洞执行恶意代码来获取到访问敏感信息的权限。以下是SQL注入攻击的原理和一般步骤说明。 原理 SQL注入是一种攻击技术,通过在应用程序的输入中插入恶意的代码,然后将该代码注入到数据库中,最终实现攻击者控制整个应用程序的目的。这种攻击手段的实现原理主要是利用Web应用程序(如PHP、ASP等)对于用户输入的过滤…

    database 2023年5月18日
    00
  • SQL检索所有行和列

    SQL是一种用于存储、管理和检索关系型数据库中信息的编程语言。为了检索数据库中的数据,需要进行查询操作。以下是SQL检索所有行和列的方法的完整攻略。 一、使用SELECT语句检索所有行和列 通过使用SELECT语句,可以检索表中的所有行和列。该语句由以下三个主要部分组成: SELECT:该关键字告诉数据库我们要检索数据。 *:通配符表示检索所有列。 FROM…

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