首页 > 解决方案 > 对网站的 Http 请求以获取特定 html 元素的内容

问题描述

我正在建立一个网站来帮助学生安排他们的大学课程。它将包括诸如日期、时间、教授等内容。我想从 www.ratemyprofessors.com 获取教授的“评级”并将其显示在我的网站上。例如,在https://www.ratemyprofessors.com/ShowRatings.jsp?tid=1230754 ,您可以看到 Michael 的评分为 4.6。我想请求该数据并将其显示在网站上。当他们的收视率发生变化时,我无法事先刮掉它,我希望它显示他们当前的收视率。我可以用 XmlHttpRequest 做到这一点吗?我该怎么做?我希望在 JavaScript 中做到这一点。

标签: javascripthtmlhttpweb-scraping

解决方案


除非目标站点允许,否则浏览器不会让对第三方网站的 http 请求离开您的网页。这称为 CORS。请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS。如果该站点允许(或不允许),您可能会很幸运,但将来可能会发生变化,使您陷入困境(故障功能)。

此外,您计划执行的操作称为网络抓取,通常它不受网站管理员的青睐,因此您最终可能会被阻止或偶然发现内容标记的更改,再次使您处于相同的状态。

我会向该网站的所有者请求许可,也许还需要 API 访问权限。

否则,您的选项 #1 是尝试从浏览器级脚本发出 http 请求(是的,您可以使用 ajax、XmlHttpRequest、新的 fetch API 或第三方脚本),这仅在 CORS 不可用时才有效没问题。

您的选项 #2 是从服务器发出相同的请求(因此,ajax 到您的服务器应用程序,它会抓取远程站点),这将是潜在 CORS 问题的解决方法。同样,CORS 仅在浏览器级别是一个障碍,因为浏览器被编码为拦截它,以最大限度地减少对用户数据的潜在危害。但是,此选项最终会阻止您的服务器访问远程站点,这将由该站点的所有者完成,只需将其配置为不接受来自他们检测为属于您的站点的 IP 地址的连接。很酷吧?

这两个选项都进一步受到处理内容更改的问题的影响,这将在您的请求后脚本手中,无论是在浏览器(选项 1)还是在服务器(选项 2)执行,这可能是持续维护。无论哪种方式,以这样一种方式制作它,以将第 3 方数据视为一个不错的选择(因此,当获取其他数据失败时,不要让您的页面崩溃)。

编辑:我必须尝试确定,但这是需要考虑的事情:您可以在页面中嵌入一个隐藏的 iframe,以该远程网页为目标(如您的示例中所示),然后在 iframe 的内容可用时对其进行解析。请注意,这项努力(我是否拼写正确)根本不是微不足道的,而且会花费相当多的开发时间(而且这不是初学者可以合理完成的任务,至少不会很快完成),并且 -再次 - 我不能 100% 确定它是否有可能,因为 iframe 托管网页在由 3rd 方网站提供服务时可能无法访问 iframe 的内容。所以,这可能是选项#3,它是浏览器解决方案(所以,有很多 javascript),但不容易受到 CORS 阻塞的影响。唷,很多话,我知道——但它们确实有道理,

希望这有助于决定。祝你好运。


推荐阅读