小白學 Python 爬蟲(33):爬蟲框架 Scrapy 入門基礎(一)

人生苦短,我用 Pythoncss

前文傳送門:html

小白學 Python 爬蟲(1):開篇python

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝git

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門github

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門shell

小白學 Python 爬蟲(5):前置準備(四)數據庫基礎數據庫

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝數據結構

小白學 Python 爬蟲(7):HTTP 基礎架構

小白學 Python 爬蟲(8):網頁基礎框架

小白學 Python 爬蟲(9):爬蟲基礎

小白學 Python 爬蟲(10):Session 和 Cookies

小白學 Python 爬蟲(11):urllib 基礎使用(一)

小白學 Python 爬蟲(12):urllib 基礎使用(二)

小白學 Python 爬蟲(13):urllib 基礎使用(三)

小白學 Python 爬蟲(14):urllib 基礎使用(四)

小白學 Python 爬蟲(15):urllib 基礎使用(五)

小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖

小白學 Python 爬蟲(17):Requests 基礎使用

小白學 Python 爬蟲(18):Requests 進階操做

小白學 Python 爬蟲(19):Xpath 基操

小白學 Python 爬蟲(20):Xpath 進階

小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)

小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)

小白學 Python 爬蟲(23):解析庫 pyquery 入門

小白學 Python 爬蟲(24):2019 豆瓣電影排行

小白學 Python 爬蟲(25):爬取股票信息

小白學 Python 爬蟲(26):爲啥買不起上海二手房你都買不起

小白學 Python 爬蟲(27):自動化測試框架 Selenium 從入門到放棄(上)

小白學 Python 爬蟲(28):自動化測試框架 Selenium 從入門到放棄(下)

小白學 Python 爬蟲(29):Selenium 獲取某大型電商網站商品信息

小白學 Python 爬蟲(30):代理基礎

小白學 Python 爬蟲(31):本身構建一個簡單的代理池

小白學 Python 爬蟲(32):異步請求庫 AIOHTTP 基礎入門

引言

首先恭喜看到這篇文章的各位同窗,從這篇文章開始,整個小白學 Python 爬蟲系列進入最後一部分,小編計劃是介紹一些經常使用的爬蟲框架。

說到爬蟲框架,首先繞不過去的必然是 Scrapy 。

Scrapy 是一個基於 Twisted 的異步處理框架,是純 Python 實現的爬蟲框架,其架構清晰,模塊之間的耦合程度低,可擴展性極強,能夠靈活完成各類需求。

固然第一件事兒仍是各類官方地址:

Scrapy 官網: https://scrapy.org/

Github:https://github.com/scrapy/scrapy

官方文檔:https://scrapy.org/doc/

架構概述

首先看一下 Scrapy 框架的架構體系圖:

從這張圖中,能夠看到 Scrapy 分紅了不少個組件,每一個組件的含義以下:

  • Engine 引擎:引擎負責控制系統全部組件之間的數據流,並在發生某些操做時觸發事件。
  • Item 項目:它定義了爬取結果的數據結構,爬取的數據會被賦值成該對象。
  • Scheduler 調度器:用來接受引擎發過來的請求並加入隊列中,並在引擎再次請求的時候提供給引擎。
  • Downloader 下載器:下載器負責獲取網頁並將其饋送到引擎,引擎又將其饋給蜘蛛。
  • Spiders 蜘蛛:其內定義了爬取的邏輯和網頁的解析規則,它主要負責解析響應並生成提取結果和新的請求。
  • Item Pipeline 項目管道:負責處理由蜘蛛從網頁中抽取的項目,它的主要任務是清洗、驗證和存儲數據。
  • Downloader Middlewares 下載器中間件:下載器中間件是位於引擎和Downloader之間的特定掛鉤,它們在從引擎傳遞到Downloader時處理請求,以及從Downloader傳遞到Engine的響應。
  • Spider Middlewares 蜘蛛中間件:蜘蛛中間件是位於引擎和蜘蛛之間的特定掛鉤,而且可以處理蜘蛛的輸入(響應)和輸出(項目和請求)。

上面這張圖的數據流程以下:

  1. 該引擎獲取從最初請求爬行 蜘蛛。
  2. 該引擎安排在請求 調度程序和要求下一個請求爬行。
  3. 該計劃返回下一請求的引擎。
  4. 該引擎發送請求到 下載器,經過 下載器中間件。
  5. 頁面下載完成後, Downloader會生成一個帶有該頁面的響應,並將其發送到Engine,並經過 Downloader Middlewares。
  6. 該引擎接收來自響應 下載器並將其發送到所述 蜘蛛進行處理,經過蜘蛛中間件。
  7. 該蜘蛛處理響應並返回刮下的項目和新的要求(跟隨)的 引擎,經過 蜘蛛中間件。
  8. 該引擎發送處理的項目,以 項目管道,而後把處理的請求的調度,並要求從此可能請求爬行。
  9. 重複該過程(從步驟1開始),直到再也不有Scheduler的請求爲止 。

這張圖的名詞有些多,記不住實屬正常,不過不要緊,後續小編會配合着示例代碼,和各位同窗一塊兒慢慢的學習。

基礎示例

先來個最簡單的示例項目,在建立項目以前,請肯定本身的環境已經正確安裝了 Scrapy ,若是沒有安裝的同窗能夠看下前面的文章,其中有介紹 Scrapy 的安裝配置。

首先須要建立一個 Scrapy 的項目,建立項目須要使用命令行,在命令行中輸入如下命令:

scrapy startproject first_scrapy

而後一個名爲 first_scrapy 的項目就建立成功了,項目文件結構以下:

first_scrapy/
    scrapy.cfg            # deploy configuration file

    first_scrapy/             # project's Python module, you'll import your code from here
        __init__.py

        items.py          # project items definition file

        middlewares.py    # project middlewares file

        pipelines.py      # project pipelines file

        settings.py       # project settings file

        spiders/          # a directory where you'll later put your spiders
            __init__.py
  • scrapy.cfg:它是 Scrapy 項目的配置文件,其內定義了項目的配置文件路徑、部署相關信息等內容。
  • items.py:它定義 Item 數據結構,全部的 Item 的定義均可以放這裏。
  • pipelines.py:它定義 Item Pipeline 的實現,全部的 Item Pipeline 的實現均可以放這裏。
  • settings.py:它定義項目的全局配置。
  • middlewares.py:它定義 Spider Middlewares 和 Downloader Middlewares 的實現。
  • spiders:其內包含一個個 Spider 的實現,每一個 Spider 都有一個文件。

到此,咱們已經成功建立了一個 Scrapy 項目,可是這個項目目前是空的,咱們須要再手動添加一隻 Spider 。

Scrapy 用它來從網頁裏抓取內容,並解析抓取的結果。不過這個類必須繼承 Scrapy 提供的 Spider 類 scrapy.Spider,還要定義 Spider 的名稱和起始請求,以及怎樣處理爬取後的結果的方法。

建立 Spider 可使用手動建立,也可使用命令建立,小編這裏演示一下如何使用命令來建立,以下:

scrapy genspider quotes quotes.toscrape.com

將會看到在 spider 目錄下新增了一個 QuotesSpider.py 的文件,裏面的內容以下:

# -*- coding: utf-8 -*-
import scrapy


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        pass

能夠看到,這個類裏面有三個屬性 nameallowed_domainsstart_urls 和一個 parse() 方法。

  • name,它是每一個項目惟一的名字,用來區分不一樣的 Spider。
  • allowed_domains,它是容許爬取的域名,若是初始或後續的請求連接不是這個域名下的,則請求連接會被過濾掉。
  • start_urls,它包含了 Spider 在啓動時爬取的 url 列表,初始請求是由它來定義的。
  • parse,它是 Spider 的一個方法。默認狀況下,被調用時 start_urls 裏面的連接構成的請求完成下載執行後,返回的響應就會做爲惟一的參數傳遞給這個函數。該方法負責解析返回的響應、提取數據或者進一步生成要處理的請求。

到這裏咱們就清楚了, parse() 方法中的 response 是前面的 start_urls 中連接的爬取結果,因此在 parse() 方法中,咱們能夠直接對爬取的結果進行解析。

先看下網頁的 DOM 結構:

接下來要作的事情就比較簡單了,獲取其中的數據,而後將其打印出來。

數據提取的方式能夠是 CSS 選擇器也能夠是 XPath 選擇器,小編這裏使用的是 CSS 選擇器,將咱們剛纔的 parse() 方法進行一些簡單的改動,以下:

def parse(self, response):
    quotes = response.css('.quote')
    for quote in quotes:
        text = quote.css('.text::text').extract_first()
        author = quote.css('.author::text').extract_first()
        tags = quote.css('.tags .tag::text').extract()
        print("text:", text)
        print("author:", author)
        print("tags:", tags)

首先是獲取到全部的 class 爲 quote 的元素,而後將全部元素進行循環後取出其中的數據,最後對這些數據進行打印。

程序到這裏就寫完了,那麼接下來的問題是,咱們如何運行這隻爬蟲?

Scrapy 的運行方式一樣適用適用命令行的,首先要到這個項目的根目錄下,而後執行如下代碼:

scrapy crawl quotes

結果以下:

能夠看到,咱們剛纔 print() 的內容正常的打印在了命令行中。

除了咱們 print() 中的內容的打印,還能夠看到在 Scrapy 啓動的過程當中, Scrapy 輸出了當前的版本號以及正在啓動的項目名稱,而且在爬取網頁的過程當中,首先訪問了 http://quotes.toscrape.com/robots.txt 機器人協議,雖然這個協議在當前這個示例中響應了 404的狀態碼,可是 Scrapy 會根據機器人協議中的內容進行爬取。

示例代碼

本系列的全部代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便你們取用。

示例代碼-Github

示例代碼-Gitee

參考

https://docs.scrapy.org/en/latest/intro/tutorial.html

https://docs.scrapy.org/en/latest/topics/architecture.html

https://cuiqingcai.com/8337.html

原文出處:https://www.cnblogs.com/babycomeon/p/12159528.html

相關文章
相關標籤/搜索