嗨,倒數第二天了,因為感覺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
可以參考之前的文章: