[转载,后续补上实践case]

有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取

【编者的话】Prerender 服务能够为网络爬虫提供预先渲染的动态页面内容,解决了用 JavaScript 框架构建的 Web 站点不支持爬虫抓取的问题。本文详细描述了一种解决方案,尤其是提供了集成 Prerender 服务的 Docker 容器镜像。

如果你正在使用 AngularJS 构建一个面向大众消费者的应用,你肯定希望用户能把它分享到社交媒体上。对于特定的应用而言,丰富的社交分享差不多是最重要的营销渠道。所谓「丰富的社交分享」,是指像下面这样的分享:

可以看到, Facebook, Twitter 等社交站点能够获取非常丰富的内容,不仅限于网页标题和图片。为什么可以做到这一点?因为在网页 HTML 文档的 head 部分包含了有特别含义的元数据标记。像 Facebook 以及 Pinterest 和 Google+ 等社交站点能读取遵循开放图协议标准的元数据,例如,

<head>
<meta property="og:title" content="My Page" />
<meta property="og:description" content="A description of my page." />
<meta property="og:image" content="http://www.mysite.com/images/my_lovely_face.jpg" />
<!-- etc. -->
</head>

Twitter 也支持类似的机制,不过它用的元数据属性前缀是 twitter: ,而不是 og: 。

当用户在社交站点上分享一个 URL 时,社交站点会启动一个网络爬虫去抓取该页面的内容。网络爬虫首先在网页源文档中找出各种元数据标记,然后才会查看常规 HTML 元素的内容,例如, &lt;head> 标记和网页中的图像等。

用 AngularJS(以及其它 JavaScript 框架)开发的 Web 站点不支持爬虫的抓取

我已经在 Earlyclaim 站点的网页中添加了所有必需的遵循开放图协议标准的元数据标记。但是,当我把 Earlyclaim 站点的一个链接分享到 Facebook 时,显示的结果却是非常令人失望的:

导致如此糟糕的结果的原因很简单:抓取网页时,网络爬虫并不会执行网页中的 JavaScript 代码。因此,爬虫抓取到的内容是这样的:

<head>
<meta property="og:title" content="{{meta.title}} - earlyclaim.com" />
<meta property="og:description" content="{{meta.description}}" />
<meta property="og:image" content="{{meta.image}}" />
<!-- etc. -->
</head>

解决方案

解决方案的基本思想是:应用一种在服务器端执行的用户代理探测方法,识别出当前请求来自于社交站点的爬虫;此时,服务器不会像处理浏览器请求那样返回一个 AngularJS 模板文件,而是重定向到一个服务器端生成的页面,页面中包含了希望提供的元数据标记以及正确填写的信息。

经过 Google 搜索,以及与其它创业公司 startypchile 的技术人员的讨论,我们发现了 prerender.io 服务,它能够预先渲染好动态页面的内容。这为问题的解决奠定了良好的开端。

Prerender 的开发者提供了很多中间件, 还把 prerender 引擎开源,因为他们认为

我们相信搜索引擎优化(SEO)是一种权利,而非一种特权!

当然,如果你愿意,也可以付费使用他们提供的 Prerender 托管服务。

支撑 Earlyclaim 的基础设施是以 Docker 为基础构建的。为了集成 Prerender 服务,我们首先在 Docker Hub 中找出相关的几个容器镜像,然后进行试用,结果难以令人感到满意。

我们的需求包括:

  • 完全可定制的环境(通过 Kitematic );
  • 能够使用 Redis 作为缓存数据库;
  • 立即可用的 Prerender 容器。

这些也是我们自行构建容器镜像的原因!

为什么公开我们的解决方案

首先,我们信仰「协同智能」:

协同智能是多主体、分布式系统的特征,其中每个主体(人或者机器)都有唯一的位置,自主地为问题解决网络作贡献。在生态系统中,有机体的协同自治使得演化成为可能。在自然生态系统中,每个有机体的唯一标识来自于自身的基因、环境以及它在生态系统中的行为和位置。自然生态系统为设计下一代社交网络提供原则,使之能够支持协同智能、众包个人的专长、偏好以及在问题解决过程中的独特贡献。
- 摘自 维基百科

我们的解决方案是建立在开源的 prerender.io 引擎 的基础之上:没有它,就不会有我们的解决方案。 Prerender 团队太棒了。

其次,同样重要的是,在与很多创业公司的开发者交流之后,我们了解到:他们很多人都在使用 AngularJS 或者其它框架构建 Web 应用,也需要解决搜索引擎优化/丰富的社交分享问题。然而,由于不知道解决方法,或者感觉解决起来太耗费时间,或许会影响更为重要的产品发布时间,他们暂时搁置这个问题,留待以后解决。还有些开发者甚至没有意识到有这个问题,当从我们这里听说了之后,他们请求我们把解决方案分享出来。

我们相信这个方案能够加速整个开发进程,因为它解决了一个普遍的问题。很高兴能够分享这个方案。

实现

如果技术人员想把我们构建的容器镜像添加到自己的基础设施中,请参考 Docker Hub 上的文档:https://registry.hub.docker.co ... edis/

AngularJS 服务

如果是 AngularJS 应用,首先实现下面的代码:

'use strict';
!(function (window, document, undefined) {
var getModule = function (angular) {
return angular.module('seo', [])
  .run([
    '$rootScope',
    function ($rootScope) {
      $rootScope.htmlReady = function () {
        $rootScope.$evalAsync(function () { // fire after $digest
          setTimeout(function () { // fire after DOM rendering
            if (typeof window.callPhantom === 'function') {
              window.callPhantom();
            }
          }, 0);
        });
      };
    }
  ]);
};
if (typeof define === 'function' && define.amd) {
define(['angular'], getModule);
} else {
getModule(angular);
}
})(window, document);

然后通过angular.module('youApp', ['seo'])调用。

结论

如果你使用我们的容器,觉得还不错,请一定告知我们(@Earlyclaim)。

如果你觉得有人会对此感兴趣,请转发给他们(点击社交分享按钮)!

任何建议,请发推特并通知 @Earlyclaim :非常期待您的观点和文字!

任何代码改进,请通过 GitHub 推送合并请求!

顺便说一句,我们热爱创业公司,我们热爱开发者,我们热爱社区!开放生态系统万岁!

原文:Get your Javascript website perfectly crawled with Docker (翻译:柳泉波 校对:佚名)

=====================================

译者介绍
柳泉波,读书喝茶踢球写程序,目前在华南师范大学广东高校计算机网络与信息系统工程中心工作。

crawler_Docker_解决用 JavaScript 框架开发的 Web 站点抓取的更多相关文章

  1. 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取

    点这里 阅读目录 用 AngularJS(以及其它 JavaScript 框架)开发的 Web 站点不支持爬虫的抓取 解决方案 为什么公开我们的解决方案 实现 AngularJS 服务 结论   Pr ...

  2. Web站点抓取工具webhttrack

    近来发现Ubuntu下一个很好用的web站点抓取工具webhttrack,能够将给定网址的站点抓取到本地的目录中,并实现离线浏览,很实用. 1.安装webhttrack ubuntu 16.04的官方 ...

  3. web scraper 抓取分页数据和二级页面内容

    如果是刚接触 web scraper 的,可以看第一篇文章. web scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据. ...

  4. web scraper 抓取数据并做简单数据分析

    其实 web scraper 说到底就是那点儿东西,所有的网站都是大同小异,但是都还不同.这也是好多同学总是遇到问题的原因.因为没有统一的模板可用,需要理解了 web scraper 的原理并且对目标 ...

  5. 联系我们_鲲鹏Web数据抓取 - 专业Web数据采集服务提供者

    联系我们_鲲鹏Web数据抓取 - 专业Web数据采集服务提供者 首页 > 联系我们 我们的联系方式如下: 029 - 82542052(陕西 西安) 13389148466 或 13571845 ...

  6. 测试开发Python培训:抓取新浪微博抓取数据-技术篇

    测试开发Python培训:抓取新浪微博抓取数据-技术篇   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的se ...

  7. 测试开发Python培训:抓取新浪微博评论提取目标数据-技术篇

    测试开发Python培训:抓取新浪微博评论提取目标数据-技术篇   在前面我分享了几个新浪微博的自动化脚本的实现,下面我们继续实现新的需求,功能需求如下: 1,登陆微博 2,抓取评论页内容3,用正则表 ...

  8. web scraper 抓取网页数据的几个常见问题

    如果你想抓取数据,又懒得写代码了,可以试试 web scraper 抓取数据. 相关文章: 最简单的数据抓取教程,人人都用得上 web scraper 进阶教程,人人都用得上 如果你在使用 web s ...

  9. 吴裕雄--天生自然python学习笔记:WEB数据抓取与分析

    Web 数据抓取技术具有非常巨大的应用需求及价值, 用 Python 在网页上收集数据,不仅抓取数据的操作简单, 而且其数据分析功能也十分强大. 通过 Python 的时lib 组件中的 urlpar ...

随机推荐

  1. 数据结构 - AVL木

    在计算机科学,AVL木是一个平衡树最早发明. 于AVL树节点,而不管是什么的两个子树之一的高度之间最大的区别,因此,它也被称为平衡树高.查找.O(log n). 插入和移除可能需要一个或更多次通过旋转 ...

  2. hdu1004----用java链表实现

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  3. RH033读书笔记(8)-Lab 9 Using vim

    Lab 9 Using vim Sequence 1: Navigating with vim 1. Log in as user student 2. [student@stationX ~]$ c ...

  4. 迅雷云加速开放平台c#demo

    迅雷云加速开放平台c#demo.很多人很遇到下载文件的问题.这个例子是调用迅雷云加速开放平台的dll,进行下载,速度很快,下载过程中可以获取到很全的下载信息,比如下载速度,进度,完成状态等. 例子中带 ...

  5. Android使用开源项目Xutils实现多线程下载文件

    #1.下载utils项目 https://github.com/wyouflf/xUtils #2布局文件里实现UI <LinearLayout xmlns:android="http ...

  6. 【Java基础】常用基础--从键盘中得到一个字符串

    public static void main(String[] args) { InputStreamReader ipsReader = new InputStreamReader(System. ...

  7. (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上

    (1)首先创建java project 选择eclipse菜单上File->New->Java Project. 并命名为UploadFile. (2)加入必要的hadoop jar包 右 ...

  8. 集成ejs和angular

    我们也有一个系统angular用在应用中单页.正确angular做一些定制.集成seajs.不实用angular自己的模块管理. 只要angular也可单独使用在,一个较小的系统新开发,我不会用前js ...

  9. MFC 盾webBrowser打开弹出的页面

    void CansDlg::NewWindow3Explorer1(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR b ...

  10. Mongodb语法总结

    mongodb与mysql指挥控制 由数据库中的一般传统的关系数据库(database).表(table).记录(record)三个层次概念组成.MongoDB是由数据库(database).集合(c ...