1

对不起,如果这个问题很愚蠢,但我还没有找到答案。

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

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

如果我的理解是正确的,需要发生的是,scrapy 需要稍等片刻才能返回结果。

有人可以在这里帮助我吗?

谢谢 !

4

1 回答 1

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

设置.py:

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

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

middleware = set([])

包括一个中间件:

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

您可以在请求回调(在蜘蛛中)中实现这一点,但随后 http 请求将发生两次。这不是一个完整的证明解决方案,但它适用于在 .ready() 上加载的内容。如果您花一些时间阅读 selenium,您可以等待特定事件触发,然后再保存页面源。

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

干杯!

于 2014-06-27T20:34:30.327 回答