1. 程式人生 > 實用技巧 >09 scrapy的中介軟體

09 scrapy的中介軟體

scrapy的中介軟體簡介

1 都寫在middlewares.py
2 爬蟲中介軟體
3 下載中介軟體
4 要生效,一定要配置,配置檔案

下載中介軟體:

下載中介軟體的用途
    1、在process——request內,自定義下載,不用scrapy的下載
    2、對請求進行二次加工,比如
        設定請求頭
        設定cookie
        新增代理
        scrapy自帶的代理元件:
            from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
            from urllib.request import getproxies

下載中介軟體程式碼解析:

class DownMiddleware1(object):
    def process_request(self, request, spider):
        """
        請求需要被下載時,經過所有下載器中介軟體的process_request呼叫
        :param request: 
        :param spider: 
        :return:  
            None,繼續後續中介軟體去下載;
            Response物件,停止process_request的執行,開始執行process_response
            Request物件,停止中介軟體的執行,將Request重新排程器
            raise IgnoreRequest異常,停止process_request的執行,開始執行process_exception
        """
        pass



    def process_response(self, request, response, spider):
        """
        spider處理完成,返回時呼叫
        :param response:
        :param result:
        :param spider:
        :return: 
            Response 物件:轉交給其他中介軟體process_response
            Request 物件:停止中介軟體,request會被重新排程下載
            raise IgnoreRequest 異常:呼叫Request.errback
        """
        print('response1')
        return response

    def process_exception(self, request, exception, spider):
        """
        當下載處理器(download handler)或 process_request() (下載中介軟體)丟擲異常
        :param response:
        :param exception:
        :param spider:
        :return: 
            None:繼續交給後續中介軟體處理異常;
            Response物件:停止後續process_exception方法
            Request物件:停止中介軟體,request將會被重新呼叫下載
        """
        return None

中介軟體的簡單使用:

1 更換請求頭
from scrapy.http.headers import Headers
request.headers['User-Agent']=''
2 cookie池
request.cookies={'username':'asdfasdf'}
3 代理池
request.meta['download_timeout'] = 20
request.meta["proxy"] = 'http://27.188.62.3:8060'

以上都是再request中用的

4 selenium在scrapy中的使用

ps:selenium最好寫在response中

# 當前爬蟲用的selenium是同一個

# 1 在爬蟲中初始化webdriver物件
    from selenium import webdriver
    class CnblogSpider(scrapy.Spider):
        name = 'cnblog'
        ...
 bro=webdriver.Chrome(executable_path='../chromedriver.exe')
# 2 在中介軟體中使用(process_request)
spider.bro.get('https://dig.chouti.com/')   response=HtmlResponse(url='https://dig.chouti.com/',body=spider.bro.page_source.encode('utf-8'),request=request)
    return response
	
# 3 在爬蟲中關閉
    def close(self, reason):
        print("我結束了")
        self.bro.close()