如何使用nodejs从数千个具有不同html结构(因此可能不使用html标签)的网站中抓取数据?

Posted

技术标签:

【中文标题】如何使用nodejs从数千个具有不同html结构(因此可能不使用html标签)的网站中抓取数据?【英文标题】:How to scrape data from thousands of websites with different html structure (so maybe without using html tag) with nodejs? 【发布时间】:2022-01-01 14:14:45 【问题描述】:

我的工作是从我国所有节日网站中提取信息。

信息,例如邮政地址、城市或电影节的主要主题,如电影、音乐、舞蹈等。

但是,并非所有网站都具有相同的 html 结构;也就是说,它们没有相同的 HTML 标签。

所以我要找的数据主要是页面的文字内容,数据不是那么容易找到的,因为每个网站上都没有明确提到,比如“地址:10 street of New York, New约克”。

有时网站上没有邮政地址,或者有时他们提到了几个城市,所以我可以提取错误的城市。

我考虑过使用正则表达式,或者找到一种解决方案来向谷歌发送全局请求并从其他网站获取数据。但是 Node.js 是否还有其他“干净”的解决方案或简单的解决方案?

【问题讨论】:

投票重新开放,因为这个问题的答案不必完全基于意见。 【参考方案1】:

没有“干净”的方法可以从一堆您无法控制的网站中抓取 HTML 数据。 HTML 抓取总是很混乱。您必须独立评估每个站点,并尝试找到最可靠的方式来获取您想要的信息。而且,您需要知道,随着这些其他网站修改其 HTML,它可能会随着时间的推移而中断,您需要定期维护以使其保持最新并正常工作。

您认为这需要多长时间?

这将花费多少时间完全取决于我们不知道的一大堆事情,例如您的技能水平、您尝试抓取的网站数量以及寻找可靠方法获取您希望从每个站点获取的数据。

我考虑过使用正则表达式,或者找到一种解决方案来向谷歌发送全局请求并从其他网站获取数据?但是有任何其他“干净”的解决方案或使用 nodejs 的简单解决方案吗?

仅供参考,HTML 通常不适合正则表达式,因为正则表达式很容易因 HTML 的微小更改而中断。从 HTML 获取数据的一种更易于管理的方法是使用 cheerio 之类的内容对其进行解析,然后直接访问 HTML 的实际结构,设计 DOM 查询来帮助您找到所需的信息。

而且,如果您要访问的内容是通过客户端 javascript 生成并以这种方式插入到页面中,那么您将不得不“运行”网页才能访问内容,因为所需的内容实际上不在页面的 HTML 中。这通常通过 puppeteer 之类的东西来完成,它在 chromium 中运行网页(包括在页面中运行 Javascript),然后让您以这种方式访问​​ DOM。

【讨论】:

感谢 Jfriend00 的回答!我的意思是我想从每个网站的每个页面的元素的文本内容中获取信息,以便在我需要的文本内容数据中找到(地址、主题......)当我说文本内容是段落内的文本时,

hello world

这里我想在“hello world”内容中搜索地址,不知道是否清楚...
@Leonie - 每个站点都不同,因此对于如何在特定网页中查找特定数据的任何具体建议,您必须发布指向准确网页的链接并告诉我们您想从中获取哪些数据。然后,我们可以提供有关如何最好地获取该数据的想法。 好的,我可以举三个例子:nordsudfilms.com/fr/cinema-a-la-frontiere,tangosud-montpellier.com,filmfrancophone.fr/fr,我需要提取完整的地址和邮政编码,地区,城市,节日日期,节日创建日期,节日的主题。 @Leonie - 这些网站很痛苦。他们在 HTML 中没有使用太多语义或数据结构,而是主要使用 HTML 来格式化。在 nordfilms 站点中,您可以使用cheerio 并为"article .entry-content p" 运行一个选择器,并遍历该选择器中每个<p> 标记的内容,以找到具有他们在此处使用的格式的那些内容。 HTML、类和 id 不指向您想要的数据,因此您必须使用 CSS 选择器大致到达那里,然后遍历内容以找到您要查找的内容。 @Leonie - 在 nordfilms 网站上,您可以查看目标 <p> 标签,寻找项目符号或日期。您可以在带有正则表达式的 <p> 标记的 textContent 中找到日期,其中正则表达式的目标是文本内容,而不是 HTML。

以上是关于如何使用nodejs从数千个具有不同html结构(因此可能不使用html标签)的网站中抓取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在数千个 PDF 文件中抓取表格?

具有数千个签名的防病毒软件如何在很短的时间内扫描文件? [关闭]

如何从 html 源代码中具有相同属性集和相同层次结构的 2 个元素中抓取单个元素(使用 python 的美丽汤)

如何使用 NodeJS 从 html 表单执行 PATCH 请求?

如何高效地处理数百个项目中的数千个 C# 文件?

如何在没有目录结构的情况下使用 tar 归档来自不同目录的文件