麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 操作系統 > 正文

Spider 中間件(Middleware)

2024-06-28 16:02:23
字體:
來源:轉載
供稿:網友
Spider 中間件(Middleware) 下載器中間件是介入到 Scrapy 的 spider 處理機制的鉤子框架,您可以添加代碼來處理發送給 Spiders 的 response 及 spider 產生的 item 和 request。激活 spider 中間件要啟用 spider 中間件,您可以將其加入到 SPIDER_MIDDLEWARES 設置中。該設置是一個字典,鍵位中間件的路徑,值為中間件的順序(order)。

樣例:

#取消默認的useragent,使用新的useragent DOWNLOADER_MIDDLEWARES = { 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,#關閉默認下載器 'javaScriptMiddleware.JavascriptMiddleware':543 #鍵為中間件類的路徑,值為中間件的順序 } SPIDER_MIDDLEWARES 設置會與 Scrapy 定義的 SPIDER_MIDDLEWARES_BASE 設置合并(但不是覆蓋), 而后根據順序(order)進行排序,最后得到啟用中間件的有序列表: 第一個中間件是最靠近引擎的,最后一個中間件是最靠近 spider 的。關于如何分配中間件的順序請查看 SPIDER_MIDDLEWARES_BASE 設置,而后根據您想要放置中間件的位置選擇一個值。 由于每個中間件執行不同的動作,您的中間件可能會依賴于之前(或者之后)執行的中間件,因此順序是很重要的。如果您想禁止內置的(在 SPIDER_MIDDLEWARES_BASE 中設置并默認啟用的)中間件,您必須在項目的 SPIDER_MIDDLEWARES設置中定義該中間件,并將其值賦為 None。例如,如果您想要關閉 off-site 中間件:SPIDER_MIDDLEWARES = { 'myPRoject.middlewares.CustomSpiderMiddleware': 543, 'scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware': None,}

最后,請注意,有些中間件需要通過特定的設置來啟用。更多內容請查看相關中間件文檔。

編寫您自己的 spider 中間件

編寫 spider 中間件十分簡單。每個中間件組件是一個定義了以下一個或多個方法的 Python 類:

class scrapy.contrib.spidermiddleware.SpiderMiddlewareprocess_spider_input(response, spider) 當 response 通過 spider 中間件時,該方法被調用,處理該 response。process_spider_input()應該返回 None 或者拋出一個異常。如果其返回 None,Scrapy 將會繼續處理該 response,調用所有其他的中間件直到 spider 處理該 response。如果其跑出一個異常(exception),Scrapy 將不會調用任何其他中間件的 process_spider_input()方法,并調用 request 的 errback。 errback 的輸出將會以另一個方向被重新輸入到中間件鏈中,使用 process_spider_output()方法來處理,當其拋出異常時則帶調用 process_spider_exception()。參數:? response (Response 對象) – 被處理的 response? spider (Spider 對象) – 該 response 對應的 spider

process_spider_output(response, result, spider)

當 Spider 處理 response 返回 result 時,該方法被調用。當 Spider 處理 response 返回 result 時,該方法被調用。process_spider_output()必須返回包含 Request 或 Item對象的可迭代對象(iterable)。參數: response (Response 對象) – 生成該輸出的 response result (包含 Request 或 Item 對象的可迭代對象(iterable)) – spider 返回的 result spider (Spider 對象) – 其結果被處理的 spider

process_spider_exception(response, exception, spider)

當 spider 或(其他 spider 中間件的) process_spider_input()跑出異常時, 該方法被調用process_spider_exception()必須要么返回 None, 要么返回一個包含 Response 或 Item 對象的可迭代對象(iterable)。如果其返回 None,Scrapy 將繼續處理該異常,調用中間件鏈中的其他中間件的process_spider_exception()方法,直到所有中間件都被調用,該異常到達引擎(異常將被記錄并被忽略)。如果其返回一個可迭代對象,則中間件鏈的 process_spider_output()方法被調用, 其他的 process_spider_exception()將不會被調用。參數: response (Response 對象) – 異常被拋出時被處理的 response exception (Exception 對象) – 被跑出的異常 spider (Spider 對象) – 拋出該異常的 spider

process_start_requests(start_requests, spider)

該方法以 spider 啟動的 request 為參數被調用,執行的過程類似于 process_spider_output(),只不過其沒有相關聯的 response 并且必須返回 request(不是 item)。其接受一個可迭代的對象(start_requests 參數)且必須返回另一個包含 Request 對象的可迭代對象。

注解

當在您的 spider 中間件實現該方法時, 您必須返回一個可迭代對象(類似于參數 start_requests)且不要遍歷所有的 start_requests。該迭代器會很大(甚至是無限),進而導致內存溢出。Scrapy 引擎在其具有能力處理 start request 時將會拉起 request,因此 start request 迭代器會變得無限,而由其他參數來停止 spider( 例如時間限制或者 item/page 記數)。

參數:

start_requests (包含 Request 的可迭代對象) – start requests spider (Spider 對象) – start requests 所屬的 spider

內置 spider 中間件參考手冊 本頁面介紹了 Scrapy 自帶的所有 spider 中間件。關于如何使用及編寫您自己的中間件,請參考 spider middleware usage guide。關于默認啟用的中間件列表(及其順序)請參考 SPIDER_MIDDLEWARES_BASE 設置。

DepthMiddleware

class scrapy.contrib.spidermiddleware.depth.DepthMiddlewareDepthMiddleware 是一個用于追蹤每個 Request 在被爬取的網站的深度的中間件。 其可以用來限制爬取深度的最DepthMiddleware 可以通過下列設置進行配置(更多內容請參考設置文檔):大深度或類似的事情。 ? DEPTH_LIMIT - 爬取所允許的最大深度,如果為 0,則沒有限制。 ? DEPTH_STATS - 是否收集爬取狀態。 ? DEPTH_PRIORITY - 是否根據其深度對 requet 安排優先級

HttpErrorMiddleware

class scrapy.contrib.spidermiddleware.httperror.HttpErrorMiddleware 過濾出所有失敗(錯誤)的 HTTP response,因此 spider 不需要處理這些 request。 處理這些 request 意味著消耗更多資源,并且使得 spider 邏輯更為復雜。 根據 HTTP 標準,返回值為 200-300 之間的值為成功的 resonse。如果您想處理在這個范圍之外的 response,您可以通過 spider 的 handle_httpstatus_list 屬性或 HTTPERROR_ALLOWED_CODES 設置來指定 spider 能處理的 response 返回值。

例如,如果您想要處理返回值為 404 的 response 您可以這么做:

class MySpider(CrawlSpider): handle_httpstatus_list = [404] Request.meta 中的 handle_httpstatus_list 鍵也可以用來指定每個 request 所允許的 response code。不過請記住,除非您知道您在做什么,否則處理非 200 返回一般來說是個糟糕的決定。

更多內容請參考:HTTP Status Code 定義。

HttpErrorMiddleware settings HTTPERROR_ALLOWED_CODES 默認:[] 忽略該列表中所有非 200 狀態碼的 response。 HTTPERROR_ALLOW_ALL 默認:False 忽略所有 response,不管其狀態值。

OffsiteMiddleware

class scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware

過濾出所有 URL 不由該 spider 負責的 Request。該中間件過濾出所有主機名不在 spider 屬性 allowed_domains 的 request。

當 spide 返回一個主機名不屬于該 spider 的 request 時, 該中間件將會做一個類似于下面的記錄:

DEBUG: Filtered offsite request to 'www.othersite.com': <GET http://www.othersite.com/some/page.html>

為了避免記錄太多無用信息,其將對每個新發現的網站記錄一次。因此,例如,如果過濾出另一個 www.othersite.com請求,將不會有新的記錄 但如果過濾出 someothersite.com 請求,仍然會有記錄信息(僅針對第一次)。如果 spider 沒有定義 allowed_domains 屬性,或該屬性為空,則 offsite 中間件將會允許所有 request。如果 request 設置了 dont_filter 屬性,即使該 request 的網站不在允許列表里,則 offsite 中間件將會允許該 request。

RefererMiddleware

class scrapy.contrib.spidermiddleware.referer.RefererMiddleware

根據生成 Request 的 Response 的 URL 來設置 Request Referer 字段。

RefererMiddleware settingsREFERER_ENABLED默認:True是否啟用 referer 中間件。

UrlLengthMiddleware

class scrapy.contrib.spidermiddleware.urllength.UrlLengthMiddleware過濾出 URL 長度比 URLLENGTH_LIMIT 的 request。UrlLengthMiddleware 可以通過下列設置進行配置(更多內容請參考設置文檔):URLLENGTH_LIMIT - 允許爬取 URL 最長的長度。

代碼

# -*- coding: utf-8 -*-from selenium import webdriverfrom scrapy.conf import settings# from scrapy.http.response import Responsefrom scrapy.http import HtmlResponseimport timefrom scrapy import signalsfrom scrapy.xlib.pydispatch import dispatcher from telnetlib import DOclass JavaScriptMiddleware(object): def __init__(self): if settings['LOGIN_TYPE'] == 'weibo': ''' # https://github.com/liuzheng712/weibo self.simulation = weibo_login(settings['USERNAME'], settings['PWD'], settings['COOKIE_FILE']) cookie_file = settings['COOKIE_FILE'] cookie_jar = cookielib.LWPCookieJar(cookie_file) cookie_jar.load(ignore_discard=True, ignore_expires=True) self.driver = webdriver.PhantomJS(executable_path=settings['JS_BIN']) for c in cookie_jar: self.driver.add_cookie({'name': c.name, 'value': c.value, 'path': '/', 'domain': c.domain}) ''' # simulate user login process self.driver = webdriver.PhantomJS(executable_path=settings['JS_BIN'])# 登錄# self.driver.get('http://login.sina.com.cn/')# uid = self.driver.find_element_by_id('username')# upw = self.driver.find_element_by_id('passWord')# loginBtn = self.driver.find_element_by_class_name('smb_btn')# time.sleep(1)# uid.send_keys(settings['USERNAME'])# upw.send_keys(settings['PWD'])# loginBtn.click()# time.sleep(1) elif settings['LOGIN_TYPE'] == 'other': print('add login code') pass else: self.driver = webdriver.PhantomJS(executable_path=settings['JS_BIN']) dispatcher.connect(self.spider_closed, signals.spider_closed) def process_request(self, request, spider): self.driver.get(request.url) print("頁面渲染中····開始自動下拉頁面") indexPage = 1000 while indexPage<self.driver.execute_script("return document.body.offsetHeight"): self.driver.execute_script("scroll(0,"+str(indexPage)+")") indexPage = indexPage +1000 print(indexPage) time.sleep(1) rendered_body = self.driver.page_source if r'charset="GBK"' in rendered_body or r'charset=gbk' in rendered_body: coding = 'gbk' else: coding = 'utf-8' return HtmlResponse(request.url, body=rendered_body, encoding='utf-8') def spider_closed(self, spider, reason): print ('close driver......') self.driver.close()
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美一级毛片特黄黄 | 国产亲子伦在线观看 | 国产精品久久久久久久不卡 | 国产盼盼私拍福利视频99 | 国产精品高潮视频 | 一级黄色性感片 | 蜜桃视频观看麻豆 | 日韩伦理电影免费观看 | 日本成人在线播放 | 在线天堂资源 | 在线成人影视 | 欧美成人一区二区视频 | 国产精品啪一品二区三区粉嫩 | 免费一级片网站 | 精品国产91久久久 | av最新在线 | 永久免费黄色片 | 中文字幕在线观看精品 | 成片免费观看视频大全 | 久久网站免费 | 国产做爰全免费的视频黑人 | 国产1区2区在线观看 | 国产免费高清在线视频 | 噜噜噜影院 | 欧产日产国产精品乱噜噜 | 91av亚洲 | 中文字幕在线免费播放 | 欧美精品a∨在线观看不卡 午夜精品影院 | 欧美第1页| chinese xvideos gay| 精品国产乱码久久久久久丨区2区 | 久久国产成人精品国产成人亚洲 | 大学生一级毛片在线视频 | 91精品观看91久久久久久国产 | 91色成人 | 羞羞视频免费视频欧美 | 91久久久久久久一区二区 | 久草在线最新 | 31freehdxxxx欧美 | 欧美成人se01短视频在线看 | 欧美三级日本三级少妇99 |