这是一个在下载处理程序中间件中使用 selenium 和 phantomjs 无头 webdriver 的工作示例。
class JsDownload(object):
@check_spider_middleware
def 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.encode('utf-8'))
我想能够告诉不同的蜘蛛使用哪个中间件,所以我实现了这个包装器:
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 None
return wrapper
设置.py:
DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500}
为了使包装器工作,所有蜘蛛必须至少具有:
middleware = set([])
包括一个中间件:
middleware = set([MyProj.middleware.ModuleName.ClassName])
您可以在请求回调(在蜘蛛中)中实现这一点,但随后 http 请求将发生两次。这不是一个完整的证明解决方案,但它适用于在 .ready() 上加载的内容。如果您花一些时间阅读 selenium,您可以等待特定事件触发,然后再保存页面源。
另一个例子:https ://github.com/scrapinghub/scrapyjs
干杯!