前言
上次留了一些问题,现在我们来解决一下。
- 升级MongoDB驱动到官方版本
- 升级Actix-web到2.0
本文完整源码见GITHUB Repo: https://github.com/nintha/demo-myblog
more >>
OooOoops
上次留了一些问题,现在我们来解决一下。
本文完整源码见GITHUB Repo: https://github.com/nintha/demo-myblog
more >>
上次留了一些问题,现在我们来解决一下。
本文完整源码见GITHUB Repo: https://github.com/nintha/demo-myblog
more >>
本文介绍如何使用Actix-web和MongoDB构建简单博客网站。其中Actix-web 是一个高效的 HTTP Server 框架(Web Framework Benchmarks 上位居榜首),Mongodb是一个流行的数据库软件。
本文完整源码见GITHUB Repo: https://github.com/nintha/demo-myblog
more >>
最近了解到了vertx这个异步框架,但平时用的比较多的还是spring,出于好奇,尝试基于vertx web去实现spring mvc风格注解。
最终效果如下所示
1 | @Slf4j |
很多时候我们获取到了一些实时的二进制图片流(如摄像头),并希望可以在浏览器中实时查看,类似直播那样。
我们需要javacv,它封装了opencv,ffpmeg等一系列工具
build.gradle
1 | dependencies { |
思路是这样的,我们用javacv把二进制图片流转换成rmtp视频直播流,推送到媒体服务器,然后用客户端从媒体服务器获取直播流。
这里我使用的是livego,因为它使用起来比较简单,上行支持rmtp,下行支持rmtp/flv/hls。
rmtp格式可以使用VLC media player
播放器进行播放
flv格式可以配合flv.js
在浏览器中进行播放或使用VLC media player
播放器进行播放
hls格式可以使用VLC media player
播放器进行播放
Webp是Google推出的一种新型图片格式,相比于 传统的PNG/JPG图片有着更小体积的优势,在Web中有着广泛的应用。由于Webp格式推出比较晚, Jdk 内置的图片编解码库对此并不支持。
网上给出的Java环境解决方案往往需要手动在java.library.path
中安装对应的动态链接库,windows是dll文件,linux是so文件。这对于开发部署非常不方便。
本文提供一种无需手动安装动态链接库,同时可以方便处理Webp的解决方案
more >>本章会针对前面章节中不完善的地方进行补充说明。
之前的章节中,我们使用MongoDB进行存储数据,每当爬取一条记录就往数据库里写,虽然这样做也能实现我们所需要的功能,但在性能上还是会有或多或少的影响。聪明的同学肯定已经想到了,如果一条一条的写入数据库比较费力的话,那就爬取一批数据后再写入就好啦。
原来的代码:
1 | // ...other code |
save
方法的第一个参数不仅可以接受一个对象,也可以接受一个数组,类似这样:
1 | const array = [] |
其实语法上没有很大的区别,不过批量写入数据操作可以帮你的爬虫程序更加高效。
一般情况下,循环爬虫逻辑可以分为同步写法和异步写法。
同步写法如下所示:
1 | const main = async (MAX_ID) => { |
代码使用 async/await
进行控制逻辑流,让代码可以同步运行,代码逻辑非常清晰,也很方便debug,缺点是效率偏低,因为如果其中一次循环由于某种原因阻塞了,会影响后面逻辑的执行。
在完成前面章节后,的确可以去爬取很多数据了,但很多网站会对爬虫了流量进行限制,我们该如何去应对这些限制呢?
对于某些API对请求频率有一定的限制,我们可以手动控制请求的时间间隔,比如使用setInterval
函数可以进行定时执行代码,示例代码:
1 | // ...require something |
setInterval
详细语法可以参考这里
如果你对Nodejs比较熟悉的话,也可以尝试去使用ES8里的新语法async/await
,下面代码是一个简单的demo
1 | const sleep = (ms) => new Promise((suc,fail) => setTimeout(suc, ms)); |
输出如下:
1 | $ node index |
其中async
关键字放在函数前面声明这时一个异步函数,await
关键字会对Promise
进行阻塞,从而达到定时执行的效果; sleep
是我们自行封装的休眠函数,用Promise
对setTimeout进行封装,方便调用。
UA指的是HTTP请求头部的User-Agent
字段,是用来给服务器分辨请求来源浏览器型号用到的。很多服务器会对未知UA的请求进行限制,这个时候我们需要对UA进行伪装。
很多情况下,为了方便使用,我们习惯把数据存储在数据库中,本章将在前一章的基础上,加入保存数据到MongoDB的逻辑。
在开始前需要确保已经成功安装了MongoDB(localhost:27017)和完成前面的章节内容
为了方便Nodejs调用MongoDB,我们使用mongojs
这个第三方包,它可以让我们使用近似原生的MongoDB语法来处理数据,详细语法可以查看相关文档。
安装mongojs
:
1 | npm i mongojs --save |
我们再新建一个名为dao.js
的文件,里面将存放关于和MongoDB相关的逻辑,并键入以下代码:
1 | const mongojs = require('mongojs') // 引入mongojs包 |
dao.js
提供了三个方法供index.js
进行调用,同时我们需要修改index.js
的代码:
1 | const superagent = require('superagent') |
运行代码,顺利的话可以看到这样的输出:
1 | $ node index |
先检查一下我们需要准备的东西:
https://api.bilibili.com/x/web-interface/archive/stat?aid=26186448
如果你已经准备好了,在这一章我们会实现一个非常简单的爬虫。
爬虫的简化流程是这样的:
发送一个HTTP请求到目标服务器,服务器返回相应的数据
1 | +----------+ +-----------+ |
首先新建一个名为node-simple-spider
的文件夹,“发送一个HTTP请求”这个功能需要superagent
第三方库来实现,在文件夹node-simple-spider
下打开你的终端窗口,键入以下命令来安装superagent
的相关依赖:
1 | npm i superagent --save |
在文件夹里面创建一个名为index.js
的文件,用你最喜欢的编辑器打开它,键入以下内容
1 | const superagent = require('superagent') // 引入superagent包 |
然后在刚刚的终端窗口中键入以下命令运行这个程序:
1 | node index.js |
成功的话可以在终端看到以下输出
1 | $ node index.js |
这个Json就是我们所爬到的数据,里面包含了对应视频数据的播放数、弹幕数、回复、收藏等很多统计信息。
more >>
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true