iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 29
2
AI & Data

Scrapy爬蟲與資料處理30天筆記系列 第 29

[Day 29] 實戰:IMDb 電影排名爬蟲

嗨,倒數第二天了,因為感覺Scrapy都說的差不多了?所以今天一樣來實戰吧,今天就來爬 IMDb Top 250 - IMDb

Imgur

  • 建立spider
scrapy genspider imdb  www.imdb.com
  • 檢查網頁,會發現全部的內容都在<tbody class="lister-list">裡面:

Imgur

  • lister-list裡面有很多個class="titleColumn"<td>元素,而我們要的<href>就在這裡面:

Imgur

  • 接下來就可以撰寫程式碼了,soup.select('tbody.lister-list tr td.titleColumn')用來取得所有class為titleColumn<td>,我們再從<td>內取得要的項目,包含排名(num)、電影名稱(title)和最重要的連結(link)。

  • 再用scrapy.Request()方法呼叫parse_moive方法去爬每一項目的詳細內容。

程式碼:

import scrapy
from bs4 import BeautifulSoup
class BookExampleSpider(scrapy.Spider):
    name = "imdb"
    allowed_domains = ["www.imdb.com"]
    start_urls = ['https://www.imdb.com/chart/top?ref_=nv_mv_250']

    def parse(self, response):
        soup = BeautifulSoup(response.text, 'lxml')
        rate_list = soup.select('tbody.lister-list tr td.titleColumn')
        for movie in rate_list:
            meta = {
                'num':movie.text.split('.')[0].strip(),
                'link': response.urljoin(movie.select_one('a').get('href')),
                'title': movie.select_one('a').text,
            }
            yield scrapy.Request(meta['link'], callback=self.parse_moive, meta=meta)

再來我們就可以爬每部電影的細節了!

  • 點進去其中一部電影後右鍵檢查:

Imgur

  • 再看詳細一點,可以看到包含電影年份評分名稱導演作者演員等內容,依照需要的內容去解析就行了。

Imgur
Imgur

  • 現在就來撰寫parse_moive方法吧,其實這裡就只是解析內容沒有比較特殊的部分,寫法也可能因人而異,我就直接貼上程式碼了:
    def parse_moive(self, response):
        meta = response.meta
        soup = BeautifulSoup(response.text, 'lxml')
        credit_summary_item = soup.select('div.plot_summary_wrapper div.credit_summary_item')
        stars = [s.text for s in credit_summary_item[2].select('a') ]
        item = {
            'title':meta['title'],
            'link':meta['link'],
            'num':meta['num'],
            'rating':soup.select_one('div.ratingValue strong span').text,
            'year':soup.select_one('span#titleYear a').text,
            'long':soup.select_one('div.subtext time').text.strip(),
            'type':soup.select_one('div.subtext a').text,
            'director':credit_summary_item[0].select_one('a').text,
            'writer':credit_summary_item[1].select_one('a').text,
            'star':stars,
        }
        return item
  • 這樣程式碼就完成了,直接執行:
scrapy crawl imdb -o imdb.csv
  • 可以看到輸出一個imdb.csv檔案:

Imgur

整體來說這個比昨天的書店網站練習還簡單一點,而且網路上其實也有dataset了(需要的話可以直接到 IMDb 查看),當然也可以嘗試依照不同類型的去爬來分類而不是直接爬總排名,自己寫爬蟲好處就是依照個人的需求去抓資料(如下圖為動作片排行)。

Imgur

好的,那今天就到這裡了,雖然到最後了,範例有點太簡單了一點?不過還是希望說明的內容有幫助到人?


上一篇
[Day 28] 實戰:線上書店爬蟲流程
下一篇
[Day 30] 精彩回顧與心得?
系列文
Scrapy爬蟲與資料處理30天筆記30

尚未有邦友留言

立即登入留言