diff --git a/middlewares.py b/middlewares.py new file mode 100644 index 0000000..00e1771 --- /dev/null +++ b/middlewares.py @@ -0,0 +1,193 @@ +# Define here the models for your spider middleware +# +# See documentation in: +# https://docs.scrapy.org/en/latest/topics/spider-middleware.html + +from scrapy import signals +import random +# useful for handling different item types with a single interface + +from spider.spiders.Redis_Con import Redis_Con + + + +class SpiderSpiderMiddleware: + # 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. + cookie='' + @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, 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 Request 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) + + +class SpiderDownloaderMiddleware: + # Not all methods need to be defined. If a method is not defined, + # scrapy acts as if the downloader middleware does not modify the + # passed objects. + #f = Redis_Con() + # cookie = f.getcookie() + + @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_request(self, request, spider): + # Called for each request that goes through the downloader + # middleware. + + # Must either: + # - return None: continue processing this request + # - or return a Response object + # - or return a Request object + # - or raise IgnoreRequest: process_exception() methods of + # installed downloader middleware will be called + self.f=Redis_Con() + print('开始 随机UA and 动态cookie') + ua = random.choice(spider.settings.get('USER_AGENTS_LIST')) + request.headers['User-Agent'] = ua + request.headers['Referer'] = 'https://accounts.douban.com' + request.headers['Host'] = 'movie.douban.com' + self.cookie = self.f.getcookie() + print("###借出cookie###\n"+self.cookie) + now_c={} + now_c['dbcl2']=self.cookie + request.cookies = now_c + #代理ip 由于使用免费代理延迟比较高,可能导致爬虫降速 + ''' + ip = self.f.getip() + print('当前获取的代理ip'+str(ip)) + if ip != None: + request.meta['proxy'] = ip +''' + + return None + + + def process_response(self, request, response, spider): + # Called with the response returned from the downloader. + + # Must either; + # - return a Response object + # - return a Request object + # - or raise IgnoreRequest + print('###归还cookie###') + print(self.cookie) + self.f.reuturncookie(self.cookie) + + + return response + + def process_exception(self, request, exception, spider): + # Called when a download handler or a process_request() + # (from other downloader middleware) raises an exception. + + # Must either: + # - return None: continue processing this exception + # - return a Response object: stops process_exception() chain + # - return a Request object: stops process_exception() chain + # 如果遇到网络异常,也要归还cookie不然cookie丢失 + print('###出错!!!归还cookie###') + print(self.cookie) + self.f.reuturncookie(self.cookie) + return None + + def spider_opened(self, spider): + spider.logger.info('Spider opened: %s' % spider.name) + + +class IPDownloaderMiddleware: + # Not all methods need to be defined. If a method is not defined, + # scrapy acts as if the downloader middleware does not modify the + # passed objects. + #f = Redis_Con() + # cookie = f.getcookie() + + @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_request(self, request, spider): + # Called for each request that goes through the downloader + # middleware. + + # Must either: + # - return None: continue processing this request + # - or return a Response object + # - or return a Request object + # - or raise IgnoreRequest: process_exception() methods of + # installed downloader middleware will be called + self.f=Redis_Con() + print('获取免费代理IP中') + ua = random.choice(spider.settings.get('USER_AGENTS_LIST')) + request.headers['User-Agent'] = ua + request.headers['Referer'] = 'www.baidu.com' + request.headers['Host'] = 'www.kuaidaili.com' + + return None + + + def process_response(self, request, response, spider): + # Called with the response returned from the downloader. + + # Must either; + # - return a Response object + # - return a Request object + # - or raise IgnoreRequest + return response + + def process_exception(self, request, exception, spider): + # Called when a download handler or a process_request() + # (from other downloader middleware) raises an exception. + + # Must either: + # - return None: continue processing this exception + # - return a Response object: stops process_exception() chain + # - return a Request object: stops process_exception() chain + return None + + def spider_opened(self, spider): + spider.logger.info('Spider opened: %s' % spider.name)