抓取食谱网站

2020-05-11 14:34:24

食谱进口商是藏红花最重要的特点之一。它允许用户输入URL,并将尝试从该网站提取食谱内容。

偶尔,菜谱站点会使用客户端呈现或阻止“bot”请求,此方法不起作用。然而,这还不足以保证使用像木偶师这样的东西。

大约75%的用户选择导入的网站易于解析,但对于其余25%的网站,则需要更先进的技术。

事实证明,当一个网站包含一些标准食谱元数据时,谷歌就会显示这些卡片。

因此,几乎每个流行的食谱网站都会包括关于标题、服务、配料、说明等…的元数据。用于食谱(外语食谱也会出现这种情况)。

对于这些网站,不涉及任何猜测。只需读取元数据即可。

为此,将在HTML中搜索类型为application/ld+json的脚本标记,该标记包含大型JSON blob中的元数据。

<;脚本类型=";application/ld+json";>;{";@Context";:";http://schema.org";,";@TYPE";:";食谱";,";名称";:";经典马里纳拉酱汁";,";ReceipeIngreative";:[";1罐28盎司的完整西红柿,1/4杯橄榄油,7个大蒜去皮并切成丝,1个小干整辣椒,1茶匙犹太盐,1个大的新鲜罗勒树枝,//更多的田地}/lt;/script>;#34;,#34;,#34;1大新鲜罗勒树枝#34;,#34;]//更多的领域}<;/script>;#34;,#34;,#34;,#34;,#34;,#34;,#34;,#34;,#34;,#34;,#34;//更多的领域}<;/脚本&>;

如果不存在,则遍历HTML以查找使用itemprop注释的标记。

<;H1 itemprop=";名称>;Simple Marinara Sauce<;/H1>;<;div>;<;span itemprop=";ReceipeIngreary&34;>;2罐炖番茄<;/span&>;<;span itemprop=";ReceipeIngreative&34;>;span itemprop=";regpeIngreative";>;span itemprop=";regpeIngreative";>;span itemprop=";regepeIngreative";>;1茶匙盐/span&>;/div>;

识别任意HTML中的配料和说明是最棘手的一步,所以我将把它留到最后。我们将首先从如何提取其他字段开始。

使用og:title元标记。如果不存在,则使用title标记。

将收集Body标记内的所有图像。然后删除较小的图像,用户从其余选项中选择正确的图像。

考虑每个HTML标记,直到找到一个包含Make:、Services:、Serving:或Year:的文本的标记。

好的,我们来谈谈寻找配料和说明书的技巧。

HTML可以在树结构中表示,其中HTML标记的子项成为树中节点的子项。

使用这个概念,HTML以深度优先的搜索方式被遍历,根据节点内部的文本对它们成为指令/成分的可能性进行评分。

它有没有使用任何特定于烹饪的指导性词汇,如:“撒”、“混”、“热”等。…。

有没有用“盐”、“橄榄油”、“黄油”等食品类的词呢?…。

是否包含“…”、“lb”、“oz”等单位?

找到两个单独的节点后,此步骤即告完成。一个有很高的指导分数,另一个有很高的成分分数。

在图论和计算机科学中,树或有向无环图T中两个节点v和w的最低公共祖先是同时具有v和w作为后代的最低节点。

我喜欢将其视为2个节点拥有的第一个共享父节点。这是它的一个很好的视觉效果:

这对于计算很有用,因为在大多数情况下,LCA节点将包含所有配料/说明,而所有其他HTML都可以忽略。

此时,假设配料和说明在LCA节点内,但是通常还有一些额外的节点没有用。

<;div>;<;!--开始忽略-->;<;div>;搭配您最喜欢的意大利面、披萨、千层面、肉丸、帕尔米亚干酪、三明治或任何听起来不错的食物。<;/div&>;<;div>;这么多好的理由让这款马里纳拉酱…。那么让我们开始吧!<;/div&>;<;!--End Ignore--<;<;!--第一个配料节点-->;<;div&>;div&>;1杯西红柿<;/div&>;盐<;/div&>;<;!--说明--<;div&>;抛出。<;/div>;<;/div>;

<;div&>;<;!--开始连续配料块-->;<;ul>;<;li>;1杯西红柿<;/li&>;li>;盐<;/li>;<;/ul&>;<;!--结束连续配料块-->;<;!--start。<;/div>;<;div>;搅拌。<;/div>;<;!--结束连续指令块-->;<;/div>;

因此,假设两个配料节点之间的所有节点都是配料(有助于检测奇怪的配料)。

<;ul>;<;li>;1杯米饭<;/li>;<;!--开始假定配料-->;<;li>;cardoon<;/li>;<;li>;Gurnard(选择黑肚)。<;/li>;<;!--end假定成分-->;<;li>;1茶匙盐<;/li>;<;/ul>;

使用这些假设,最后一步涉及遍历LCA节点的子节点。检查每个节点的,看它是属于配料块、指令块,还是应该完全忽略。

前面的分数与类名、标记(无论是…、SPAN、H1等)结合在一起考虑。和父标记。

只要达到一定的门槛,并不是所有的条件都需要满足。最好是更灵活一些,包含一些额外的信息,而不是更严格,有时会遗漏一种配料。

当已确定块时,可以提取成分/指令并完成算法。

为了让您了解一些成功解析的网站,这里使用了几个测试用例:

仍然会出现它没有正确提取配料/说明的情况,比如这个网站:http://www.cookingforengineers.com/recipe/195/Chocolate-Truffles。

用户输入指向没有食谱的网站的URL。

结合使用试探法和读取元数据,Saffron几乎可以从任何网站导入食谱。

如果您想亲自尝试一下,您可以在https://www.mysaffronapp.com.上查看