scrapy是一个开源的python框架,用于快速高效地爬取数据。在本文中,我们将使用scrapy爬取豆瓣电影的数据和评分热度排名。
- 准备工作
首先,我们需要安装Scrapy。您可以在命令行中输入以下命令来安装Scrapy:
接下来,我们将创建一个Scrapy项目。在命令行中,输入以下命令:
1 | scrapy startproject doubanmovie |
这将创建一个名为doubanmovie的Scrapy项目。然后,我们将进入项目目录并创建一个名为douban.py的Spider。在命令行中,输入以下命令:
1 2 | cd doubanmovie scrapy genspider douban douban.com |
现在,我们已经有了一个可以使用的Spider。接下来,我们将定义Spider的行为以获取所需的数据。
- 爬取电影数据
我们将使用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部电影的数据,并将它们返回到命令行中。
- 获取评分热度排名
现在,我们已经成功地获取了前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部电影的数据,并将它们返回到命令行中。此时,我们将看到所有电影的排名。
- 结论
Scrapy是一种非常强大和灵活的工具,用于快速高效地爬取数据。在本文中,我们已经成功地使用Scrapy来爬取豆瓣电影的数据和评分热度排名。
我们使用Python代码和XPath来选择性获取网页上的信息,并使用yield语句来将其返回给用户。在整个过程中,Scrapy提供了一个简单而有效的方式来管理和爬取大量的数据,使我们能够快速地进行数据分析和处理。