scrapy架構簡介


一.scrapy架構介紹

  1.結構簡圖:

    主要組成部分:Spider(產出request,處理response),Pipeline,Downloader,Scheduler,Scrapy Engine

  2.結構詳細圖:

    主要步驟(往復循環):

        1.Spiders(自己書寫的爬蟲邏輯,處理url及網頁等【spider genspider -t 指定模板  爬蟲文件名 域名】),返回Requests給engine——>

        2.engine拿到requests返回給scheduler(什么也沒做)——>

        3.然后scheduler會生成一個requests交給engine(url調度器)——>

        4.engine通過downloader的middleware一層一層過濾然后將requests交給downloader——>

        5.downloader下載完成后又通過middleware過濾將response返回給engine——>

        6.engine拿到response之后將response通過spiders的middleware過濾后返回給spider,然后spider做一些處理(如返回items或requests)——>

        7.spiders將處理后得到的一些items和requests通過中間件過濾返回給engine——>

        8.engine判斷返回的是items或requests,如果是items就直接返回給item pipelines,如果是requests就將requests返回給scheduler(和第二步一樣)       

     

    源碼簡介: 

源碼核心的東西

      engine.py中介紹:通過_next_request_from_scheduler判斷是否有requests(request返回給engine直接返回給scheduler【第一步】),request會首先調用schedule()函數發送給schedule(第二步),然后返回給engine

      downloader簡介:

可以處理很多類型的下載

    Request和Response簡介:

class Request(object_ref):

    def __init__(self, url, callback=None, method='GET', headers=None, body=None,
                 cookies=None, meta=None, encoding='utf-8', priority=0,
                 dont_filter=False, errback=None, flags=None):
......

 

      官網介紹(具體官網網址:https://doc.scrapy.org/en/latest/topics/request-response.html):

參 數:
  • url字符串) - 此請求的URL
  • callbackcallable) - 將使用此請求的響應(一旦下載)調用的函數作為其第一個參數。有關更多信息,請參閱下面將其他數據傳遞給回調函數如果請求未指定回調,則將使用spider的 parse()方法。請注意,如果在處理期間引發異常,則會調用errback。
  • methodstring) - 此請求的HTTP方法。默認為'GET'
  • metadict) - Request.meta屬性的初始值如果給定,則此參數中傳遞的dict將被淺層復制。
  • bodystr unicode) - 請求體。如果a unicode被傳遞,則str使用傳遞編碼(默認為utf-8對其 進行編碼如果 body未給出,則存儲空字符串。無論此參數的類型如何,存儲的最終值都是str(從不 unicodeNone)。
  • headersdict) - 此請求的標頭。dict值可以是字符串(對於單值標頭)或列表(對於多值標頭)。如果 None作為值傳遞,則根本不會發送HTTP標頭。
  • cookies(字典清單) -

    請求cookie。這些可以以兩種形式發送。

    1. 使用詞典:
      request_with_cookies = Request(url="http://www.example.com", cookies={'currency': 'USD', 'country': 'UY'}) 
    2. 使用dicts列表:
      request_with_cookies = Request(url="http://www.example.com", cookies=[{'name': 'currency', 'value': 'USD', 'domain': 'example.com', 'path': '/currency'}]) 

    后一種形式允許自定義 cookie的屬性domainpath屬性。這僅在保存cookie以供以后請求時才有用。

    當某個站點返回cookie(在響應中)時,這些cookie存儲在該域的cookie中,並將在將來的請求中再次發送。這是任何常規Web瀏覽器的典型行為。但是,如果由於某種原因,您希望避免與現有Cookie合並,則可以通過將dont_merge_cookies密鑰設置為True 來指示Scrapy執行此操作 Request.meta

    不合並cookie的請求示例:

    request_with_cookies = Request(url="http://www.example.com", cookies={'currency': 'USD', 'country': 'UY'}, meta={'dont_merge_cookies': True})
  • encoding字符串) - 此請求的編碼(默認為'utf-8')。此編碼將用於對URL進行百分比編碼並將正文轉換為str(如果給定unicode)。
  • priorityint) - 此請求的優先級(默認為0)。調度程序使用優先級來定義用於處理請求的順序。具有更高優先級值的請求將更早執行。允許使用負值以指示相對較低的優先級。
  • dont_filterboolean) - 表示調度程序不應過濾此請求。當您想要多次執行相同的請求時,可以使用此選項來忽略重復過濾器。小心使用它,否則您將進入爬行循環。默認為False
  • errbackcallable) - 在處理請求時引發任何異常時將調用的函數。這包括因404 HTTP錯誤而失敗的頁面等。它接收Twisted Failure實例作為第一個參數。有關更多信息,請參閱下面的使用errbacks捕獲請求處理中的異常
  • flagslist) - 發送給請求的標志,可用於日志記錄或類似目的。

 

class Response(object_ref):

    def __init__(self, url, status=200, headers=None, body=b'', flags=None, request=None):
        self.headers = Headers(headers or {})
        self.status = int(status)
        self._set_body(body)
        self._set_url(url)
        self.request = request
        self.flags = [] if flags is None else list(flags)
......
參數:
  • url字符串) - 此響應的URL
  • status整數) - 響應的HTTP狀態。默認為200
  • headersdict) - 此響應的標頭。dict值可以是字符串(對於單值標頭)或列表(對於多值標頭)。
  • body字節) - 響應主體。要將解碼后的文本作為str(Python 2中的unicode)訪問,您可以使用response.text來自編碼感知的 Response子類,例如TextResponse
  • flags列表) - 是包含Response.flags屬性初始值的列表 如果給定,列表將被淺層復制。
  • requestRequestobject) - Response.request屬性的初始值這表示Request生成此響應的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM