首頁  >  文章  >  後端開發  >  Scrapy實戰:爬取豆瓣電影數據與評分熱度排名

Scrapy實戰:爬取豆瓣電影數據與評分熱度排名

WBOY
WBOY原創
2023-06-22 13:49:402356瀏覽

Scrapy是一個開源的Python框架,用於快速且有效率地爬取資料。在本文中,我們將使用Scrapy爬取豆瓣影片的數據和評分熱度排名。

  1. 準備工作

首先,我們需要安裝Scrapy。您可以在命令列中輸入以下命令來安裝Scrapy:

pip install scrapy

接下來,我們將建立一個Scrapy專案。在命令列中,輸入以下命令:

scrapy startproject doubanmovie

這將建立一個名為doubanmovie的Scrapy專案。然後,我們將進入專案目錄並建立一個名為douban.py的Spider。在命令列中,輸入以下命令:

cd doubanmovie
scrapy genspider douban douban.com

現在,我們已經有了一個可以使用的Spider。接下來,我們將定義Spider的行為以取得所需的資料。

  1. 爬取電影資料

我們將使用Spider來爬取豆瓣電影的資料。具體來說,我們將獲取以下資訊:

  • 電影名稱
  • 導演
  • #演員
  • 類型
  • 國家
  • 語言
  • 上映日期
  • 片長
  • 評分
  • #評價人數

開啟douban.py文件,我們將添加以下程式碼:

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檔案中,我們將新增以下程式碼:

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方法:

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提供了一個簡單而有效的方式來管理和爬取大量的數據,使我們能夠快速地進行數據分析和處理。

以上是Scrapy實戰:爬取豆瓣電影數據與評分熱度排名的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn