Puppeteer Socks5 代理

接上一篇的主题,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 还需要安装一些依赖才可以启动,包括启动时需要加入一些参数才可以。

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就可以翻墙了。

 const browser = await puppeteer.launch({
    args: [ '--no-sandbox', '--disable-setuid-sandbox', '--proxy-server=socks5://127.0.0.1:1080' ],
});

Ubuntu 安装 Shadowsocks

参照这篇文章 Ubuntu 安装 Shadowsocks

抓取内容

至此,我们的 Puppeteer 应该可以访问任何网站了,后面需要做的就是对网站进行分析,以及如何将图片资源下载到本地。

获取文章内容

const titleHandle = await page.$('#posts li h2 a');

const title = await page.evaluate(
    title => title.textContent, titleHandle
);

await titleHandle.dispose();

以此类推,就可以拿到图片,发布时间,文章概要。

下载文章图片,保存到本地,由于网络原因,所以图片也要存下来。

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