python | 爬蟲筆記 - (八)Scrapy框架基礎

1、簡介

Scrapy是一個基於Twisted 的異步處理框架,是針對爬蟲過程當中的網站數據爬取、結構性數據提取而編寫的應用框架。 能夠應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。

1.1 安裝

pip3 install Scrapy

1.2 框架介紹

組成:
  · Engine 引擎,處理整個系統的數據流處理、觸發事務
  · Item 項目,定義爬取結果的數據結構
  · Scheduler 調度器
  · Downloader 下載器
  · Spider 定義爬取邏輯和網頁解析規則
  · Item Pipeline 項目管道,清洗、驗證和存儲數據
  · Downloader Middlewares 下載器中間件
  · Spider Middlewares 蜘蛛中間件

1.3 部分詳解

1.3.1 spider
· 定義爬取網站的動做
· 分析爬取下來的網頁
 
爬取循環過程以下:
初始的url初始化request-> Response做爲參數返回回調函數 -> 回調函數分析網頁內容 1)返回字典或item,可用pipelin處理 2)返回request 回調函數循環請求,直到生成item
 
1.3.2 Downloader Middleware
Request和Response之間的處理模塊,能夠完成修改 User-Agent、 處理重定向 、設置代理、失敗重試、 設置 Cookies等功能。此模塊很是重要
核心方法
process_request(request, spider)
process_response(request, response, spider)
process_exception(request, exception, spider)
 
1.3.3 Spider Middleware
spider處理機制的子框架
核心方法:
process_spider_input(response, spider)
process_spider_output(response, result, spider)
process_spider_exception(response, exception, spider)
process_start_requests(start_requests, spider)
 
1.3.4 Item Pipeline
open_spider(spider)
close_spider(spider)
from_crawler(cls, crawler)

1.4 selector

1)直接使用
from scrapy import selector
 
body = '...'
selector = Selector(text=body)
title = selector.xpath('//title/text()').extract_first() #提取title標籤裏的內容
print(title)

構建時傳入text參數,生成selector對象,經過xpath(), css()等方法提取css

 
2)shell文件
scrapy shell 網址
以後在shell中能夠用不一樣選擇器進行操做。selector主要操做Response這個變量來進行解析
· result結果獲得selectorlist類型列表變量;
· 可以使用xpath()、css() 和正則表達式的方法選擇
· extract()/ extract_first() 獲取內容
e.g.
result = response.selector.xpath('//a')
result
result.xpath('.//a[@href="image1.html"]/text()')extract_first() #xpath
result.css('a[@href="image1.html"]::text]).extract_first() #css
#備註:css中獲取文本和屬性須要用::text和::attr()的寫法

2、上手項目

內容:爬取 http://quotes.toscrape.com
流程框架:抓取第一頁-獲取內容和下一頁鏈接-翻頁爬取-保存爬取結果

2.1 建立項目

經過命令行來建立項目
scrapy startproject tutorial
建立目錄以下

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

2.2 編寫一個Spider

Spider是用戶編寫用於從單個網站(或者一些網站)爬取數據的類。其包含了一個用於下載的初始URL,如何跟進網頁中的連接以及如何分析頁面中的內容, 提取生成 item 的方法。
 
爲了建立一個Spider,必須繼承 scrapy.Spider 類, 且定義如下三個屬性:
  · name
  · start_urls
  · parse: 被調用時,每一個初始URL完成下載後生成的 Response 對象將會做爲惟一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成須要進一步處理的URL的 Request 對象。
scrapy genspider quotes quotes.toscrape.com

2.3 建立Item

Item 是保存爬取到的數據的容器;其使用方法和python字典相似, 而且提供了額外保護機制來避免拼寫錯誤致使的未定義字段錯誤。
在item中定義相應的字段。編輯 tutorial 目錄中的 items.py 文件
import scrapy

class QuoteItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()
字段field() 指明瞭每一個字段的元數據

2.4 解析Response

parse()方法的參數 resposne 是 start_urls 裏面的連接爬取後的結果 。 因此在 parse()方法中,咱們能夠直接對 response 變量包含的內容進行解析,好比瀏覽請求結果的網頁源代碼,或者進一步分析源代碼內容,或者找出結果中的連接而獲得下一個請求 。
 
分析網頁結構
進入項目的根目錄,執行下列命令啓動spider:
scrapy crawl quotes

2.5 使用item

Item能夠理解爲一個字典,不過在聲明的時候須要實例化。 而後依次用剛纔解析的結果賦值 Item的每個字段, 最後將 Item返回便可。
quotes = response.css('.quote')   #選擇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
首頁的全部內容被解析出來 ,並被賦值成了一個個 QuoteItem。
scrapy shell quotes.toscrape.com #能夠在命令行交互

2.6 後續Request-多頁抓取

找到next按鈕,查看源代碼,能夠根據連接構建下一個請求。
經過遞歸調用,回調函數調用本身,實現翻頁循環
next = response.css('.pager .next a::attr(href)').extract_first()
        url = response.urljoin(next)
        yield scrapy.Request(url=url, callback=self.parse) 

2.7 保存到文件

scrapy crawl quotes -o quotes.json #也能夠保存成csv,xml等不一樣文件格式

2.8 使用Item Pipeline

經過item Pipeline能夠實現更復雜的操做,好比將數據保存到MongoDB,或者篩選某些有用的item
Pipeline功能主要包括:
- 清理 HTML數據。
- 驗證爬取數據,檢查爬取字段
- 查重井丟棄重複內容。
- 將爬取結果保存到數據庫。
 
定義一個類並實現process_item()方法
兩個參數item和spider實例
from scrapy.exceptions import DropItem

class TextPipeline(object):
    def __init__(self):
        self.limit = 50

    def process_item(self, item, spider):
        if item['text']:
            if len(item['text']) > self.limit:
                item['text'] = item['text'][0:self.limit].rstrip() + '...'  #設置長度50截斷字符串
            return item
        else:
            return DropItem('Missing Text')
處理後的item便可存入MongoDB,其中涉及另外幾個方法
- from_crawler 類方法@class,經過crawler能夠拿到全局配置的信息,在setting.py中。好比在其中設置MongoDB的名稱和地址,而後經過這個方法獲取
- openspider
- closespider
經過process_item方法執行數據插入操做
執行後可在數據庫中查看對應表格
 
本節對應代碼請見:

##本系列內容爲《python3爬蟲開發實戰》學習筆記。本系列博客列表以下:html

(零)學習路線python

(一)開發環境配置正則表達式

(二)爬蟲基礎shell

(三)基本庫使用數據庫

(四)解析庫使用json

(五)數據存儲數據結構

(六)Ajax數據爬取框架

(七)動態渲染頁面爬取Selenium異步

持續更新...

相關文章
相關標籤/搜索