很抱歉,如果问题很愚蠢,但我还没找到答案。
我正在尝试使用“scrapy shell”命令准备脚本以从网站中提取数据:
使用网络浏览器输入网址(例如“http://www.testsite.com/data_to_extract”),我会获取要提取的数据。该页面包含静态数据+动态数据。
使用命令“scrapy shell http://www.testsite.com/data_to_extract”然后发出命令(“view(response)”),我在Web浏览器中看到页面的静态数据,但不是动态数据。
我怀疑Web服务器首先提供静态数据,然后填充页面中的动态数据。我想这是通过网页上的javascript管理的。
如果我的理解是正确的,那么需要做的是scrapy需要等一会儿才能返回结果。
有人可以帮助我吗?
谢谢!
答案 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
干杯!