middlewares.pyhtml
# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in: # http://doc.scrapy.org/en/latest/topics/spider-middleware.html from scrapy import signals class TaobaospiderSpiderMiddleware(object): # Not all methods need to be defined. If a method is not defined, # scrapy acts as if the spider middleware does not modify the # passed objects. @classmethod def from_crawler(cls, crawler): # This method is used by Scrapy to create your spiders. s = cls() crawler.signals.connect(s.spider_opened, signal=signals.spider_opened) return s def process_spider_input(self, response, spider): # Called for each response that goes through the spider # middleware and into the spider. # Should return None or raise an exception. return None def process_spider_output(self, response, result, spider): # Called with the results returned from the Spider, after # it has processed the response. # Must return an iterable of Request, dict or Item objects. for i in result: yield i def process_spider_exception(self, response, exception, spider): # Called when a spider or process_spider_input() method # (from other spider middleware) raises an exception. # Should return either None or an iterable of Response, dict # or Item objects. pass def process_start_requests(self, start_requests, spider): # Called with the start requests of the spider, and works # similarly to the process_spider_output() method, except # that it doesn’t have a response associated. # Must return only requests (not items). for r in start_requests: yield r def spider_opened(self, spider): spider.logger.info('Spider opened: %s' % spider.name) # 引入IgnoreRequest異常類 from scrapy.exceptions import IgnoreRequest # 引入response類 from scrapy.http import Response from scrapy.http.response.html import HtmlResponse from scrapy.http.response.text import TextResponse # 引入selenium from selenium import webdriver from selenium.webdriver.chrome.options import Options import codecs import time # 自定義中間件 class CustomMiddleware(object): def process_request(self,request, spider): ''' 1.返回None,繼續交給其餘的中間件進行處理 2.返回request對象,會將該請求從新調度發送,直到返回結果不是request爲止 3.觸發異常,IgnoreRequest,默認會去執行process_exception函數 4.返回一個response對象,以後的全部中間件中process_reqeust將不會再調用,會去執行中間的process_response函數 ''' url = request.url opt = Options() opt.add_argument('--headless') # 建立谷歌瀏覽器對象 driver = webdriver.Chrome(options=opt) driver.get(url) # 讓瀏覽器滾動到底部 for x in range(1,11,2): j = x / 10 js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight*%f'%j driver.execute_script(js) # 每次滾動等待0.5s time.sleep(0.5) # driver.save_screenshot('123.png') # 獲取網頁源代碼 page_source = driver.page_source # 退出 driver.quit() # 根據網頁源代碼,建立htmlresponse對象 # 由於返回的是文本內容,指定字符編碼格式 response = HtmlResponse(url=url,body=page_source,encoding='utf-8',request=request) return response def process_response(self,request,response,spider): ''' 返回結果(必須返回): 1.返回response,會將response交給下一個middleware進行處理 2.返回request,中間件中止執行,會從新對這個請求進行調度,執行process_request處理函數 3.觸發異常 ''' print('執行了process_response') return response def process_exception(self,request, exception, spider): # 觸發異常以後,須要對此次的請求作出相應操做 print('執行了process_exception') # class NextMiddleware(object): def process_request(self,request,spider): print('////////////NextMiddleware--=---request') def process_response(self,request,response,spider): print('///////////NextMiddleware----->response') return response