Scrapy实战:爬取豆瓣电影数据和评分热度排名

scrapy是一个开源的python框架,用于快速高效地爬取数据。在本文中,我们将使用scrapy爬取豆瓣电影的数据和评分热度排名。

  1. 准备工作

首先,我们需要安装Scrapy。您可以在命令行中输入以下命令来安装Scrapy:

1

pip install scrapy

接下来,我们将创建一个Scrapy项目。在命令行中,输入以下命令:

1

scrapy startproject doubanmovie

这将创建一个名为doubanmovie的Scrapy项目。然后,我们将进入项目目录并创建一个名为douban.py的Spider。在命令行中,输入以下命令:

1

2

cd doubanmovie

scrapy genspider douban douban.com

现在,我们已经有了一个可以使用的Spider。接下来,我们将定义Spider的行为以获取所需的数据。

  1. 爬取电影数据

我们将使用Spider来爬取豆瓣电影的数据。具体来说,我们将获取以下信息:

  • 电影名称
  • 导演
  • 演员
  • 类型
  • 国家
  • 语言
  • 上映日期
  • 片长
  • 评分
  • 评价人数

打开douban.py文件,我们将添加以下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

import scrapy

class DoubanSpider(scrapy.Spider):

    name = 'douban'

    allowed_domains = ['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:

            yield {

                'name': movie.xpath('.//span[@class="title"]/text()').get(),

                'director': movie.xpath('.//div[@class="bd"]/p/text()[1]').get(),

                'actors': movie.xpath('.//div[@class="bd"]/p/text()[2]').get(),

                'genre': movie.xpath('.//div[@class="bd"]/p/text()[3]').get(),

                'country': movie.xpath('.//div[@class="bd"]/p/text()[4]').get(),

                'language': movie.xpath('.//div[@class="bd"]/p/text()[5]').get(),

                'release_date': movie.xpath('.//div[@class="bd"]/p/text()[6]').get(),

                'duration': movie.xpath('.//div[@class="bd"]/p/text()[7]').get(),

                'rating': movie.xpath('.//span[@class="rating_num"]/text()').get(),

                'num_reviews': movie.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').get(),

            }

在这个代码中,我们使用XPath来选取我们需要获取的信息。我们使用yield来生成这些信息,并使用return来将它们返回到用户。

如果我们现在运行我们的Spider(运行以下命令:scrapy crawl douban),它将爬取前250部电影的数据,并将它们返回到命令行中。

  1. 获取评分热度排名

现在,我们已经成功地获取了前250部电影的数据。接下来,我们将获取它们的评分热度排名。

我们需要先创建一个新的Spider,来爬取豆瓣电影的TOP250列表。我们将使用此列表来获取电影的排名。

在douban.py文件中,我们将添加以下代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

import scrapy

class DoubanSpider(scrapy.Spider):

    name = 'douban'

    allowed_domains = ['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:

            yield {

                'name': movie.xpath('.//span[@class="title"]/text()').get(),

                'director': movie.xpath('.//div[@class="bd"]/p/text()[1]').get(),

                'actors': movie.xpath('.//div[@class="bd"]/p/text()[2]').get(),

                'genre': movie.xpath('.//div[@class="bd"]/p/text()[3]').get(),

                'country': movie.xpath('.//div[@class="bd"]/p/text()[4]').get(),

                'language': movie.xpath('.//div[@class="bd"]/p/text()[5]').get(),

                'release_date': movie.xpath('.//div[@class="bd"]/p/text()[6]').get(),

                'duration': movie.xpath('.//div[@class="bd"]/p/text()[7]').get(),

                'rating': movie.xpath('.//span[@class="rating_num"]/text()').get(),

                'num_reviews': movie.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').get(),

            }

        next_page = response.xpath('//span[@class="next"]/a/@href')

        if next_page:

            url = response.urljoin(next_page[0].get())

            yield scrapy.Request(url, callback=self.parse)

在代码中,我们使用了一个名为next_page的变量,来检查我们是否到达了最后一页。如果我们还没有到达最后一页,我们将继续爬取下一页。

接下来,我们需要更新parse方法,以获取电影的排名。我们将使用Python的enumerate函数来将排名与每部电影相关联。

在douban.py文件中,我们将替换原来的parse方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

def parse(self, response):

        movie_list = response.xpath('//div[@class="item"]')

        for i, movie in enumerate(movie_list):

            yield {

                'rank': i + 1,

                'name': movie.xpath('.//span[@class="title"]/text()').get(),

                'director': movie.xpath('.//div[@class="bd"]/p/text()[1]').get(),

                'actors': movie.xpath('.//div[@class="bd"]/p/text()[2]').get(),

                'genre': movie.xpath('.//div[@class="bd"]/p/text()[3]').get(),

                'country': movie.xpath('.//div[@class="bd"]/p/text()[4]').get(),

                'language': movie.xpath('.//div[@class="bd"]/p/text()[5]').get(),

                'release_date': movie.xpath('.//div[@class="bd"]/p/text()[6]').get(),

                'duration': movie.xpath('.//div[@class="bd"]/p/text()[7]').get(),

                'rating': movie.xpath('.//span[@class="rating_num"]/text()').get(),

                'num_reviews': movie.xpath('.//div[@class="star"]/span[@class="rating_num"]/text()').get(),

            }

        next_page = response.xpath('//span[@class="next"]/a/@href')

        if next_page:

            url = response.urljoin(next_page[0].get())

            yield scrapy.Request(url, callback=self.parse)

现在,如果我们再次运行我们的Spider,它将获取前250部电影的数据,并将它们返回到命令行中。此时,我们将看到所有电影的排名。

  1. 结论

Scrapy是一种非常强大和灵活的工具,用于快速高效地爬取数据。在本文中,我们已经成功地使用Scrapy来爬取豆瓣电影的数据和评分热度排名。

我们使用Python代码和XPath来选择性获取网页上的信息,并使用yield语句来将其返回给用户。在整个过程中,Scrapy提供了一个简单而有效的方式来管理和爬取大量的数据,使我们能够快速地进行数据分析和处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值