在 movie 的setting中,會有spider這個類,裏面有種子url以及解析
import scrapy
from douban.items import MovieItem
class MovieSpider(scrapy.Spider):
name = 'movie'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
item = MovieItem()
要想保存數據,就得定義模型
import scrapy
class MovieItem(scrapy.Item):
title = scrapy.Field()
score = scrapy.Field()
motto = scrapy.Field()
現在開始繼續寫我們的spider,裏面的xpath可以打開瀏覽器的開發者工具copy裏面的代碼, 如下圖所示:
response.xpath('//*[@id="content"]/div/div[1]/ol/li')
這時候測試的時候(命令行輸入scrapy shell https://movie.douban.com/top250)會發現出現403錯誤,我們就回到setting裏面設置我們的爬蟲:
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
'Chrome/27.0.1453.94 Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
運行成功後,我們開始寫爬蟲的結構,要拿到電影的三個屬性,titel,score,motto,如果直接copy,xpath地址爲
//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/p[2]/span
我們只需要後面的那截地址,即:div/div[2]/div[1]/a/span[1]/text()
class MovieSpider(scrapy.Spider):
name = 'movie'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
# 解析頁面
li_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li')
for li in li_list:
item = MovieItem()
# 電影名字,肖申克救贖
item['title'] = li.xpath('div/div[2]/div[1]/a/span[1]/text()').extract_first()
# 評分, 9.6
item['score'] = li.xpath('div/div[2]/div[2]/div/span[2]/text()').extract_first()
# 說明,'希望讓人自由'
item['motto'] = li.xpath('div/div[2]/div[2]/p[2]/span/text()').extract_first()
yield item
現在我們在terminal裏面輸入scrapy crawl movie就可以簡單的開始爬取前25個電影:
現在我們來爬取top250頁全部電影,即除了爬取電影,還要爬取翻頁的超鏈接, 可以看到href都是以‘ ?start’開始的:
所以我們接着寫:
# 帶href的 a 標籤, ::attr("href")即取出屬性是href--超鏈接
href_list = response.css('a[href]::attr("href")').re('\?start=.*')
for href in href_list:
# 將超鏈接補完整
url = response.urljoin(href)
# 返回request 對象,給一個新的url,處理完url還是執行parse方法
yield scrapy.Request(url=url, callback=self.parse)