亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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()
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久久久久| 日av在线播放中文不卡| 91亚洲精品一区二区| 成人精品久久久| 57pao成人永久免费视频| 国产亚洲美女精品久久久| 亚洲视频自拍偷拍| 国产美女高潮久久白浆| 欧美影院久久久| 性欧美视频videos6一9| 欧美激情欧美激情在线五月| 欧美精品在线网站| 97精品一区二区视频在线观看| 欧美电影在线观看网站| 国产精品久久久久免费a∨| 精品久久中文字幕| 3344国产精品免费看| 欧美另类99xxxxx| 日韩精品中文字幕有码专区| 国产精品网址在线| 欧美日韩国产色| 奇门遁甲1982国语版免费观看高清| 91av在线视频观看| 亚洲精品欧美日韩| 亚洲国产精品va在线| 国产一区二区成人| 国产精品色悠悠| 伊人久久免费视频| 97精品国产97久久久久久| 黄色成人在线免费| 97久久超碰福利国产精品…| 911国产网站尤物在线观看| 91极品视频在线| 97久久国产精品| 成人女保姆的销魂服务| 性欧美亚洲xxxx乳在线观看| 九九热这里只有精品免费看| 国产精品露脸av在线| 亚洲激情在线观看| 亚洲欧美成人一区二区在线电影| 亚洲第五色综合网| 九九热精品视频在线播放| 中文字幕一区电影| 奇米影视亚洲狠狠色| 国产精品久久久一区| 国产精品普通话| 国产精品久久久久一区二区| 国产一区二区三区18| 一区二区三区国产在线观看| 日韩av在线一区| 亚洲在线www| 欧美亚洲视频在线观看| 成人国产亚洲精品a区天堂华泰| 亚洲人成电影网| 国产女人精品视频| 欧美乱大交做爰xxxⅹ性3| 成人免费看吃奶视频网站| 中文字幕最新精品| 亚洲欧美成人精品| 91av在线影院| 亚洲片在线观看| 91久久国产婷婷一区二区| 综合网日日天干夜夜久久| 色偷偷av一区二区三区乱| 中文字幕免费国产精品| 日韩精品在线观| 中文字幕自拍vr一区二区三区| 国产亚洲欧洲高清| 不卡在线观看电视剧完整版| 日本久久久久亚洲中字幕| 欧美午夜宅男影院在线观看| 亚洲福利视频在线| 4k岛国日韩精品**专区| 国产成人av网| 久久99国产综合精品女同| 日本高清视频精品| 一本久久综合亚洲鲁鲁| 亚洲欧美激情在线视频| 久久亚洲成人精品| 国产成人精品免费视频| 国产亚洲精品美女久久久久| 国产亚洲精品久久久久久777| 欧美高清在线播放| 亚洲欧洲在线免费| 国产精品99久久久久久www| 美女扒开尿口让男人操亚洲视频网站| 欧美性生交xxxxxdddd| 97久久精品人人澡人人爽缅北| 91香蕉嫩草影院入口| 国产欧美日韩视频| 欧美成人精品h版在线观看| 欧美性猛交xxxx黑人| 亚洲综合日韩在线| 成人福利视频在线观看| 欧美福利在线观看| 久久天天躁狠狠躁夜夜av| 国产精品观看在线亚洲人成网| 高清日韩电视剧大全免费播放在线观看| 亚洲人精品午夜在线观看| 日韩欧美999| 中文在线资源观看视频网站免费不卡| 日韩中文字幕欧美| 欧美黄色片免费观看| 久久精品美女视频网站| 国产成人高清激情视频在线观看| 97热精品视频官网| 国产精品99久久99久久久二8| 亚洲天堂成人在线视频| 欧美福利视频网站| 亚洲iv一区二区三区| 日韩av在线直播| 欧美精品生活片| 欧美三级欧美成人高清www| 国内免费久久久久久久久久久| 久久人人看视频| 久久久久久亚洲精品| 国产精品人成电影| 日韩有码视频在线| 欧美丰满片xxx777| 欧美激情亚洲激情| 精品日韩视频在线观看| 亚洲另类激情图| 亚洲国产福利在线| 国产欧美欧洲在线观看| 伊人久久精品视频| 久久香蕉国产线看观看av| 4438全国亚洲精品在线观看视频| 粗暴蹂躏中文一区二区三区| 欧美亚洲伦理www| 亚洲在线视频福利| 国产不卡av在线| 一本一本久久a久久精品牛牛影视| 欧美日韩国产一中文字不卡| 一本色道久久88综合日韩精品| 国产精品黄色影片导航在线观看| 国产精品久久久久久久7电影| 欧美电影在线免费观看网站| 欧美午夜视频在线观看| 国产精品久久久久久久7电影| 久久这里只有精品视频首页| 亚洲视频在线观看网站| 亚洲少妇中文在线| 日韩欧美亚洲范冰冰与中字| 91久久久久久久久久久| 91av视频在线免费观看| 国a精品视频大全| 亚洲视频在线观看网站| 欧美高清自拍一区| 国产v综合ⅴ日韩v欧美大片| 亚洲 日韩 国产第一| 国产精品电影一区| 91精品国产综合久久香蕉922| 亚洲一区二区自拍| 91久久久久久国产精品| 91欧美精品午夜性色福利在线| 久久久精品视频在线观看| 亚洲精品丝袜日韩| 国产成人97精品免费看片| 国产精品高潮呻吟久久av黑人| 国产精品视频男人的天堂| 亚洲欧美激情一区| 欧美日韩国产中字| 午夜精品蜜臀一区二区三区免费| 538国产精品一区二区免费视频|