1. 程式人生 > >Scrapy框架學習(二)Scrapy入門

Scrapy框架學習(二)Scrapy入門

接下來以爬取quote.toscrape.com為例完成一遍Scrapy的抓取流程。

首先建立一個Scrapy專案。開啟命令列,輸入以下命令:

scrapy startproject projectname

即可在當前位置建立一個Scrapy專案。我們建立一個名為tutorial的專案:

scrapy startproject tutorial

可以看到當前位置出現了一個名為tutorial的資料夾,這代表著專案已經建立完畢。

接下來我們需要建立一個Spider。Spider負責從網頁中抓取內容並返回解析結果。建立Spider需繼承scrapy.Spider類在命令列中輸入:

cd tutorial

scrapy genspider quotes quotes.toscrape.com

以上命令建立了一個名為QuotesSpider的Spider,可以在專案資料夾找到。

接下來我們需要定義Item。Item是儲存資料的容器。建立Item需要繼承scrapy.Item類,並且定義型別為scrapy.Field的欄位。開啟瀏覽器開發者工具,我們觀察到我們將爬取的內容有text、author、tags。定義Item,將items.py修改如下:

import scrapy


class QuoteItem(scrapy.Item):
    text = scrapy.Field()
    author 
= scrapy.Field() tags = scrapy.Field()

檢視網頁原始碼,每頁有多個class為quote的塊,塊中包含我們想要爬取的內容,那麼我們先找出所有的quote,然後提取每個quote的內容。提取完畢後,我們需要將下一頁的url提交給Engine。這一部分工作由Spider來完成。修改quotes.py如下:

# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import QuoteItem

class QuotesSpider(scrapy.Spider):
    name 
= 'quotes' allowed_domains = ['quotes.toscrape.com'] start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): quotes = response.css('.quote') for quote in quotes: item = QuoteItem() item['text'] = quote.css('.text::text').extract_first() item['author'] = quote.css('.author::text').extract_first() item['tags'] = quote.css('.tags .tag::text').extract() yield item next = response.css('.paper .next a::attr(href)').extract_first() url = response.urljoin(next) yield scrapy.Request(url=url,callback=self.parse)

這裡我們使用了css選擇器進行提取,當然也可以用Xpath進行提取。extract_first()方法返回第一個匹配到的元素,extract()則返回匹配到的所有元素的列表。

程式碼中我們用了QuoteItem,這是一個Item物件,我們可以將它理解為一個字典,用來存放spider解析後的資料。

通過以上修改,我們已經完成了一個網站爬蟲的所有工作。現在讓我們來執行它!在命令列中輸入:

scrapy crawl quotes

即可看到爬取的結果。