scrapy中的响应对象未完成

时间:2013-07-21 15:09:53

标签: scrapy

很抱歉,如果问题很愚蠢,但我还没找到答案。

我正在尝试使用“scrapy shell”命令准备脚本以从网站中提取数据:

我怀疑Web服务器首先提供静态数据,然后填充页面中的动态数据。我想这是通过网页上的javascript管理的。

如果我的理解是正确的,那么需要做的是scrapy需要等一会儿才能返回结果。

有人可以帮助我吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

以下是在下载处理程序中间件中使用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

settings.py:

DOWNLOADER_MIDDLEWARES = {'MyProj.middleware.MiddleWareModule.MiddleWareClass': 500}

要使包装器工作,所有蜘蛛必须至少具有:

middleware = set([])

包含中间件:

middleware = set([MyProj.middleware.ModuleName.ClassName])

您可以在请求回调中实现此功能(在spider中),但http请求将会发生两次。这不是一个完整的证明解决方案,但它适用于加载.ready()的东西。如果您花一些时间阅读硒,您可以在保存页面来源之前等待特定事件触发。

另一个例子:https://github.com/scrapinghub/scrapyjs

干杯!