2013-07-21 134 views
1

对不起,如果问题很蠢,但我还找不到答案。scrapy中的响应对象不完整

我想编写脚本提取使用“scrapy壳”命令从网站的数据:

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

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

有人可以帮我吗?

谢谢!

+0

Scrapy将给你可以在浏览器的“查看源代码”命令中看到的内容,而不一定是你在浏览器窗口中看到的内容。 Scrapy不理解Javascript,所以没有AJAX调用,没有jQuery魔法......所以没有动态数据。您可以从浏览器开发人员工具中查看网络活动,并尝试使用新的Scrapy Request()来模仿Javascript/AJAX调用以获取aditional内容,但使用Scrapy模拟真实浏览器可能很困难 –

+0

您也可以查看https ://github.com/scrapinghub/scrapyjs –

回答

0

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

干杯!