用PhantomJS来给AJAX站点做SEO优化

news/2024/5/14 13:23:40/文章来源:https://blog.csdn.net/weixin_33739523/article/details/91793975

为什么80%的码农都做不了架构师?>>>   hot3.png

转 https://www.mxgw.info/t/phantomjs-prerender-for-seo.html

 

腾讯问卷所有动态内容,全部由Ajax接口提供。

众所周知,大部分的搜索引擎爬虫都不会执行JS,也就是说,如果页面内容由Ajax返回的话,搜索引擎是爬取不到部分内容的,也就无从做SEO了。

先来看看效果

QQ20160321-1

去年一整年,搜索引擎收录都少得可怜。

更致命的是,被收录的页面,其搜索引擎里面显示的标题是最原始的html标题,权重如此高的地方,却被收录了一个没什么用的标题。

在去年年底完成实施了预渲染服务后,收录量蹭蹭蹭的起来了,并且收录的标题也都全部正常了。

而这所有的一切,除了Nginx接入层的配置是需要改动业务代码外,其他全部都是旁路机制。也就是说,自己做一套,可以给所有同类型业务共用,同时不会影响现有业务的任何代码任何流程。

 

PhantomJS来解围

Ajax无法做SEO这个问题,困扰了我很久,后来发现PhantomJS这东西能在服务端解析HTML,瞬间这个问题不再是问题。

PhantomJS is a headless WebKit scriptable with a JavaScript API. It has fast andnativesupport for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG.

准备一个PhantomJS任务脚本

这里我命名为spider.js。

 /*global phantom*/
  "use strict";
  
 // 单个资源等待时间,避免资源加载后还需要加载其他资源
  var resourceWait = 500;
  var resourceWaitTimer;
  
 // 最大等待时间
  var maxWait = 5000;
  var maxWaitTimer;
  
 // 资源计数
  var resourceCount = 0;
  
 // PhantomJS WebPage模块
  var page = require('webpage').create();
  
 // NodeJS 系统模块
  var system = require('system');
  
 // 从CLI中获取第二个参数为目标URL
  var url = system.args[1];
  
 // 设置PhantomJS视窗大小
  page.viewportSize = {
 width: 1280,
 height: 1014
 };
  
 // 获取镜像
  var capture = function(errCode){
  
 // 外部通过stdout获取页面内容
  console.log(page.content);
  
 // 清除计时器
  clearTimeout(maxWaitTimer);
  
 // 任务完成,正常退出
  phantom.exit(errCode);
  
 };
  
 // 资源请求并计数
  page.onResourceRequested = function(req){
 resourceCount++;
  clearTimeout(resourceWaitTimer);
 };
  
 // 资源加载完毕
  page.onResourceReceived = function (res) {
  
 // chunk模式的HTTP回包,会多次触发resourceReceived事件,需要判断资源是否已经end
  if (res.stage !== 'end'){
  return;
 }
  
 resourceCount--;
  
  if (resourceCount === 0){
  
 // 当页面中全部资源都加载完毕后,截取当前渲染出来的html
 // 由于onResourceReceived在资源加载完毕就立即被调用了,我们需要给一些时间让JS跑解析任务
 // 这里默认预留500毫秒
 resourceWaitTimer = setTimeout(capture, resourceWait);
  
 }
 };
  
 // 资源加载超时
  page.onResourceTimeout = function(req){
 resouceCount--;
 };
  
 // 资源加载失败
  page.onResourceError = function(err){
 resourceCount--;
 };
  
 // 打开页面
  page.open(url, function (status) {
  
  if (status !== 'success') {
  
  phantom.exit(1);
  
 } else {
  
 // 当改页面的初始html返回成功后,开启定时器
 // 当到达最大时间(默认5秒)的时候,截取那一时刻渲染出来的html
 maxWaitTimer = setTimeout(function(){
  
  capture(2);
  
 }, maxWait);
  
 }
  
 });
view raw spider.js hosted with  by  GitHub

通过PhantomJS命令直接执行即可在终端中看到渲染后的html结构

 

命令服务化

什么意思呢,因为上面是一个命令,没法很好的响应搜索引擎爬虫的请求,估我们要把他服务化。

PhantomJS自带一个Web Server Module,但总是不稳定,如前面文章所说时不时会假死。

我们就通过Node给他起一个简单的Web服务。

 // ExpressJS调用方式
  var express = require('express');
  var app = express();
  
 // 引入NodeJS的子进程模块
  var child_process = require('child_process');
  
  app.get('/', function(req, res){
  
 // 完整URL
  var url = req.protocol + '://'+ req.hostname + req.originalUrl;
  
 // 预渲染后的页面字符串容器
  var content = '';
  
 // 开启一个phantomjs子进程
  var phantom = child_process.spawn('phantomjs', ['spider.js', url]);
  
 // 设置stdout字符编码
  phantom.stdout.setEncoding('utf8');
  
 // 监听phantomjs的stdout,并拼接起来
  phantom.stdout.on('data', function(data){
 content += data.toString();
 });
  
 // 监听子进程退出事件
  phantom.on('exit', function(code){
  switch (code){
  case 1:
  console.log('加载失败');
  res.send('加载失败');
  break;
  case 2:
  console.log('加载超时: '+ url);
  res.send(content);
  break;
  default:
  res.send(content);
  break;
 }
 });
  
 });
view raw express_spider.js hosted with  by  GitHub

旁路服务

我们现在已经有了一个能跑预渲染的Web服务了,剩下就是要将搜索引擎爬虫的流量导入到这个预渲染的服务中,同时把结果再返回给搜索引擎爬虫。

我们使用Nginx这个接入层利器即可轻松解决这个问题。

 # 定义一个Nginx的upstream为spider_server
 upstream spider_server {
 server localhost:3000;
 }
  
 # 指定一个范围,默认 / 表示全部请求
 location / {
 proxy_set_header Host $host:$proxy_port;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  
 # 当UA里面含有Baiduspider的时候,流量Nginx以反向代理的形式,将流量传递给spider_server
 if ($http_user_agent ~* "Baiduspider") {
 proxy_pass http://spider_server;
 }
 }
view raw nginx_spider.conf hosted with  by  GitHub

这个栗子里面仅仅对百度爬虫做了处理,可以自行把爬虫都补完整。

Free

说了这么多,我突然觉得这篇文章非常值钱。

因为,国外也有专门的服务端预渲染服务了,但他们统统要收费。

你可以根据本文的思路,自行部署一套旁路渲染服务。

  • http://www.brombone.com/
  • http://getseojs.com/
  • http://prerender.io/

附上一份新鲜收集的爬虫UA列表

  • 360 【文档】
    • 360Spider
    • HaoSouSpider
    • 360Spider-Image
    • 360Spider-Video
  • Baidu 【文档】
    • Baiduspider
  • Google 【文档】
    • Googlebot
    • Googlebot-News
    • Googlebot-Video
    • Googlebot-Mobile
  • Sogou 【文档】
    • Sogou web spider
    • Sogou inst spider
    • Sogou Spider
  • Bingbot【文档】
    • bingbot
    • msnbot
    • msnbot-media
    • adidxbot
    • BingPreview

转载于:https://my.oschina.net/huqiji/blog/831826

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_789186.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站运行编译器错误CS1617: 选项“6”对 /langversion 无效;必须是 ISO-1、ISO-2、3、4、5 或 Default...

运行winform程序时提示, CS1617: 选项“6”对 /langversion 无效;必须是 ISO-1、ISO-2、3、4、5 或 Default 找到网站的web.config配置文件,找到相关的行数。 这样就解决问题了。转载于:https://www.cnblogs.com/xiaoai123/p/7513132.html

html地址怎么写成动态_网站动态页面如何优化 - 最蜘蛛池网站收录

原出处:最蜘蛛池原文链接:网站动态页面如何优化? - 最蜘蛛池相信那些SEO优化的那些朋友们,肯定还在一股脑的想着如何让自己的网站安静下来,他们都把这一点列入了重中之重的位置。最蜘蛛池小编不赞成此观点,…

搜索重复代码_网站代码优化技巧,你还不知道吗?

代码优化就是对网站代码开展解决:包含编码精减提升、标识增删、编码改动增删封裝、连接构造等解决。那么网站代码要怎样优化呢?删除冗余代码删除冗余代码,也指删除垃圾代码,主要是指网页中非必要的代码,也就是说可有可…

linux下设置网站默认目录,RedHat Linux下修改站点的默认路径

近期在做linux开发,涉及到一些问题,在此写出来,希望能帮到和我遇到相同问题的人。环境:RedHat linux 5.4; apache 2.4.4 ; php 5.5首先搭建好环境,具体搭建环境就不说,本人的环境路径…

个别重要的网站链接(更新中)

为什么80%的码农都做不了架构师?>>> centos全系列阿里云下载 http://mirrors.aliyun.com/centos/7.2.1511/isos/x86_64/ 数字动起来的js插件 CountUP.js 变形字体 http://nymphont.deviantart.com/ shadowsock 免费密码和账号 http://ss.fa4.cn/ redis安…

制作一个简单的钓鱼网站

制作一个简单的钓鱼网站 实验环境:一台kali虚拟机(用作制作钓鱼网站),NAT模式上网。 一台物理机(就是我的电脑,用作被攻击对象) 首先在kali上打开要使用的工具setoolkit. 接着有6个选项&#xf…

如何 阻止员工 访问 找工作网站 变态的方法 也适合禁用其它网站

在小公司没有防火墙的情况下, 如何 阻止员工 访问 找工作网站 变态的方法 也适合禁用其它网站 如下图: 打开 C:\windows\system32\drivers\etc\ hosts 文件,用记事本打开 第一行为默认不能动 第二行为添加、要再添加其它网站的话,…

浅谈大型网站动态应用系统架构(转)

动态应用,是相对于网站静态内容而言,是指以c/c、php、Java、perl、.net等服务器端语言开发的网络应用软件,比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可分。 大型动态应用系统…

基于Python-Flask实现的网站例子

概述 使用Flask写的体育网站 包括(注册 论坛 文章评论 组建战队 后台管理)等功能 示例地址文中有写 萌新 请多指教详细 代码下载:http://www.demodashi.com/demo/12380.html 项目示例地址: 网站演示 一、环境搭建 1. 安装配置python3.6 示例网…

Web应用网站CDN加速访问技术原理

CDN全称Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络&#xff0c…

swf游戏保存进度_告别模拟器,一个网站,让你重温所有红白机、街机游戏

相信很多人都和我一样小时候的记忆第一次接触游戏听到的第一个声音便是小霸王,其乐无穷还记得当时忽悠老爹给我买时说是为了学习打字不知还有没有人记得下面这些绝版游戏我承认当时买了小霸王后第一件事的确是认(zhuang)认(mu)真(zuo)真(yang)地练习打字等老爹欣慰地…

Windows Server 2008 IIS下部署网站出现的问题

1. 无法识别“targetFramework” 用的是vs2010,应用.NET Framework 4创建的网站放在IIS(7.0)下会出现如下的错误:版本信息显示.NET Framework和ASP.NET的版本都是2.0,而我们制作网站的时候使用的.NET Framework 4.0&am…

校内闲鱼网站风险分析与会议内容

风险分析 1、技术风险 前端前端所有页面统计共有11个,可能还有一些细节的页面没有考虑到,而我们团队前端技术人员只有两人,存在的风险是可能不能按时完工。 应对措施:提早开工前端页面的代码设计,每一天都需要实现相应…

一般人不知道的SEO术语!!!

SEO就是Search Engine Optimization的缩写,中文就是搜索引擎优化。PR 值全称为PageRank(网页级别),是Google用于用来标识网页的等级、重要性的一种方法,是Google用来衡量一个网站的好坏的重要标准之一。SEM 搜索引擎营销,SEM常常是指通过付费和广告向搜索…

如何使用阿里云快速搭建个人网站

一、准备 1.windows本地远程连接Linux主机工具: XShell:http://xshellcn.com putty:http://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html cmder:https://cmder.net/ 2.远程上传文件至Linux主机: winscp&am…

网站能拿到其他网站的cookie_当网站安全漏洞来袭,没有谁还能拒绝网站安全监测和加固的服务!...

当下,随着互联网不断的发展,网站出现漏洞的频率以及网站被攻击的概率越来越高,这时候,网站安全问题如何解决呢?现在我们能做的就是做好预防工作。下面,蒙特给大家分享一些网站预防措施,有多重要&#xff0…

恶意网站可利用浏览器扩展 API,窃取浏览器数据

开发四年只会写业务代码,分布式高并发都不会还做程序员? 恶意网站可以利用浏览器扩展 API,在浏览器内执行代码,来窃取用户敏感信息,比如用户书签、历史浏览记录和 cookies。在这之后,攻击者可能劫持用户的…

在服务器上用IIS部署搭建网站教程

IIS,和apche一样是一种web服务器,有了这种服务器,我们的网站程序或其他web程序才可以正常运行。这里就教新手在服务器上怎么用IIS部署搭建一个网站。 使用iis 搭建网站 1.开始→管理工具→internet信息服务(iis)管理…

基于jQuery的网站首页宽屏焦点图幻灯片

今天给大家分享一款基于jQuery的网站首页宽屏焦点图幻灯片。这款焦点图适用浏览器&#xff1a;IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗。效果图如下&#xff1a; 在线预览 源码下载 实现的代码。 html代码&#xff1a; <!-- index-focus begin -…

有趣人物为你讲述网站开发过程

虽然这个流程与真实有点出入&#xff0c;但基本是这意思了。开发过程中三个角色&#xff1a;程序员&#xff0c;设计师和客户步骤1&#xff1a;项目讨论在接到项目后首先需要开项目开发讨论会&#xff0c;讨论网站的栏目&#xff0c;开发方向&#xff0c;文字内容和图片等等。步…