scrapy核心組件工做流程和post請求

一 . 五大核心組件的工做流程

    • 引擎(Scrapy)
      用來處理整個系統的數據流處理, 觸發事務(框架核心)
    • 調度器(Scheduler)
      用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 能夠想像成一個URL(抓取網頁的網址或者說是連接)的優先隊列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址
    • 下載器(Downloader)
      用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是創建在twisted這個高效的異步模型上的)
    • 爬蟲(Spiders)
      爬蟲是主要幹活的, 用於從特定的網頁中提取本身須要的信息, 即所謂的實體(Item)。用戶也能夠從中提取出連接,讓Scrapy繼續抓取下一個頁面
    • 項目管道(Pipeline)
      負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證明體的有效性、清除不須要的信息。當頁面被爬蟲解析後,將被髮送到項目管道,並通過幾個特定的次序處理數據。

工做流程

Scrapy中的數據流由執行引擎控制,其過程以下:框架

引擎從Spiders中獲取到最初的要爬取的請求(Requests).
引擎安排請求(Requests)到調度器中,並向調度器請求下一個要爬取的請求(Requests).
調度器返回下一個要爬取的請求(Requests)給引擎.
引擎將上步中獲得的請求(Requests)經過下載器中間件(Downloader Middlewares)發送給下載器(Downloader ),這個過程當中下載器中間件(Downloader Middlewares)中的process_request()函數會被調用到.
一旦頁面下載完畢,下載器生成一個該頁面的Response,並將其經過下載中間件(Downloader Middlewares)發送給引擎,這個過程當中下載器中間件(Downloader Middlewares)中的process_response()函數會被調用到.
引擎從下載器中獲得上步中的Response並經過Spider中間件(Spider Middlewares)發送給Spider處理,這個過程當中Spider中間件(Spider Middlewares)中的process_spider_input()函數會被調用到.
Spider處理Response並經過Spider中間件(Spider Middlewares)返回爬取到的Item及(跟進的)新的Request給引擎,這個過程當中Spider中間件(Spider Middlewares)的process_spider_output()函數會被調用到.
引擎將上步中Spider處理的其爬取到的Item給Item 管道(Pipeline),將Spider處理的Request發送給調度器,並向調度器請求可能存在的下一個要爬取的請求(Requests).
(從第二步)重複直到調度器中沒有更多的請求(Requests).異步

 

二 . post請求發送

  在以前代碼中,咱們歷來沒有過手動的對start_urls 列表中存儲的起始url進行對請求的發送, 可是起始url的確進行了請求的發送, 這是怎麼實現的呢?scrapy

  解答: 其實爬蟲文件中的爬蟲類繼承了Spider父類中的start_urls(self)這個方法,該方法就能夠對start_urls列表中的url發起請求 : ide

def start_requests(self):
        for u in self.start_urls:
           yield scrapy.Request(url=u,callback=self.parse)

注意 : 該方法默認的是進行get請求的發送,若是想要進行post請求,就要重寫該方法 : 函數

def start_requests(self):
    #請求的url
    post_url = 'http://fanyi.baidu.com/sug'
    #post請求的參數,是個字典的形式
    data = {
        'kw':'dog'
}
    #發送post請求
    yield scrapy.FormRequest(url=post_url,formdata=data,callback=self.parse)
相關文章
相關標籤/搜索