本文經過示例簡要介紹一下使用Scrapy抓取網站內容的基本方法和流程。css
繼續閱讀以前請確保已安裝了scrapy。html
基本安裝方法爲:pip install scrapypython
咱們已經在以前的文章中初步介紹了scrapy,本文是前文的進一步拓展。web
本文主要包含以下幾部分:chrome
1,建立一個scrapy項目shell
2,編寫一個爬蟲(或蜘蛛spider,本文中含義相同)類用於爬取網站頁面並提取數據json
3,使用命令行導出爬到的數據瀏覽器
4,遞歸地爬取子頁面app
5,瞭解並使用spider支持的參數scrapy
咱們測試的網站爲quotes.toscrape.com,這是一個收錄名人警句的站點。Let’s go!
Scrapy將爬蟲代碼各模塊及配置組織爲一個項目。Scrapy安裝成功後,你能夠在shell中使用以下命令建立一個新的項目:
scrapy startproject tutorial
這將會建立一個tutorial目錄,該目錄的文件結構以下所示:
scrapy.cfg # 部署配置文件 tutorial/ # 項目的Python模塊, 咱們從這個模塊中導入所需代碼 __init__.py items.py # items定義文件 middlewares.py # middlewares(中間件)定義文件 pipelines.py # pipelines(流水線)定義文件 settings.py # 項目配置文件 spiders/ # 存放spider的目錄 __init__.py
Spiders是Scrapy中須要定義的實現爬取功能的類。
每一個spider繼承自Spider基類。spider主要定義了一些起始url,並負責解析web頁面元素,從中提早所需數據。也能夠產生新的url訪問請求。
下邊這段代碼就是咱們所定義的spider,將其保存爲quotes_spider.py,放在項目的tutorial/spiders/目錄下。
import scrapy class QuotesSpider(scrapy.Spider): name = "quotes" def start_requests(self): urls = [ 'http://quotes.toscrape.com/page/1/', 'http://quotes.toscrape.com/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse) def parse(self, response): page = response.url.split("/")[-2] filename = 'quotes-%s.html' % page with open(filename, 'wb') as f: f.write(response.body) self.log('Saved file %s' % filename)
在咱們的代碼中,QuotesSpider繼承自scrapy.Spider,並定義了一些屬性和方法:
name:用於在項目中惟一標識一個spider。項目中能夠包含多個spider,其name必須惟一。
start_requests():用於產生初始的url,爬蟲從這些頁面開始爬行。這個函數須要返回一個包含Request對象的iterable,能夠是一個列表(list)或者一個生成器(generator)。咱們的例子中返回的是一個生成器。
parse():是一個回調函數,用於解析訪問url獲得的頁面,參數response包含了頁面的詳細內容,並提供了諸多從頁面中提取數據的方法。咱們一般在parse中將提取的數據封裝爲dict,查找新的url,併爲這些url產生新的Request,以繼續爬取。
Spider定義好了以後,咱們能夠在項目的頂層目錄,即最頂層的tutorial,執行以下命令來運行這個spider:
scrapy crawl quotes
這個命令會在項目的spiders目錄中查找並運行name爲quotes的Spider,它會向quotes.toscrape.com這個網站發起HTTP請求,並獲取以下響應:
...
2016-12-16 21:24:05 [scrapy.core.engine] INFO: Spider opened 2016-12-16 21:24:05 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2016-12-16 21:24:05 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023 2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None) 2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/1/> (referer: None) 2016-12-16 21:24:05 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/page/2/> (referer: None) 2016-12-16 21:24:05 [quotes] DEBUG: Saved file quotes-1.html 2016-12-16 21:24: