1. 程式人生 > >下載中介軟體

下載中介軟體

執行順序:

找到這個爬蟲,並執行爬蟲裡面的start_requets的方法,得到一個迭代器,start_request預設的回撥函式是parse
迭代器的裡面的作用是會迴圈獲取到requets物件,requtes物件裡面封裝了要訪問的url和回撥函式
將所有的request物件(任務)放到排程器裡面,供下載器下載

下載器會去排程器裡面獲取要下載的requets物件,然後執行裡面的回撥函式
然後在爬蟲裡面執行yield items
yield requets方法

去重就是在爬蟲往排程器裡面放之前先去去重裡面看一下,這個要放進排程器裡面的url是否是存在的

中介軟體就是往裡面加點東西,比如限制什麼的,返回什麼,代理什麼

在下載器去排程器裡面取requets物件(任務)的時候
會穿過中間的中介軟體部分
下載中介軟體:
process_requets
process_response
process_exeption

如果中介軟體沒有任何返回值的話就會一直到下載器那裡
假如兩個中介軟體的話:
process_requets1
process_requets2
process_response2
process_response1
優先順序越小越先執行,在start_requets裡面有設定優先順序和深度,每執行一次的話,優先順序就做相對應的減小
深度就加1


如果中介軟體有返回的話,分情況:
如果第一種:HtmlResponse(在process_request)


from scrapy.http import HtmlResponse
return HtmlResponse(url='xxxxxxx',status=200,headers=None,body='')
直接返回,不處理後面的process_requets

如果丟擲異常的話:
##第二種方式:忽視這個返回的結果,丟擲異常
# from scrapy.exceptions import IgnoreRequest
# raise IgnoreRequest

如果是第三種方式的haul
可以在請求的url裡面加點東西上去,比如請求頭加上代理,或者什麼
##對傳送過來的請求進行加工處理
request.header['']=''


請求過來的requets裡面有封裝url,header,body部分

 

 

下載中介軟體部分:

'''
在下載器取排程器裡面取封裝好的requets物件(裡面封裝了url,回撥函式)的時候,會經過下載中介軟體部分
下載中介軟體部分會拿到requets物件,裡面封裝了要訪問的url和要回調函式(當下載器執行完成之後的回撥函式)

'''
from scrapy.http import HtmlResponse
from scrapy import signals
class Self_Middleware():
@classmethod
def from_crawler(cls, crawler):
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s

def process_request(self, request, spider):
print('執行1process_request方法',request)
##在這裡只要以返回值回來的話,那麼就不會繼續往下面執行了
return request#如果是返回requets的話,那麼這個是會到排程器裡面不停取值,一直迴圈,拿取,拿取(除非有去重操作)

#第一種方式:返回httprespone,返回response
# return HtmlResponse(url='http://www.xxxx.com',status=200,headers=None,body='')
##當有resoponse的時候,就不往下面執行了
##第二種方式:忽視這個返回的結果,丟擲異常
# from scrapy.exceptions import IgnoreRequest
# raise IgnoreRequest
##加工處理 在settings裡面有配置,原始碼已經想到了,但也可以在這裡進行配置
##對傳送過來的請求進行加工處理,requets,spider
request.header['']=''##在傳過來的請求進行加工處理


def process_response(self, request, response, spider):
print('執行1response方法',request)
# return HtmlResponse(url='xxxxxxx',status=200,headers=None,body='')
return response


def process_exception(self, request, exception, spider):
pass

def spider_opened(self, spider):
print('開啟爬蟲1')
spider.logger.info('Spider opened: %s' % spider.name)


class Self_Middleware1():
@classmethod
def from_crawler(cls, crawler):
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s

def process_request(self, request, spider):
print('執行process_request2方法',request.url)
##在這裡只要以返回值回來的話,那麼就不會繼續往下面執行了

def process_response(self, request, response, spider):
print('執行response2方法',request.url)
##也可以在這裡做限制:對返回的結果做處理
return response

def process_exception(self, request, exception, spider):
pass

def spider_opened(self, spider):
print('開啟爬蟲2')
spider.logger.info('Spider opened: %s' % spider.name)