采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,从这节课看scrapy-redis的入口是name:start_urls,那slave端要如何获取master端存入name:requests的请求呢,从master那yield的话应该也没办法回调slave上的处理函数吧,是有提供方法还是需要我自己重写相关的源码
如果是slave 那么重写这个方法就行了, 记住 master不要这么写, 我把这个代码给你贴一下:
def
next_requests(
self
):
found
=
0
# TODO: Use redis pipeline execution.
while
found <
.redis_batch_size:
req
.crawler.engine.slot.scheduler.queue.pop(
)
if
not
req:
# Queue empty.
break
yield
+
1
else
:
.logger.debug(
"Request not made from data: %r"
, req.url)
found:
"Read %s requests from '%s'"
, found,
.redis_key)
其余部分master和slave一样就可以了是吗 然后我有点没搞明白,如果直接使用scrapy-redis什么都不动的话那这个分布式究竟是如何体现的,是不是就是多台设备连接同一个Redis数据库,各台设备做完全一样的事情都从这个库里存/拿任务,不在乎这个任务究竟来自哪?那如果是这样的话入库又怎么说,多台设备建立多个连接至数据库分别入库?还是说由某一设备集中入库?
是的 ,多台服务器读取同一个redis不分从哪里来的,但是你这里提到了一个非常重要的问题就是数据库怎么办? 其实如果要讲解到这个问题那么整个框架可能会变得更加复杂,实际上scrapy-redis还提供了一个功能就是将item放入到redis中,这样你可以自己写存储服务 去入库,想怎么处理就自己写就行了,但是这样就把pipeline的功能单独拎出来了会增加系统的复杂性 所以课程没有讲解这个,你如果感兴趣可以了解一下scrapy-redis的这个功能配置
老师我还有一个问题,关于scrapy-splash的 我确定splash服务已经启动成功了,从网页进行验证确实可以进行JS渲染,setting也按照官方文档配置过了,但是在爬虫中yield splashrequest得到的response还是没渲染过的,这是部分代码: lua_script = ''' function main(splash, args) splash:go(args.url) splash:wait(5) return splash:html() end''' # yield SplashRequest(url="https://www.cnblogs.com/dongxishaonian/p/12653200.html", endpoint="execute", # callback=self.parse_detail, args={"lua_source": lua_script, 'images': 0}) yield SplashRequest(url="https://www.cnblogs.com/dongxishaonian/p/12653200.html", endpoint='render.html', callback=self.parse_detail, args={'wait': 10, }) 两种都不行,那个lua脚本在网页中使用是没有问题的,这什么原因,爬的是博客园的博客页面,想要获取页面上的分类和标签,这两个都是异步加载的 这是setting: DOWNLOADER_MIDDLEWARES = { # 'master_spider.middlewares.MasterSpiderDownloaderMiddleware': 543, 'scrapy_splash.SplashCookiesMiddleware': 723, 'scrapy_splash.SplashMiddleware': 725, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810, }
登录后可查看更多问答,登录/注册
带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎
4.9k 30
2.6k 18
1.2k 18
1.5k 15
3.0k 15
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号