下面是一个在下载处理程序中间件中使用selenium和phantomjs headless webdriver的工作示例。
class JsDownload(object):@check_spider_middlewaredef process_request(self, request, spider): driver = webdriver.PhantomJS(executable_path='D:phantomjs.exe') driver.get(request.url) return HtmlResponse(request.url, encoding='utf-8', body=driver.page_source.enpre('utf-8'))我希望能够告诉不同的
Spider使用哪个中间件,因此我实现了这个包装器:
def check_spider_middleware(method):@functools.wraps(method)def wrapper(self, request, spider): msg = '%%s %s middleware step' % (self.__class__.__name__,) if self.__class__ in spider.middleware: spider.log(msg % 'executing', level=log.DEBUG) return method(self, request, spider) else: spider.log(msg % 'skipping', level=log.DEBUG) return Nonereturn wrappersettings.py:DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500}为了使包装工作,所有spider必须至少具有:
middleware = set([])
包括中间件:
middleware = set([MyProj.middleware.ModuleName.ClassName])
以这种方式而不是在spider网中实现它的主要优点是,你最终只会发出一个请求。例如,在reclosedev的第二个链接的解决方案中:下载处理程序处理请求,然后将响应传递给spider。然后,spider程序会在其parse_page函数中提出一个全新的请求-这是对相同内容的两个请求。



