这是一个在下载处理程序中间件中使用selenium和phantomjs headless 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
settings.py:
DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500}
用于包装工作都必须蜘蛛至少有:
middleware = set([])
包括中间件:
middleware = set([MyProj.middleware.ModuleName.ClassName])
你可以在请求回调(在蜘蛛)已经实现了这一点,但随后的HTTP请求将发生两次。这不是一个完整的证明解决方案,但它适用于加载.ready()的东西。如果您花时间阅读硒,则可以等待特定事件触发后再保存页面源代码。
又如:https://github.com/scrapinghub/scrapyjs
干杯!
Scrapy将给你可以在浏览器的“查看源代码”命令中看到的内容,而不一定是你在浏览器窗口中看到的内容。 Scrapy不理解Javascript,所以没有AJAX调用,没有jQuery魔法......所以没有动态数据。您可以从浏览器开发人员工具中查看网络活动,并尝试使用新的Scrapy Request()来模仿Javascript/AJAX调用以获取aditional内容,但使用Scrapy模拟真实浏览器可能很困难 –
您也可以查看https ://github.com/scrapinghub/scrapyjs –