如何免费阅读经济学人文章

2022-04-15 ⏳2.7分钟(1.1千字)

上海爆发疫情,隔离在家的我一直为生计发愁,没有心情更新博客。期间的所见所闻让我再一次意识到要加强英文学习。为此,我尝试阅读更多英文版的新闻和评论。其中,比较有名的就是经济学人(The Economist)。原则上我们要支持正版,但每年一百八十九美元的订阅费确实不符合咱们的国情。那只好想办法薅资本主义的羊毛了。今天就把薅羊毛的办法分享给大家。

一般网站为保护版权,只让付费用户阅读文章内容。但这么一来,相关的文章也就没法用搜索引擎搜到,也就失去了很重要的流量来源。为此,多数网站都允许谷歌的爬虫来抓取自己的文章内容,无论是否付费,都可以。因为谷歌比较良心,它虽然抓取的文章内容,也仅仅用来做搜索匹配之用,不会主动向用户展示全文内容。所以用户可以通过谷歌搜索到付费的内容,然后再跳转到源网站付费阅读。这样做对用户、对谷歌、对内容方都有利。

虽然谷歌不会主动提供文章原文,但是它有一个所谓的网页快照功能。通过这个功能,我们可以查看谷歌抓取的文章内容,从而绕开原网站的付费限制。这就是免费阅读原理。

如果你想查看某个网页,比如它的链接是https://taoshu.in/about.html,我们可以把它拼接出对应的网页快照链接https://webcache.googleusercontent.com/search?q=cache:https://taoshu.in/about.html,就可以打开了。当然了,前提是你能正常访问谷歌网站。

这样做虽然可行,但用起来很不方便。如果只是分享这样小技巧,那就不需要写一篇文章了。接下来就跟大家分享一个更方便的阅读方法。

所谓的方便就是自动拼接网页快照链接,就需要用到油猴脚本。不同的浏览器都有油猴插件,Chrome 下有 Tampermonkey,Firefox 下有 Greasemonkey。大家可以自己装上学习一下使用方法。今天我就单说脚本的具体写法。下面的内容假设读者了解 javascript 编程语言,而且熟悉浏览器的 DOM API。

油猴脚本说白了就是特殊的 javascript 脚本。结构如下:

// ==UserScript==
// @name     Google Web Cache
// @version  1
// @grant    none
// @include  https://www.economist.com/*
// @run-at   document-end
// ==/UserScript==
(function (window) {
  // ...
})(window);

//开头的注释,但@开头的有特殊含义。这里最重要的就是@include

@include表示插件运行的范围。比如这里的@include https://www.economist.com/*表示只在网站www.economist.com上运行。如果想支持多个网站,可以指定多条@include

接下来就是 javascript 程序。(function(window) {})(window);是 javascript 中的经典套路,意思是把实际代码放到一个函数里立即执行,避免不同油猴脚本相互影响。

我们需要做的就是当鼠标移动到某个链接上的时候,将链接自动修改为谷歌的快照链接。所以核心代码如下:

// 注册 mouseover 事件
document.addEventListener('mouseover', function (event) {
  let a = event.target;
  // 如果鼠标移动到超链接上 <a>
  if (a && a.tagName == 'A') {
    // 修改超链接地址
    a.href = "https://webcache.googleusercontent.com/search?q=cache:"+a.href;
  }
}, true);

将脚本加到油猴插件里,打开经济学人网站后点击任意链接就可以打开对应的网页快照了。

如果你按上面的脚本试验了就会发现有时候会有问题,那是因为经济学人上有些链接是相对链接,并不包含域名等信息。所以我们需要用代码补上这一部分。修改后的代码如下:

// 注册 mouseover 事件
document.addEventListener('mouseover', function (event) {
  let a = event.target;
  // 如果鼠标移动到超链接上 <a>
  if (a && a.tagName == 'A') {
    let url = a.href;
    // 如果是站内路径则补全域名等信息
    if (url.startsWith("/")) {
      url = a.baseURI + url;
    }
    // 修改超链接地址
    a.href = "https://webcache.googleusercontent.com/search?q=cache:"+url;
  }
}, true);

用上面的脚本就可以自动打开所有网页快照了。祝大家学习愉快😄我自己使用的完整代码如下:

// ==UserScript==
// @name     Google Web Cache
// @version  1
// @grant    none
// @include  https://www.economist.com/*
// @include  https://www.theatlantic.com/*
// @run-at   document-end
// ==/UserScript==
(function (window) {
  "use strict";
  document.addEventListener('mouseover', function (event) {
    let a = event.target, depth = 3;
    while (a && a.tagName != 'A' && depth-- > 0) {
      a = a.parentNode;
    }

    if (a && a.tagName == 'A') {
      let url = a.href;
      if (url.startsWith("/")) {
        url = document.URL + url;
      }
      if (url.startsWith(document.URL)) {
        a.href = "https://webcache.googleusercontent.com/search?q=cache:"+url;
      }
    }
  }, true);
})(window);