最近,我一直在努力掌握 scrapy。我觉得如果我对架构有更好的理解,我会走得更快。当前的具体问题是:我想将 scrapy 提取的所有链接存储在数据库中,而不是响应和链接。这是为了完整性检查。
我最初的想法是使用 process_links
rule
上的参数并生成 items
在它指向的函数中。然而,callback
参数指向一个函数,它是一个项目生成器,process_links
参数更像是一个过滤器。在callback
函数你产生项目,它们被自动收集并放入管道中。在process_links
函数返回链接列表。您不生成项目。
我可以在 process_links
中建立数据库连接函数并直接写入数据库,但是当 scrapy 具有通过 Twisted 的内置异步数据库事务处理时,这并不是正确的方法。
我可以尝试传递 process_links
中的项目功能到callback
功能,但我不确定这两个功能之间的关系。一个用来生成item,一个接收一个list,还得返回一个list。
在试图彻底思考这个问题时,我不断遇到这样一个事实,即我不理解 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 react 器。还有core/engine.py
这是另一个函数集合,看起来好像是为了控制蜘蛛的操作而设计的。
尽管查看了代码,但我对整个过程并没有清晰的印象。我意识到框架的想法是它隐藏了很多复杂性,但我觉得通过更好地了解正在发生的事情,我可以更好地利用框架。
抱歉发了这么长的帖子。如果有人能给我关于保存数据库链接的具体问题的答案,那就太好了。如果您能够简要概述架构,那将非常有帮助。
最佳答案
简而言之,Scrapy 是这样工作的:
- 您有负责抓取网站的蜘蛛。您可以为单独的站点/任务使用单独的蜘蛛。
- 您向蜘蛛程序提供一个或多个起始网址。您可以将它们作为列表提供或使用
start_requests
方法 - 当我们使用 Scrapy 运行蜘蛛时,它会获取这些 URL 并获取 HTML 响应。响应被传递给蜘蛛类的回调。您可以在使用
start_requests
方法时显式定义回调。如果你不这样做,Scrapy 将使用parse
方法作为回调。 - 您可以从 HTML 中提取您需要的任何数据。您在
parse
回调中获得的response
对象允许您使用 css 选择器或 xpath 提取数据。 - 如果从响应中找到数据,则可以构造
Item
并yield
它们。如果需要跳转到其他页面,可以yieldscrapy.Request
。 - 如果你生成一个字典或
Item
对象,Scrapy 将通过注册的管道发送它们。如果你 yieldscrapy.Request
,请求将被进一步解析,响应将反馈给回调。同样,您可以定义一个单独的回调或使用默认回调。 - 在管道中,您的数据(字典或
Item
)通过管道处理器。在管道中,您可以将它们存储在数据库中或任何您想做的事情。
简而言之:
- 在
parse
方法或蜘蛛内部的任何方法中,我们将提取并生成我们的数据,以便它们通过管道发送。 在管道中,您进行实际处理。
这是一个简单的蜘蛛和管道示例:https://gist.github.com/masnun/e85b38a00a74737bb3eb
关于python - 了解scrapy框架架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34311702/