最近,我一直在尝试掌握scrapy。我觉得如果我对架构有更好的理解,我会走得更快。当前,我遇到的具体问题是:我想将scrapy提取的所有链接存储在数据库中,而不是响应,链接。这是为了进行完整性检查。
我最初的想法是process_links
在 a 上使用参数并在它指向的函数中rule
生成。items
然而,虽然callback
参数指向一个作为项目生成器的函数,但process_links
参数的工作方式更像是一个过滤器。在该callback
功能中,您产生项目,它们会被自动收集并放入管道中。在process_links
函数中,您返回链接列表。您不生成项目。
我可以在process_links
函数中建立一个数据库连接并直接写入数据库,但是当scrapy通过Twisted内置异步数据库事务处理时,这感觉不是正确的方法。
我可以尝试将项目从process_links
函数传递给callback
函数,但我不确定这两个函数之间的关系。一个用于生成项目,一个接收列表并返回列表。
在尝试思考这一点时,我不断遇到这样一个事实,即我不了解 scapy 中的控制循环。读取函数产生的项目的过程是什么callback
?向函数提供链接并从process_links
函数接收链接的过程是什么?requests
取回的那个responses
?
从我的角度来看,我在一个流派的蜘蛛中编写代码items
。会items
自动读取并通过管道移动。我可以在管道中创建代码,并且items
会自动传入和传出该代码。items
缺少的是我对这些如何通过管道移动的确切理解。
查看代码我可以看到蜘蛛的基本代码隐藏在角落里,所有好的蜘蛛都应该这样做,并以__init__.py
. 它包含starts_requests(
) 和make_requests_from_url()
函数,根据文档是起点。但这不是一个控制循环。它被别的东西调用了。
从相反的方向走,我可以看到,当我执行scrapy crawl...
我正在调用的命令时crawl.py
,它又调用self.crawler_process.start()
了crawler.py
. 这启动了一个 Twisted 反应堆。还有core/engine.py
另一个函数集合,看起来好像它们旨在控制蜘蛛的操作。
尽管浏览了代码,但我对整个过程并没有清晰的心理印象。我意识到框架的想法是它隐藏了很多复杂性,但我觉得通过更好地理解正在发生的事情,我可以更好地利用框架。
对不起,很长的帖子。如果有人可以回答我关于保存数据库链接的具体问题,那就太好了。如果您能够对架构进行简要概述,那将非常有帮助。