VUE(SPA)项目中使用SEO-为搜索引擎爬虫提供服务

    在上一篇文章(VUE(SPA)项目中使用SEO-流程及原理分析)提到过,想要搜索引擎的爬虫过来可以爬取到你网站的内容需要用到

由于PhantomJS已不再维护,本篇文章将最新方法放到下方!!!

node.js、Nginx、PhantomJS(已经不维护,放弃)、puppeteer(代替PhantomJS)

    那么这篇文章将会详细的说一下它们的使用方法。(此处放一张图,帮大家回顾一下整个流程)

    利用Nginx就是用来区分这次请求是来自爬虫、还是用户,如果是用户就直接返回给页面就好了。

    这里 node.js 是做了个启动PhantomJS的作用,具体代码如下:

// server.js

// ExpressJS调用方式

var express = require('express');

var app = express();

var path = process.cwd();

// 引入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', [path + '/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:

                console.log('加载页面: '+ url);

                res.send(content);

                break;

        }

    });

});

app.listen(3000, function () {

  console.log('Spider app listening on port 3000!');

  console.log(path + '/spider.js')

});

利用这个node服务就可以调用到PhantomJS啦,PhantomJS的代码如下:

/*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);

    }

});

    这里面注释写的比较详细,可以看到这个文件实际上就是模拟一个浏览器窗口,从而获取到页面内容,这样爬虫来了,我们就把这个文件获取到的页面内容甩给它就行了。

    接下来进入测试阶段,先测试下PhantomJS是否OK  

$ phantomjs spider.js 'http://www.baidu.com'

如果见到在命令行里出现了一推html,那恭喜你,你已经征服PhantomJS啦。

一切都准备就绪之后,需要整体测试一次,可以用Postman这个工具发起测试




如果看到了你的内容,那么恭喜你,你已经征服它们啦。



2021.1.13日更新:

由于PhantomJS已不再维护,如果用PhantomJS抓一些普通的页面还可以用,但是抓SPA项目已经不好用了,下面推荐一个node爬虫工具(puppeteer)来替代PhantomJS

首先我们用npm来安装:

npm install puppeteer

然后将上面的PhantomJS服务改为node服务,代码如下:

var url = process.argv.splice(2)[0];

const puppeteer = require('puppeteer');

async function run(params) {

    const browser = await puppeteer.launch();

    const page = await browser.newPage();

    await page.goto(url, {

        waitUntil: 'load', // Remove the timeout

        timeout: 0

    });

    const html = await page.content();

    console.log(html);

    process.exit();

}

process.on('exit', function(code) {

    process.exit();

});

run();

然后再命令行工具中运行(如我的node.js文件名为spider.js):

 node spider.js http://xxxx.com

测试后会在命令行里输出爬取到的HTML文本。

还有一点要注意一下,别忘了把上面的启动命令改掉:

原:

child_process.spawn('phantomjs', [path + '/spider.js', url]);

改为:

child_process.spawn('node', [path + '/spider.js', url]);

如果有小伙伴遇到这篇文章相关的SEO的问题,可以随时私信我!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容