一、安装PhantomJS

安装文章:https://www.cnblogs.com/robots2/p/17340143.html

二、编写脚本spider.js

// spider.js
'use strict'; console.log('=====start====='); // 单个资源等待时间,避免资源加载后还需要加载其他资源
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 spider.js 'www.baidu.com'

三、做成node服务,编写server.js

// server.js
// 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;
}
}); }); app.listen(3000, function () {
console.log('Spider app listening on port 3000!');
});

测试脚本node server.js

运行稳定后可后台运行node服务:nohup node server.js &

四、修改nginx配置,使得常建的爬虫跳转到该node服务上

upstream spider_server {
server localhost:3000;
} server {
listen 80;
server_name example.com; 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; if ($http_user_agent ~* "Baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator|bingbot|Sosospider|Sogou Pic Spider|Googlebot|360Spider") {
proxy_pass http://spider_server;
}
}
}

测试收录的url

curl 'https://www.baidu.com/#/page/2210574586898432' -H 'User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)'

参考文章:https://juejin.cn/post/7033661909756968973

使用PhantomJS解决VUE项目无法被百度收录的更多相关文章

  1. 如何解决vue项目中 scss 不支持 scoped 的 /deep/ 穿透写法

    如何解决vue项目中 scss 不支持 scoped 的 /deep/ 穿透写法 用过vue的人估计都用过scoped样式属性,但有时候需要穿透样式,啥办? 很多资料都说用>>> 或 ...

  2. 如何在vue项目中使用百度编辑器ueditor

    百度编辑器官方并没有提供vue项目使用说明,目前网上也有不少人实现了相关功能,这里就不再重复,只是针对自身项目碰到的情况做个记录,就当是熟悉了一遍富文本编辑器的代码结构. 按照网上的做法,基本可以实现 ...

  3. vue项目中使用百度统计

    统计有多少人访问了自己的网站(wap端pc web端都适用),或者更细的统计网站每个页面的访问量,可以使用百度统计 百度统计传送门 按提示注册登录即可 登录后-->管理-->新增网站,配置 ...

  4. 解决 VUE项目过大nodejs内存溢出问题

    今天在启动vue项目的时候报了这样一个错误, 如图所示:频繁出现此种情况,项目太大,导致内存溢出,排除代码问题外,可参照以下方式解决 // 全局安装increase-memory-limit npm ...

  5. 解决Vue项目打包之后放到nginx下刷新就报错404的问题

    最近跟着某机构的教学视频敲了一遍vue项目,但是在windows环境下部署的时候就懵逼了放到nginx下正常跑没问题,但是刷新之后就报404错误 前端项目构建vue 脚手架版本 是@vue/cli 4 ...

  6. 解决vue项目中遇到父组件的按钮或操作控制重新挂载子组件但是子组件却无效果的情况

    在vue项目中终会遇到需要父组件的按钮或操作控制重新挂载子组件的需求,我在新项目中就遇到这种需求.真实场景是父组件的早,中,晚三个按钮(代表三个时间段)来控制子组件的table表格列的动态加载. 子组 ...

  7. vue项目中添加百度地图功能及解决遇到的问题详解

    第一步,在百度地图开放平台 申请密钥 (如果有密钥可以省略此步骤,朋友有也可以借) 地址:http://lbsyun.baidu.com/ 第二步,创建应用并填写表单(下面链接可参考) http:// ...

  8. vue案例 - vuex+sessionstorage解决vue项目刷新后页面空白/数据丢失

    第一部分 SessionStorage 首先查看sessionStorage的地方在控制台的 Application > Storage > Session Storage这里: 根据se ...

  9. 解决vue项目eslint校验 Do not use 'new' for side effects 的两种方法

    import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ el: '#app' ...

  10. vue项目中使用百度地图的方法

    1.在百度地图申请密钥: http://lbsyun.baidu.com/  将 <script type="text/javascript" src="http: ...

随机推荐

  1. Python之pandas操作

    中文网:https://www.pypandas.cn/ Pandas 是 Python 的核心数据分析支持库,提供了快速.灵活.明确的数据结构,旨在简单.直观地处理关系型.标记型数据.Pandas ...

  2. word 文档签章控件生成的签章批量删除

    某个签章工具的word插件缺少批量插入签章的功能.同时,发现在投标工具中可以使用导出生成pdf时批量签章的功能.现在需要移除先前手动操作生成的多个签章,有如下发现-- 1.对少量签章,可以先选中签章右 ...

  3. 开源 - Ideal库 - Excel帮助类,设计思路(一)

    今天开始和大家分享关于Excel最长常用操作封装. 01.起因 市面上有很多Excel操作库,这些库设计之初的目标是提供对Excel的各种操作功能,包括数据.样式.公式.图表等等.而对于我们平时开发来 ...

  4. idea properties文件乱码解决

    ​java文件是好的,但是遇到properties文件,默认就成了iso制式乱码了. 虽说不影响程序执行,但是看起来真的让人心烦. 问题点是出在properties文件是GBK的,需要单独设置一下. ...

  5. R数据分析:cox模型如何做预测,高分文章复现

    今天要给大家分享的文章是 Cone EB, Marchese M, Paciotti M, Nguyen DD, Nabi J, Cole AP, Molina G, Molina RL, Minam ...

  6. Flutter 滑动组件互相嵌套问题

    滑动组件互相嵌套问题 如果listview/singlechildscrollview 嵌套gridview,将两个组件的shrinkwrap设置为true,并且gridview无法滚动 physic ...

  7. nginx jupyterWeb

    location /jupyterWeb/ { add_header X-Frame-Options SAMEORIGIN; add_header Access-Control-Allow-Origi ...

  8. How To Install and Enable SSH Server on Debian 10

    https://devconnected.com/how-to-install-and-enable-ssh-server-on-debian-10/ How To Install and Enabl ...

  9. 完美解决idea2020一直indexing,无法操作的问题

    hello,大家好,2021年的第一篇文章,希望疫情早日过去,大家早日恢复正常生活. 今天主要分享一下在使用idea 2020.3版本开发maven项目的时候,一直出现有效件index, 有时候是sc ...

  10. win10家庭版升级到专业版密钥

    J7QT3-3GCPG-9GVWT-CH2XR-GMRJM