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日

相关文章

  • 基于mysql查询语句的使用详解

    基于MySQL查询语句的使用详解 MySQL是一种流行的关系型数据库管理系统,也是广泛使用的开源数据库。在开发Web应用程序时,需要使用MySQL来存储和管理数据。MySQL查询语句是访问和修改数据库中数据的最基本方法之一。本文将详细讲解基于MySQL查询语句的使用方法。 基本语法 MySQL查询语句通常以SELECT关键字开始,其后跟着要选择的列名或通配符…

    database 2023年5月21日
    00
  • php,redis分布式锁防并发

        解决死锁   如果只用SETNX命令设置锁的话,如果当持有锁的进程崩溃或删除锁失败时,其他进程将无法获取到锁,问题就大了。 解决方法是在获取锁失败的同时获取锁的值,并将值与当前时间进行对比,如果值小于当前时间说明锁以过期失效,进程可运用Redis的DEL命令删除该锁。 setnx的作用和memcache的add方法类似 class rediss { …

    Redis 2023年4月11日
    00
  • SQL设置SQL Server最大连接数及查询语句

    针对SQL Server最大连接数及查询语句的问题,这里提供一份完整攻略,分为以下几个步骤: 1. 查看当前的最大连接数 首先,我们需要查看当前SQL Server的最大连接数设置,以便后续的修改。使用以下SQL语句即可查看: SELECT @@MAX_CONNECTIONS; 执行成功后,可以在结果中看到当前最大连接数的值。 2. 修改最大连接数 接下来,…

    database 2023年5月21日
    00
  • redis安装、配置、使用和redis php扩展安装教程

    下面就来详细讲解一下“redis安装、配置、使用和redis php扩展安装教程”的完整攻略。 redis安装 下载redis 官网下载地址:https://redis.io/download,我们选择稳定版的最新版本。下载完成后,解压到我们希望的路径下。 安装redis 进入到redis目录,执行make命令进行编译,再执行make install命令将编…

    database 2023年5月18日
    00
  • PHP漏洞全解(详细介绍)

    我们来详细讲解一下“PHP漏洞全解(详细介绍)”这篇文章。 一、漏洞分类 在文章中首先介绍了漏洞分类,分别是: SQL注入漏洞 文件上传漏洞 文件包含漏洞 远程命令执行漏洞 跨站脚本攻击(XSS)漏洞 代码注入漏洞 文件处理漏洞 等等 作者逐一列举了每种漏洞的原理和危害,并且给出了相应漏洞的修复方法。 二、示例说明 在文章中,作者给出了两个示例,分别是: 1…

    database 2023年5月21日
    00
  • linux下日志定时轮询的流程详解

    Linux下日志定时轮询的流程详解 在Linux系统中,日志文件记录着重要的系统和应用程序信息,但是如果日志过多或没经过轮询,将会引起系统瘫痪。定时轮询是一种常见的解决方案,本文将介绍在Linux系统中日志定时轮询的流程和方法。 1. logrotate Logrotate是Linux系统中常用的日志管理工具,它提供一种简单的方式实现日志文件的轮换。其基本原…

    database 2023年5月22日
    00
  • redis之Hash操作

    Hash操作,redis中Hash在内存中的存储格式如下图:     1、hset(name, key, value) # name对应的hash中设置一个键值对(不存在,则创建;否则,修改) # 参数: # name,redis的name # key,name对应的hash中的key # value,name对应的hash中的value # 注: # hs…

    Redis 2023年4月12日
    00
  • java9区分opens与exports

    Java 9引入了一些新的模块系统特性,包括opens和exports,主要是为了更好地实现模块化开发,提高代码安全性。 opens和exports的概念 opens:可以让模块中的某个包在运行时可以被其他模块反射调用。 exports:可以让模块中的某个包在编译时和运行时都可以被其他模块访问和使用。 区分opens和exports的攻略 在module-i…

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