Python 了解scrapy框架体系结构

Python 了解scrapy框架体系结构,python,scrapy,scrapy-spider,scrapy-pipeline,Python,Scrapy,Scrapy Spider,Scrapy Pipeline,最近,我一直在努力和scrapy打交道。我觉得如果我对架构有更好的理解,我会走得更快。当前的具体问题是:我想将scrapy提取的所有链接存储在数据库中,而不是响应和链接。这是为了检查是否正常 我最初的想法是在规则上使用过程链接参数,并在它所指向的函数中生成项。然而,回调参数指向一个作为项生成器的函数,而进程链接参数更像一个过滤器。在回调函数中,您可以生成项目,这些项目将自动收集并放入管道中。在process\u links函数中,返回链接列表。您不生成项目 我可以在process\u links

最近,我一直在努力和scrapy打交道。我觉得如果我对架构有更好的理解,我会走得更快。当前的具体问题是:我想将scrapy提取的所有链接存储在数据库中,而不是响应和链接。这是为了检查是否正常

我最初的想法是在
规则
上使用
过程链接
参数,并在它所指向的函数中生成
。然而,
回调
参数指向一个作为项生成器的函数,而
进程链接
参数更像一个过滤器。在
回调
函数中,您可以生成项目,这些项目将自动收集并放入管道中。在
process\u links
函数中,返回链接列表。您不生成项目

我可以在
process\u links
函数中建立一个数据库连接,然后直接写入datatabase,但当scrapy通过Twisted进行内置异步数据库事务处理时,这并不是正确的方法

我可以尝试将项目从
进程链接
函数传递到
回调
函数,但我不确定这两个函数之间的关系。一个用于生成项目,一个接收列表并返回列表

在试图想清楚这一点时,我不断遇到这样一个事实:我不理解scapy中的控制循环。读取
回调
函数生成的项的过程是什么?向
process\u links
功能提供链接并从中接收链接的流程是什么?接受
请求
并返回
响应

在我看来,我在一个spider中编写代码,它生成
将通过管道自动读取和移动。我可以在管道中创建代码,
项将自动传入和移出该代码。缺少的是我对这些
项目如何在管道中移动的确切理解

通过查看代码,我可以看到爬行器的基本代码隐藏在角落里,所有优秀的爬行器都应该这样做,并以
\uuuu init\uuuuuuuuuy.py
的名义运行。它包含
启动请求(
)和
发出请求的函数,根据文档,这些函数是起点。但这不是一个控制回路。它被别的东西调用了

从相反的方向看,我可以看到,当我执行命令
scrapy crawl…
时,我正在调用
crawl.py
,它依次调用
self.crawler\u process.start()
in
crawler.py
。它启动了一个扭曲的反应堆。还有另一个
core/engine.py
,它是另一个函数集合,看起来好像是为了控制爬行器的操作而设计的

尽管我仔细阅读了代码,但我对整个过程并没有清晰的印象。我意识到框架的概念是它隐藏了很多复杂性,但我觉得如果能更好地理解正在发生的事情,我就能更好地利用框架


抱歉发了这么长的邮件。如果有人能给我一个关于保存数据库链接的具体问题的答案,那就太好了。如果您能够简要介绍一下该体系结构,那将非常有帮助。

简而言之,Scrapy就是这样工作的:

  • 你有蜘蛛负责抓取网站。您可以为单独的站点/任务使用单独的spider
  • 您可以向爬行器提供一个或多个起始URL。您可以将它们作为列表提供,也可以使用
    start\u请求
    方法
  • 当我们使用Scrapy运行爬行器时,它获取这些URL并获取HTML响应。响应被传递给spider类上的回调。使用
    start\u requests
    方法时,可以显式定义回调。如果没有,Scrapy将使用
    parse
    方法作为回调
  • 您可以从HTML中提取所需的任何数据。在
    parse
    回调中得到的
    response
    对象允许您使用css选择器或xpath提取数据
  • 如果您从响应中找到数据,您可以构建
    s并
    生成它们。如果需要转到另一页,可以生成
    scrapy.Request
  • 如果您生成一个dictionary或
    Item
    对象,Scrapy将通过注册的管道发送它们。如果您产生
    scrapy.Request
    ,请求将被进一步解析,响应将反馈给回调。同样,您可以定义单独的回调或使用默认回调
  • 在管道中,数据(字典或
    )通过管道处理器。在管道中,您可以将它们存储在数据库或任何您想做的事情中
简言之:

  • parse
    方法或spider中的任何方法中,我们将提取并生成数据,以便通过管道发送数据
  • 在管道中,您执行实际的处理

    下面是一个简单的spider和管道示例:


不久前我开始使用Scrapy,我自己也有一些疑问(也考虑到我从Python开始时的总体情况),但现在它对我有效,所以不要气馁——它是一个很好的框架

首先,在这个阶段,我不会太担心框架背后的细节,而是自己开始编写一些基本的spider

一些真正关键的概念是:

  • Start_URL–它们定义了一个或多个初始URL,您可以在其中进一步查找文本或其他要爬网的链接。假设你想要