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

yizhihongxing

下面我来详细讲解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日

相关文章

  • Redis字符串原理的深入理解

    Redis字符串原理的深入理解 Redis是一个使用内存作为数据存储的键值对存储系统,因此Redis的性能非常出色。Redis提供了多种不同的数据结构,其中最基本的就是字符串(string)。 Redis字符串的定义 Redis中的字符串实际上是一个字节数组(byte array),可以保存任何类型的数据,例如整数、浮点数、布尔值等等,字符串长度最大可以达到…

    database 2023年5月22日
    00
  • 客户端/服务器和分布式DBMS的区别

    客户端/服务器和分布式DBMS是两种常用的数据库架构。它们之间有着很多区别和特点。我们下面将从架构定义、数据处理方式、数据共享等多个角度介绍它们的区别。 客户端/服务器架构 客户端/服务器架构是一种常用的数据库架构,其中客户端和服务器是独立的,各自运行在不同的机器上。 客户端负责与用户交互,向用户呈现数据,接收用户的数据请求,并将其通过网络传输到服务器端。比…

    database 2023年3月27日
    00
  • 安装SQL server 提示重新启动计算机失败怎么解决?

    安装SQL Server时出现重新启动计算机失败的问题,这通常是由于以下原因之一所致: 已经打开了另一个程序或服务,正在使用文件。 某些Windows更新在安装过程中需要重新启动系统,但它们可能会在后台安装,而没有向用户显示通知。 系统出现故障,因此需要重新启动。 以下是解决这个问题的一些方法: 方法一:关闭所有与SQL Server相关的进程 在安装SQL…

    database 2023年5月21日
    00
  • 4D和AnzoGraph的区别

    4D和AnzoGraph都是目前比较流行的图数据库,但它们在设计理念、数据管理方式等方面存在一些差异。 1. 4D的设计理念 4D是一种基于对象的关系数据库,使用SQL语言进行查询和管理。在4D中,数据是以表格形式存储的,每个表格都可以包含多行数据和多个列。4D在数据管理方面有一定的优势,它提供了一些高级功能,如内置的报表生成和表单设计工具。 2. Anzo…

    database 2023年3月27日
    00
  • 详解MySQL的字段默认null对唯一索引的影响

    好的!下面是详解MySQL的字段默认null对唯一索引的影响的完整攻略。 1. 什么是唯一索引 在理解字段默认null对唯一索引的影响之前,有必要先了解一下什么是唯一索引。 唯一索引指的是不允许表中出现重复的数据,它跟普通索引有两个主要的不同点: 唯一索引可以理解为在该字段上应用了一个不允许重复数据的限制,而普通索引没有此限制。 唯一索引可以包括多个字段,从…

    database 2023年5月22日
    00
  • 通过实例解析JMM和Volatile底层原理

    通过实例解析JMM和Volatile底层原理 JMM的概念和作用 Java内存模型(JMM)是Java运行时的一部分,它定义了Java程序在多线程环境下内存的访问方式。JMM的主要目的是确保在多线程环境下,不同线程之间对共享数据的操作是有序、可见、原子的。 JMM通过以下方式实现这些目标: 确保线程之间的可见性:JMM保证一个线程对共享变量的修改,对后续对该…

    database 2023年5月21日
    00
  • MySql自动分区

    自动分区需要开启MySql中的事件调度器,可以通过如下命令查看是否开启了调度器 show variables like ‘%scheduler%’; 如果没开启的话通过如下指令开启 SET GLOBAL event_scheduler = 1;   1、创建一个分区表 CREATE TABLE sales ( id INT AUTO_INCREMENT, a…

    MySQL 2023年4月13日
    00
  • redis安装(Linux)、启动、退出、设置密码、远程连接

    2.1 安装redis 下载redis安装包(如:redis-2.8.17.tar.gz) tar -zxvf redis-2.8.17.tar.gz cd redis-2.8.17 make sudo make install 2.2 后台启动服务端 nohup redis-server & 注:redis-server默认启动端口是6379,没有…

    Redis 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部