一.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
- callback(callable) - 將使用此請求的響應(一旦下載)調用的函數作為其第一個參數。有關更多信息,請參閱下面將其他數據傳遞給回調函數。如果請求未指定回調,則將使用spider的
parse() 方法。請注意,如果在處理期間引發異常,則會調用errback。
- method(string) - 此請求的HTTP方法。默認為
'GET' 。
- meta(dict) -
Request.meta 屬性的初始值。如果給定,則此參數中傳遞的dict將被淺層復制。
- body(str 或unicode) - 請求體。如果a
unicode 被傳遞,則str 使用傳遞的編碼(默認為utf-8 )對其 進行編碼。如果 body 未給出,則存儲空字符串。無論此參數的類型如何,存儲的最終值都是str (從不 unicode 或None )。
- headers(dict) - 此請求的標頭。dict值可以是字符串(對於單值標頭)或列表(對於多值標頭)。如果
None 作為值傳遞,則根本不會發送HTTP標頭。
- cookies(字典或清單) -
請求cookie。這些可以以兩種形式發送。
- 使用詞典:
request_with_cookies = Request(url="http://www.example.com", cookies={'currency': 'USD', 'country': 'UY'})
- 使用dicts列表:
request_with_cookies = Request(url="http://www.example.com", cookies=[{'name': 'currency', 'value': 'USD', 'domain': 'example.com', 'path': '/currency'}])
后一種形式允許自定義 cookie的屬性domain 和path 屬性。這僅在保存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 )。
- priority(int) - 此請求的優先級(默認為
0 )。調度程序使用優先級來定義用於處理請求的順序。具有更高優先級值的請求將更早執行。允許使用負值以指示相對較低的優先級。
- dont_filter(boolean) - 表示調度程序不應過濾此請求。當您想要多次執行相同的請求時,可以使用此選項來忽略重復過濾器。小心使用它,否則您將進入爬行循環。默認為
False 。
- errback(callable) - 在處理請求時引發任何異常時將調用的函數。這包括因404 HTTP錯誤而失敗的頁面等。它接收Twisted Failure實例作為第一個參數。有關更多信息,請參閱下面的使用errbacks捕獲請求處理中的異常。
- flags(list) - 發送給請求的標志,可用於日志記錄或類似目的。
|
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 。
- headers(dict) - 此響應的標頭。dict值可以是字符串(對於單值標頭)或列表(對於多值標頭)。
- body(字節) - 響應主體。要將解碼后的文本作為str(Python 2中的unicode)訪問,您可以使用
response.text 來自編碼感知的 Response子類,例如TextResponse 。
- flags(列表) - 是包含
Response.flags 屬性初始值的列表 。如果給定,列表將被淺層復制。
- request(
Request object) - Response.request 屬性的初始值。這表示Request 生成此響應的內容。
|