用PhantomJS来给AJAX站点做SEO优化

news/2024/5/13 17:47:25/文章来源:https://blog.csdn.net/iteye_18766/article/details/82673469

转 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 rawspider.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 rawexpress_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 rawnginx_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

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

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

相关文章

个人网站设计:25个国外优秀案例带给你灵感

个人网站正变得越来越流行,它们可以有效地进行促销,找工作,个人品牌以及与朋友和家人沟通中使用。这些个人网站往往可以作为一个创造性的出口,并允许网站所有者更多的自由。 在这篇文章中,我们将分享精心设计的25例个人…

linux安装tomcat_【实战演练】Linux操作系统07-用tomcat搭建网站

#本文欢迎转载,转载请注明出处和作者。实验环境:操作系统:CentOS6.5源码程序:JSPGOU(开源代码分享:https://www.jb51.net/codes/552125.html,侵权删除)tomcat:8.0.36数据…

IE无法打开internet网站已终止操作的解决的方法

用IE内核浏览器的朋友,或许不经意间会碰到这样滴问题:打开某个网页时,浏览器“嘣”跳出一个提示框“Internet Explorer无法打开Internet 站点...已终止操作”。而大多数情况下该页面甚至非常可能看起来已经载入完成,内容能够全然显…

一人网站所有的 ip地址_网站如何防御DDOS攻击?

分布式拒绝服务攻击(DDOS)是目前常见的一种网络攻击方法,它的英文全称是Distributed Denial of Service?简单的说,许多DoS攻击源一起攻击服务器,形成了DDOS攻击,从而增加拒绝服务攻击的威力。通常,攻击者通…

webp转换gif工具_好用资源、软件、工具、网站 | 第14期

内容均来自网络,版权归原作者所有,侵删,我们不生产资源,只是资源的搬运工,不要把所有的给予都习惯的当作理所当然。探记一款专注于个人记录的软件。多样化的记录模板,模块间可实现数据互通。随时随地记录日常、整理生活、收藏惊喜和感动支持iOS 和Android端&#xf…

php连接mysql制作网站的教程,MySQL与PHP的连接教程步骤(图文)

本篇文章我们介绍一下PHP与MySQL的整合,既然是与MySQL整合,那么我们首先肯定是要安装MySQL。下面我们就介绍下MySQL的安装方法。第一步,下载MySQL。下载PHP可以去PHP中文网下载站下载最新版本。第二步,安装MySQL数据库第三步&…

技术网站 --菜鸟教程

2019独角兽企业重金招聘Python工程师标准>>> 最近逛论坛时,发现一个比较好的网站,贴出来供大家分享 http://www.runoob.com/ 转载于:https://my.oschina.net/u/2312022/blog/523947

从零开始创建属于自己的网站(转)

准备域名 如果已经有域名的用户可以跳过这一步,如果没有的话可以在万网购买,.com等国际域名大约在39元/年,部分国内域名仅需要9元。准备服务器 如果已经有服务的用户也可以跳过这一步,如果没有的话可以选择购买阿里云的服务器。如…

python爬网站图片教程_python爬虫爬取图片的简单代码

Python是很好的爬虫工具不用再说了,它可以满足我们爬取网络内容的需求,那最简单的爬取网络上的图片,可以通过很简单的方法实现。只需导入正则表达式模块,并利用spider原理通过使用定义函数的方法可以轻松的实现爬取图片的需求。1、…

搭建web网站实验

完成实验要求 实验要求:用Linux系统搭建一个web网站 首先检查镜像文件是否导入 如果没有/dev/sr0目录下的镜像文件,检查VMvare右下角磁盘驱动器是否打开,如图第二个 将镜像文件挂载(mount)到虚拟机上 进入到“/etc…

java 抓取网站内容 异常code: 403

2019独角兽企业重金招聘Python工程师标准>>> HTTP 403命令是禁止恶意访问此网站,不能从此网站中抓取内容。如果是服务器端禁止抓取,那么这个你可以通过设置User-Agent来欺骗服务器: connection.setRequestProperty("User-Age…

java后端做教育视频网站源码_基于 Java Spring cloud的开源在线教育系统调试实战...

开篇之前分享过一个php的开源教育系统,今天来一个java的。知识付费的风口就不说了,大家都明白的。很多公司都在搞,今天继续来搞开源的。该系统采用前后端分离模式,前台采用vue.js为核心框架,后台采用Spring Cloud为核心…

apache对文件的读写权限_处理好网站的文件权限=保护好你额头的发际线!

是不是还在为处理不好网站的文件权限问题而日夜焦虑呢?其实刚开始在Linux服务器上建站的小伙伴们一定会对网站上不同用户的权限处理存在疑惑,那么就算为了你的发际线你也一定要看完本文。下面我们先来捋清这个问题的解决思路。首先我们来思考&#xff1a…

网页服务器站点是什么意思,网站服务器出错是什么意思_网站服务器出错原因...

网站服务器出错是什么意思网站服务器出错是指互联网数据中心中存放网站的服务器不能正常运行。网站服务器( WebsiteServer )是指在互联网数据中心中存放网站的服务器。网站服务器主要用于网站在互联网中的发布、应用,是网络应用的基础硬件设施。服务器软件&#xff…

服务器网页提示网站正在进行维护,运行“ll”命令提示命令找不到怎么解决_网站服务器运行维护,ll,找不到,命令...

怎么解决CentOS7忘记root密码的问题_网站服务器运行维护下面由centos系统教程​栏目给大家介绍CentOS7忘记root密码的处理方法,希望对需要的朋友有所帮助!如果在操作过程中发现无效,看看是不是自己在修改密码的时候小键盘没开启,因…

程序视频卡php,javascript - php做视频网站服务器很卡怎么办??

环境:php5.3.9Apache 22mysql5.6.xwindows使用做视频网站的时候碰到的几个问题(本地环境测试):A. 几十个视频。通过 canvas 截取视频第一帧做封面。// 视频源列表var vSrcList [src1 , src2 , src3 ....];// 队列方式截取视频第一帧(如果不采取队列方式…

Chrome 与 Firefox 警告用户不要在非 HTTPS 网站提交信息

谷歌和火狐浏览器正在采取新的措施让用户小心有安全漏洞的网站,在最新的更新版本Chrome 56和Firefox 51中,当用户在不安全的 HTTPS 网页中提交敏感信息时,就会收到警告。此前的测试版已经加入了此类警告,现在更新版本将使更大数量…

2021江苏高考孩子查询成绩视频,2021年江苏高考成绩查询网站查分网址:https://www.jseea.cn/...

【导语】高考结束后大家最为关心的问题就是在哪里查分,如何查分,无忧考网高考频道特别整理2021年江苏高考成绩查询查分网址,成绩公布时考生可直接点击网址进行查分,预祝大家都能顺利的考上理想的大学!由于,…

网页制作期末作业网站_网页设计公司制作网站应该具备哪些

网页设计是网络时代的新起物质,公司的经济效益怎么样很大程度上面也跟网站做得怎么样有关联。近期一两年开发网站的顾客是愈来愈多了,可以看出顾客对建站公司的规要求也逐渐提高。网页设计的目地是把排名转换为总流量,再把总流量转换为品质&a…

员工转正申请书_新员工试用期转正申请书(五篇)_转正申请书范文网站

新员工试用期转正申请书(一)尊敬的领导:我于 201X 年 X 月 X 日成为公司的试用员工,到今天 3 个月试用期已满,根据公司的规章制度,现申请转为公司正式员工。从来公司的第一天开始,我就把自己融入到我们的这个团队中&am…