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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文讲的是有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取,【编者的话】Prerender 服务能够为网络爬虫提供预先渲染的动态页面内容,解决了用 JavaScript 框架构建的 Web 站点不支持爬虫抓取的问题。
本文讲的是有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取 【编者的话】Prerender 服务能够为网络爬虫提供预先渲染的动态页面内容,解决了用 JavaScript 框架构建的 Web 站点不支持爬虫抓取的问题。本文详细描述了一种解决方案,尤其是提供了集成 Prerender 服务的 Docker 容器镜像。

nomore.jpg

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

可以看到, 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 时,显示的结果却是非常令人失望的:

Schermata-2015-03-22-alle-13.32_.39_.png


导致如此糟糕的结果的原因很简单: 抓取网页时,网络爬虫并不会执行网页中的 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 容器。

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

dpr-ec1-1000x720.png

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

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

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

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

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

原文发布时间为:2015-03-30
本文作者:bnuhero 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取
相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1月前
|
JavaScript 前端开发 测试技术
使用Selenium执行JavaScript脚本:探索Web自动化的新领域
本文介绍了如何在Selenium中使用JavaScript解决自动化测试中的复杂问题。Selenium的`execute_script`函数用于同步执行JS,例如滑动页面、操作时间控件等。在滑动操作示例中,通过JS将页面滚动到底部,点击下一页并获取页面信息。对于只读时间控件,利用JS去除readonly属性并设置新日期。使用JS扩展了Selenium的功能,提高了测试效率和精准度,适用于各种自动化测试场景。
46 1
|
1月前
|
数据采集 Web App开发 JavaScript
JavaScript爬虫进阶攻略:从网页采集到数据可视化
JavaScript爬虫进阶攻略:从网页采集到数据可视化
|
1月前
|
数据采集 存储 XML
给你一个具体的网站,你会如何设计爬虫来抓取数据?
【2月更文挑战第23天】【2月更文挑战第75篇】给你一个具体的网站,你会如何设计爬虫来抓取数据?
|
1月前
|
数据采集 存储 Python
python实现 Web 爬虫。
python实现 Web 爬虫。
31 1
|
1月前
|
开发者 Docker Python
深入浅出:使用Docker容器化部署Python Web应用
在当今快速发展的软件开发领域,Docker作为一个开放平台,为开发者提供了将应用打包在轻量级、可移植的容器中的能力,从而简化了部署和管理应用程序的复杂性。本文将通过一个简单的Python Web应用示例,引导读者理解Docker的基本概念、容器化的优势以及如何使用Docker来容器化部署Python Web应用。我们将从零开始,逐步探索创建Dockerfile、构建镜像、运行容器等关键步骤,旨在为读者提供一个清晰、易于理解的指南,帮助他们掌握使用Docker容器化部署应用的技能。
|
2月前
|
数据采集 数据可视化 数据挖掘
Python爬虫实战:抓取网站数据并生成报表
本文将介绍如何使用Python编写简单而高效的网络爬虫,从指定的网站上抓取数据,并利用数据分析库生成可视化报表。通过学习本文内容,读者将能够掌握基本的爬虫技术和数据处理方法,为日后开发更复杂的数据采集与分析工具打下坚实基础。
|
1月前
|
应用服务中间件 nginx Docker
Docker网络管理
Docker网络管理
28 1
|
1月前
|
数据采集 数据可视化 数据挖掘
使用Python编写Web爬虫实现数据采集与分析
在当今信息化时代,数据是企业发展和决策的重要依据。本文将介绍如何使用Python编写Web爬虫来实现对特定网站数据的自动采集,并结合数据分析技术,为读者展示如何利用爬虫技术获取有价值的信息并进行有效的数据处理和分析。
|
1月前
|
前端开发 应用服务中间件 nginx
使用Docker快速搭建Web服务器Nginx
本文指导如何使用Docker快速搭建Nginx服务器。首先,通过`docker pull`命令获取Nginx镜像,然后以容器形式运行Nginx并映射端口。通过挂载目录实现本地文件与容器共享,便于自定义网页。使用`docker ps`检查运行状态,访问IP:8088确认部署成功。最后,介绍了停止、删除Nginx容器的命令,强调Docker简化了服务器部署和管理。
50 0
|
4天前
|
SQL 存储 前端开发
< 今日份知识点:web常见的攻击方式(网络攻击)有哪些?如何预防?如何防御呢 ? >
网络安全威胁日益严重,2017年的永恒之蓝勒索病毒事件揭示了网络攻击的破坏力。为了防御Web攻击,了解攻击类型至关重要。Web攻击包括XSS、CSRF和SQL注入等,其中XSS分为存储型、反射型和DOM型,允许攻击者通过注入恶意代码窃取用户信息。防止XSS攻击的方法包括输入验证、内容转义和避免浏览器执行恶意代码。CSRF攻击则伪装成用户执行操作,防范措施包括同源策略和CSRF Token验证。SQL注入则通过恶意SQL语句获取数据,预防手段包括输入验证和使用预编译语句。面对网络威胁,加强安全意识和实施防御策略是必要的。