接上一篇的主题,Q-Npm 插件中想要定时获取 Npm 官方 Blog 的最新动态。
难点
- 网络被墙
分析
由于后端是 EggJs 自带了定时任务,所以我只需要关心如何获取并解析 Npm Blog 的内容。
刚开始我是打算定时抓取 Twitter 上的 Npm 账号资讯的,由于申请 Twitter 开发者账号失败,我尝试用 Puppeteer 抓取内容,但是 Twitter 的 Dom 结构没有明显的规律可循因此我放弃了。于是转而 Rss 的套路,但是调研了第三方的 Rss 输出的内容不是很理想,这个方案也放弃。
那么 Npm Blog 的内容呢? 为了保证时效性,我翻阅了当时 event-stream 事件 Npm 官方的通报,Blog 和 Twitter 的发布时间基本同步,Blog 还给出了分析文章。所以我将信息获取来源放到了 Blog 上。
最后我采用了 Puppeteer 定时抓取 Npm Blog 的方式。
实施
安装 Puppeteer
第一步当然是在 Ubuntu 上安装 Puppeteer, 由于网络原因,通过设置 .npmrc
的方式使用淘宝的镜像进行加速
registry=https://registry.npm.taobao.org/
disturl=https://npm.taobao.org/dist
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
profiler_binary_host_mirror=https://npm.taobao.org/mirrors/node-inspector/
fse_binary_host_mirror=https://npm.taobao.org/mirrors/fsevents/
第二部,Linux 下的 Puppeteer 还需要安装一些依赖才可以启动,包括启动时需要加入一些参数才可以。
代码语言:javascript复制RUN apt-get update -y -q
RUN apt-get install -y -q xvfb libgtk2.0-0 libxtst6 libxss1 libgconf-2-4 libnss3 libasound2
代码中加入启动参数,添加 SOCKS5 代理,利用后面安装的小飞机,Puppeteer就可以访问国外网站了。
代码语言:javascript复制 const browser = await puppeteer.launch({
args: [ '--no-sandbox', '--disable-setuid-sandbox', '--proxy-server=socks5://127.0.0.1:1080' ],
});
Ubuntu 安装 Shadowsocks
参照这篇文章 Ubuntu 安装 Shadowsocks
抓取内容
至此,我们的 Puppeteer 应该可以访问任何网站了,后面需要做的就是对网站进行分析,以及如何将图片资源下载到本地。
获取文章内容
代码语言:javascript复制const titleHandle = await page.$('#posts li h2 a');
const title = await page.evaluate(
title => title.textContent, titleHandle
);
await titleHandle.dispose();
以此类推,就可以拿到图片,发布时间,文章概要。
下载文章图片,保存到本地,由于网络原因,所以图片也要存下来。
代码语言:javascript复制const viewSource = await page.goto(imageUrl);
fs.writeFile(`./app/public/${name}`, await viewSource.buffer(), function(err) {
if (err) {
return console.log(err);
}
console.log('The file was saved!');
});
最后,把这些内容都一一落库,整个功能就 Ok 了,有兴趣的可以自己实践一下。
参考
Puppeteer install issues