python - 了解scrapy框架架构

标签 python scrapy scrapy-pipeline

最近,我一直在努力掌握 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 提取数据。
  • 如果从响应中找到数据,则可以构造 Itemyield 它们。如果需要跳转到其他页面,可以yield scrapy.Request
  • 如果你生成一个字典或Item对象,Scrapy 将通过注册的管道发送它们。如果你 yield scrapy.Request,请求将被进一步解析,响应将反馈给回调。同样,您可以定义一个单独的回调或使用默认回调。
  • 在管道中,您的数据(字典或Item)通过管道处理器。在管道中,您可以将它们存储在数据库中或任何您想做的事情。

简而言之:

  • parse 方法或蜘蛛内部的任何方法中,我们将提取并生成我们的数据,以便它们通过管道发送。
  • 在管道中,您进行实际处理。

    这是一个简单的蜘蛛和管道示例:https://gist.github.com/masnun/e85b38a00a74737bb3eb

关于python - 了解scrapy框架架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34311702/

相关文章:

python - mac安装scrapy成功,运行报错

python - scrapy - 如何将分层项目插入数据库?

Scrapy,在管道中发出 http 请求

python - Scrapy文件下载如何使用自定义文件名

python - 每个进程运行多个蜘蛛 - 不保存输出数据

python - 如何在查询集中使用 Django __time 查找

python - 如何在模块而不是文件或目录上运行 pytest?

python - 如何使用scrapy解析xml

python - 创建随机可训练索引,以从 tensorflow 中的一个 2_D 张量构建两个 2_D 张量

python - 仅当前面至少有 x 位数字时才获取数字选择