天天看點

Scrapy架構-Spider Middleware的使用spider的運作流程Downloader Middleware的用法Downloader Middleware執行個體Spider Middleware的用法

Spider的用法

  • spider的運作流程
    • 爬取循環過程
  • Downloader Middleware的用法
    • Downloader Middleware的核心方法
  • Downloader Middleware執行個體
  • Spider Middleware的用法

spider的運作流程

  • 定義爬取網站的動作
  • 分析爬取下來的網頁

爬取循環過程

  • 以初始的URL初始呼哈Request,并設定回調函數
  • 在回調函數内分析傳回的網頁内容 1
  • 根據傳回結果,進行不同處理 2

Downloader Middleware的用法

Downloader Middleware在整個架構中起作用的位置是兩個。

1.在Scheduler排程出隊列的Request發送給Downloader下載下傳之前

2.在下載下傳後生成的Response發送給Spider之前,也就是可以在生成Response被Spider解析之前對其進行修改

Downloader Middleware的核心方法

  • process_request(request,spider):參數request,spider
  • process_response(request,response,spider):參數request,response,spider
  • process_exception(request,exception,spider)

    隻需要實作至少一個方法,就可以定義一個Downloader Middleware

Downloader Middleware執行個體

建立項目

Scrapy架構-Spider Middleware的使用spider的運作流程Downloader Middleware的用法Downloader Middleware執行個體Spider Middleware的用法

建立Spider

Scrapy架構-Spider Middleware的使用spider的運作流程Downloader Middleware的用法Downloader Middleware執行個體Spider Middleware的用法

修改Spider httpbin.py

Scrapy架構-Spider Middleware的使用spider的運作流程Downloader Middleware的用法Downloader Middleware執行個體Spider Middleware的用法

修改請求時的User-Agent可以通過Downloder Middleware實作一個随機User-Agent的設定

在middlewares.py裡面添加一個RandomUserAgentMiddleware的類

class RandomUserAgentMiddleware():
    def __init__(self):
        self.user_agents=[
            'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)',
            'Mozilla/5.0 (windows NT 6.1) AppleWebKit/537.2 (KHTML,like Gecko) Chrome/22.0.1216.0 Safari/537.2',
            'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1'
        ]
    def process_request(self,request,spider):
        request.headers['User-Agent']=random.choice(self.user_agents)
           

Spider Middleware的用法

  • 在Response發送給Spider之前對Response進行處理
  • 在Request發送給Scheduler之前對Request進行處理
  • 在Item發送給Item Pipeline之前對Item進行處理

    核心方法

  • process_spider_input(response,spider):當Response被Spider Middleware處理時 3
  • process_spider_output(response,result,spider):當Spiderchuli Response傳回結果時必須傳回包含Request或Item對象的可疊代對象 4
  • process_spider_exception(response, exception,spider): 當Spider或Spider Middleware的process_spider_input()方法抛出異常時,必須沒麼傳回None,要麼傳回一個包含Response或Item對象的可疊代對象5
  • process_start_requests(start_requests,spider):以Spider啟動的Request為參數被調用,執行的過程類似于process_spider_output(),他沒有相關聯的Response,并且必須傳回Request 6

    隻需要實作其中一個方法就可以定義一個Spider Middleware

  1. 一種傳回結果經處理後儲存,一種解析得到下一個連結,可以利用此連結構造Request并設定新的回調函數 ↩︎
    1. 傳回字典或Item對象,可通過Feed Exports等元件将傳回結果存入檔案,如果有pipeline就用它處理 2.傳回Request,執行後得到response被傳遞給Request中定義的回調函數,在回調函數中
    ↩︎
  2. 包含兩個參數:response,spider ↩︎
  3. 包含三個參數:response,result,spider ↩︎
  4. 包含三個參數:response,exception,spider ↩︎
  5. 包含兩個參數:start_requests,是包含Request的可疊代對象。spider ↩︎