以下的內容均爲自己看書自學的分享,加深自己對於Scrapy的整體框架的理解。
Scrapy分析
1. 數據流總覽圖
1.1 Scrapy整體框架圖和數據流總覽
圖片爲自己學習總結所畫,有不對的地方可以評論私信指出。
2. 重要的組件和中間件分析
2.1 Spider
2.1.1 Spider運行流程
Spider是最核心的類,定義瞭如何爬取某個網站的流程和解析方式。簡單的來說其所要做的就是兩件事:
- 定義爬取網站的動作
- 分析爬取下來的網頁
整個的爬取流程如下:
- 以初始的URL初始化Request,並設置回調函數。當該Request成功請求返回後,Response生成並作爲參數傳遞給回調函數。
- 在回調函數內分析返回的網頁內容。返回的結果有兩種形式,(1)解析到的有效結果返回字典或Item對象,它們可以經過處理後直接保存。(2)解析得到的下一個鏈接,可以利用此鏈接構造Request並設置新的回調函數,返回Request等待後續的調度。
- 如果返回的是字典或Item對象,可以通過命令行的方式直接存入本地文件。若設置了Pipeline的話,便利用其中的自定義的方法進行處理後保存。
- 如果返回的是Request對象的話,那麼Request執行成功後得到的Response會被傳遞給Request中定義的回調函數,在回調函數中我們可以再次使用選擇器來分析新的網頁內容,並根據分析的數據生成Item。
2.1.2 Spider類的基礎屬性
Spider默認繼承的是scrapy.spiders.Spider。提供了默認的 start_requests()方法的實現,讀取並請求start_urls屬性,並根據返回結果調用parse()方法解析結果。
- name:爬蟲的名稱,必須是唯一的,創建項目的時候自動生成。不過可以生成多個相同的Spider實例,數量沒有限制。
- allowed_domains。允許爬取的域名,是可選配置,不在此範圍內的連接不會跟進爬取。
- start_urls。起始的URL列表,當沒有實現start_requests()方法時,默認會從這個列表開始抓取。
- custom_settings。一個字典,專屬於Spider的配置,此設置會覆蓋項目的全局設置。此設置必須在初始化前被更新,必須定義成類的變量。
- crawler。它是由from_crawler()方法設置的,利用它可以獲取項目的一些配置信息,如在settings中配置的信息。
- start_requests()。此方法用於生產初始請求,他必須返回一個可迭代的對象。此方法默認從start_urls裏面的URL來構造Request,而且Request時GET的請求方式。如果我們想在啓動時以POST的方式來訪問某個站點,可以直接重寫這個方法,發送POST請求時使用FromRequest即可。
- parse()。當Response沒有指定回調函數的時候,該方法會被默認使用,來處理Response,處理返回結果,並從中提取想要的數據和下一步的請求。
- closed()。當Spider關閉時該方法自動調用。
2.2 Downloader Middleware
下載中間件,處於Scrapy的Request和Response之間的處理模塊。
2.2.1 架構分析
Scheduler從隊列中拿出來一個Request發送給Downloader執行下載,這個過程會經過Downloader Middleware 的處理。當Downloader將Request下載完成後得到的Response返回給Spider處理的時候,也會經過Downloader Middleware 進行處理。
我們通過其可做的修改有兩處:
1.在Scheduler調度出隊列的Request發送給Downloader下載之前,也就是我們可以在Request執行下載任務之前對其進行處理。
2.在下載後生成Response發送給Spider之前,也就是我們可以在生成Response發送給Spider解析之前進行修改。
2.2.2 三個核心方法
(1)process_request(request,spider)。這個方法處理情況一,調用其方法對Request請求進行修改,比如修改頭部請求等,返回值必爲None,Response,Request對象之一,或者拋出異常。
(2)process_response(request,response,spider)。這個方法處理情況二,調用其對Response進行修改,比如修改狀態碼等。返回值必爲None,Response,Request對象之一,或者拋出異常。
(3)process_exception(request,exception,spider)。處理產生的異常,使得項目可以順利的執行完全程。
只需要實現其中一個方法,便可以定義一個 Downloader Middleware。
2.2.3 啓動自定義的 Downloader Middleware
在settings.py中,將DOWNLOADER_MIDDLEWARE取消註釋,設置爲:
DOWNLOADER_MIDDLEWARE = {
'項目名.middlewares.自己定義的middleware的名字':503(數字爲優先級)
}
2.3 Item Pipeline
2.3.1 主要功能
- 清理HTML數據
- 驗證爬取的數據,檢查爬取字段
- 查重並丟棄重複的內容
- 將爬取的數據返回給數據庫
2.3.2 核心方法
必須要實現的方法 process_item(item,spider)
被定義的 Item Pipeline 會默認調用這個方法對Item進行處理。比如將數據處理或將數據保存如數據庫等。它必須返回Item類型的值或拋出一個DropItem異常。
class PymysqlPipeline(object):
#連接數據庫
def __init__(self):
self.connect = pymysql.connect(
host = 'localhost',
database = 'image_360',
user = 'root',
password = '123456',
charset = 'utf8',
port = 3306
)
# 創建遊標對象
self.cursor = self.connect.cursor()
# 此方法是必須要實現的方法,被定義的 Item Pipeline 會默認調用這個方法對 Item 進行處理
def process_item(self,item,spider):
cursor = self.cursor
sql = 'insert into image_information(id,pic_desc,title,url,thumb) values (%s,%s,%s,%s,%s)'
cursor.execute(sql,(
item['id'],item['pic_desc'],item['title'],item['url'],item['thumb']
))
# 提交數據庫事務
self.connect.commit()
return item
2.3.3 三個實用的方法
- open_spider(self,spiser)。在Spider開啓的時候別調用,可以做一些初始化的操作,如開啓數據庫的連接等。
- close_spider(spider)。Spider關閉的時候調用,做一些收尾的操作,如關閉數據的連接等。
- from_crawler(cls,crawler)。一個類方法,用 @classmethod 標識,是一種依賴注入的方式。它的參數時crawler,通過crawler對象,可以拿到Scrapy所有核心組件,如全局配置信息,然後創建一個Pipeline實例。參數cls是Class,最後返回一個Class實例。