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

spider
scrapy genspider imdb  www.imdb.com
<tbody class="lister-list">裡面:
lister-list裡面有很多個class="titleColumn"的<td>元素,而我們要的<href>就在這裡面:
接下來就可以撰寫程式碼了,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)
再來我們就可以爬每部電影的細節了!

電影年份、評分、名稱、導演、作者、演員等內容,依照需要的內容去解析就行了。

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

好的,那今天就到這裡了,雖然到最後了,範例有點太簡單了一點?不過還是希望說明的內容有幫助到人?
js內容可以參考之前的文章:UA可以參考之前的文章: