基本思想是 Web 应用程序获取外部网站并在其上覆盖一些 JavaScript,以获得附加功能。
但是,我获取的网页上的链接不应导航到外部网站,而是留在我的网站上。我认为使用正则表达式(或类似方法)转换链接效率低下,因为它不会涵盖动态生成的链接,例如 AJAX 请求或其他 JavaScript 功能。所以基本上我似乎找不到的是一种更改/拦截/重定向被抓取网站的所有链接的方法。
那么,改变/拦截抓取网站的动态生成链接的(好)方法是什么?最好是python方法。
基本思想是 Web 应用程序获取外部网站并在其上覆盖一些 JavaScript,以获得附加功能。
但是,我获取的网页上的链接不应导航到外部网站,而是留在我的网站上。我认为使用正则表达式(或类似方法)转换链接效率低下,因为它不会涵盖动态生成的链接,例如 AJAX 请求或其他 JavaScript 功能。所以基本上我似乎找不到的是一种更改/拦截/重定向被抓取网站的所有链接的方法。
那么,改变/拦截抓取网站的动态生成链接的(好)方法是什么?最好是python方法。
除非您在抓取的网页(包括动态网页)上更改 URL,否则您无法按照您的要求进行操作。
如果为客户提供了一个带有指向外部站点的 URL 的网页,那么您的网站将没有机会拦截或更改它,因为他们的浏览器甚至会在不访问您的站点的情况下导航离开(尽管严格来说并非如此 - 请继续阅读)。从理论上讲,您可以将事件处理程序附加到所有链接(在提供抓取的页面之前),甚至拦截动态创建的链接(通过解析它们的 javascript),但这可能会非常困难。您还必须停止 URL 更改的其他方法(如标头重定向)。
客户端本身可以在其浏览器中使用代理(影响所有传出 URL),但这是客户端决定所有流量都应通过代理服务器路由。 您不能代表他们执行此操作(无需实际更改 URL)。
编辑:由于 OP 删除了使用网络代理的建议,答案细节略有变化,但最终结果是一样的。 出于所有实际目的,几乎不可能做到这一点。
您可以尝试解析页面上的 javascript 并在某些页面上成功(或者可能为许多典型页面使用足够复杂的脚本);但是在eval
页面上添加一点,您将需要自己的用 javascript 编写的 javascript 引擎来尝试找出页面上每个可能的外部请求。......即使那样你也做不到。
基本上,给我一个脚本,有人说它可以解析任何网页(包括 javascript)以拦截任何外部调用,我会给你一个这个脚本不起作用的网页。 免责声明:我说的是拦截链接,但让网站在之后正常运行......不仅仅是解析页面以完全删除所有 javascript。
其他人可能能够为您提供有时适用于某些网页的答案 - 也许这对您的目的来说已经足够了。
此外,您是否考虑过页面上的大多数 javascript 不是嵌入的,而是通过<script>
标签加载,甚至可能从原始服务器动态加载。我假设您想要区分“从原始服务器加载的内容需要使页面正常运行并看起来正确”,以及“从原始服务器加载的其他内容”。您的程序如何“知道”这一点?
您可以尝试解析页面并删除所有 javascript...但即使这样也会非常困难,因为仍然有一些棘手的方法可以解决这个问题。