编程语言
首页 > 编程语言> > 使用Power Automate Cloud抓取网页

使用Power Automate Cloud抓取网页

作者:互联网

Web抓取一直是Power Automate Desktop功能,但您知道您也可以使用Power Automate Cloud吗?

让我举出几个重要的注意事项:

云方法并不适用于所有网站,它仅适用于静态或php生成的html文件。客户端上渲染的任何内容都不起作用,因此您需要无头浏览器或完整浏览器(这就是Power Automate Desktop发挥作用的地方)。此外,如果内容非常动态(即不断更改dom id's/names),也可能非常困难。

另一件需要注意的关于整个网络抓取的法律限制,例如不允许抓取个人信息。此外,由于网站不想被抓取,他们玩一些技巧网站来阻止它(一些甚至嵌入了隐藏的个人数据,使抓取成为非法)。

顺便说一句,让我告诉你怎么做。

作为一个示例网站,我将使用https://www.gov.uk/vehicle-tax-rate-tables,我想提取排放表来更新成本预测,链接以浏览其他页面,上次更新时,或任何其他信息。

排放表

为了获取网页,我们将使用HTTP连接器,最低配置(只有方法和URL)

http 连接器

您应该在正文返回中看到html内容。

http 获取网页

如果您收到错误,或JavaScript加载返回,则此方法将不起作用,因为它需要浏览器运行脚本来呈现页面,以下示例是谷歌搜索:

http 谷歌返回


现在我们可以使用3种方法从页面中提取数据:

  1. 子字符串表达式(仅适用于非常简单的页面/提取)
  2. 脚本(更复杂,但必须具有重复的结构)
  3. GPT(最强大但有挑战)

1.子字符串表达式

如果可以的话,这是要采用的方法,它的工作原理是一致的,并且最容易创建。虽然它有一个工作的关键要求,但您正在抓取的数据必须具有一致的dom元素(例如<div id="data">)。

因此,在示例中,如果我们想要排放表,我们很幸运,因为页面上只有一个表,所以我们可以提取dom元素<table>


我们在最后添加另一个</table>,因为我们用这个作为数据结束,所以被切断了

表达

substring(
    body('HTTP')
, 
    indexOf(
        body('HTTP')
    ,
        '<table>'
    )
,
    sub(indexOf(
            body('HTTP')
        ,
            '</table>'
        )
    ,
        indexOf(
            body('HTTP')
        ,
            '<table>'
        )
    )
)

子字符串需要,文本,开始字符数,字符数),因此我们传递http正文,我们使用indexOf查找<table>的字符数。然后,为了计算返回的长度,我们使用另一个indexOf来查找</table>。虽然这返回文本开头的字符数,而不是<table>的开头,所以我们从中减去<table>字符。

表达式输出

2.剧本

Power Automate表达式有点有限,所以我们可以使用Office Scripts扩展其功能。我们不需要实际使用Excel文件,只需将其用作位符来发送和返回数据。有关Office Script的更多信息,请查看我之前的博客-如何掌握Power Automate脚本。

借助JavaScript/TypeScript的力量,有多种方法可以提取数据,但最有用的是一个简单的正则表达式。

假设在我们的示例中,我们希望所有链接(可能传递到另一个网络抓取阶段),我们可以将http正文传递给办公室脚本,然后该脚本使用正则表达式返回所有链接。

运行脚本

空的excel文件与以下脚本一起使用
办公室脚本

3.GPT

在某些情况下,数据或网页结构太不规则,当我们有一个王牌,Create text with GPT时,我已经做了一个完整的博客,关于它在这里可以做什么。

此连接器可以使用自然语言提示从上下文数据中提取数据。但有一个大问题,上下文数据有令牌/字符限制,因此我们无法发送完整的网页。

gpt令牌错误

令牌大约是一个4个字符的单词,但飞行中计算并不特别容易,所以我选择安全的5000个字符限制。

为了解决这个问题,我们需要与前两种方法中的任何一种相结合,以缩短上下文数据。

在演示示例中,我将查找内容列表,我知道它总是在顶部附近,所以我想从标题开始我的上下文数据(我知道它将永远是相同的)。然后传递接下来的5000个字符。

 

表达

substring(
    body('HTTP')
,
    indexOf(
        body('HTTP')
    ,
        'Vehicle tax rates'
    )
,
    5000
)

我们得到:

 

下面显示了所有方法有多简单(从行动方面):
 


您还可以以不同的方式组合它们,例如gpt连接器转换表,或删除标记标签以减少令牌的脚本

标签:HTTP,JavaScript,脚本
来源: