为网站抓取工具实施的 TPL 数据流

Posted

技术标签:

【中文标题】为网站抓取工具实施的 TPL 数据流【英文标题】:TPL Dataflow to be implemented for a Website scraper 【发布时间】:2015-11-11 11:22:26 【问题描述】:

好吧,我知道我的问题需要更多的指导而不是技术问题,但我希望 SO 成员不会介意 TPL Dataflow 的新手提出一些非常基本的问题。

我有一个简单的 Windows 窗体应用程序,它负责从我系统上的 Excel 文件中提取数据并将它们保存在数据库中。这个过程太长了,我想让它异步和并行。以下是我的方案的简介。

调用函数在开始时打开与数据库的连接

调用函数以使用操作时间更新数据库

假设应用程序需要处理 100 个递增顺序的 Excel 文件。为此,我使用了每次调用都会递增的 FileNumber。

对UpdateUI的调用函数(传递PageNumber)(示例。文件1处理)

调用函数读取 Excel 文件(PageNumber 被传递)

调用函数处理Excel文件数据(传Excel数据,传PageNumber)

调用函数将值保存在数据库中(传递Excel数据并传递PageNumber)

UpdateUI 的调用函数(PageNumber 已传递)(示例。文件 1 已处理)

现在我所取得的成就是我能够使用任务使这个过程异步。我已将 async 和 await 用于所有长时间运行的操作,并将我的函数转换为 Tasks。

现在我想让一些任务并行运行。并非每个任务都是并行的,例如 OpenDatabase 连接将只是异步的。但我想创建一个任务或函数,它将为我的应用程序中的每个任务/函数使用数据流块,从更新 UI 到 ReadingExcel 文件并将它们保存到数据库中。

我开始使用 ActionBlock 来尝试这个,但是有很多我一无所知的不同的块。请指导我在这种情况下将使用哪个块。如果有人为这种情况提供伪代码,那将是非常棒的。我将有一些事情开始。

【问题讨论】:

【参考方案1】:

在学习了 TPL 数据流之后,我设法对它及其块有一个基本的了解。我在下面提到我的理解,以防其他人需要抢先一步。

TPL Dataflow 基于 TPL(任务并行库)构建,其主要目的是实现生产者/接收者(参与者/代理)设计。

TPL 数据流由也称为数据流块的块组成。这些数据流块的目的是缓冲、处理和传播数据。每个区块可以是接收者或生产者,也可以两者兼而有之。

每个块都实现 IDataflowBlock,无论其用途如何(接收者、生产者)。该接口的目的是将一个类作为数据流块。第二个目的是通过成功完成或错误使任何块关闭,最后此接口使块能够返回 System.Threading.Task 代表异步完成的块。

此外,还有其他不同的接口,它们根据其用途使用,即接收器、生产者或传播者。 Reciver 块实现 ISourceBlock,Producer 块实现 ITargetBlock 和传播者 IPropagatorBlock。

块也可以分为其他类别,例如,

>> Execution Blocks
    >> ActionBlock
    >> TransformBlock
    >> TransformManyBlock

>> Buffering Blocks
    >> BufferBlocl
    >> BrodcastBlock
    >> WriteOnceBlock

>> Joining Blocks
    >> BatchBlock
    >> JoinBlock
    >> BatchedJoinBlock

除了这些内置块之外,还可以编写自定义块,但在大多数情况下,这些块可以达到目的。此外,我还可以包括每个块的目的,但它会成为一篇文章。这是我的基本理解,我仍在学习和探索 TPL 数据流。

如果有人想了解专门针对数据 scraper 的 TPL 数据流,那么这里是示例数据流框图,以帮助更好地理解该过程。

来源:https://petermeinl.wordpress.com/2012/10/13/a-webcrawler-demonstrating-the-beauty-of-tpl-dataflow/

【讨论】:

以上是关于为网站抓取工具实施的 TPL 数据流的主要内容,如果未能解决你的问题,请参考以下文章

通过 Python 中的网络抓取工具登录网站

怎样抓取网站上的Cookie

从现场比分网站抓取网页

用一行Python代码在几秒钟内抓取任何网站

用一行Python代码在几秒钟内抓取任何网站

怎么用VBA或网络爬虫程序抓取网站数据