利用vps+nodejs爬虫实现国外软件的自动下载并且同步到百度网盘

​ 买了一个国外的vps作为ss的服务器使用,但是一个月有1000g的流量根本用不完.后来想到在国内有一些网站的内容下载超级慢体验贼屎(比如git),所以利用node写了一个小爬虫,下载指定网站的exe|zip|rar软件,并且自动同步到百度网盘,美滋滋.

我的百度网盘分享

密码:8g3a

软件列表
git
everything

github地址

vps系统为centos 6 x 64

node 版本9.x

教程开始

使用了cheerio 作为nodejs爬虫的框架,这是一个类似于jquery操作的框架,在这只是简单的使用.

每一步都写了注释,看不懂的话就直接用就可以了.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//引入内置request模块
const request = require('request');
//引入内置fs模块
const fs = require('fs');
//引入内置path模块
const path = require('path');
//引入cheerio模块,需要安装npm i cheerio -S
const cheerio = require('cheerio');
//需要下载的网站地址数组
let downloadWeblist=[
'http://www.voidtools.com/',
'https://git-scm.com/download/win'
];
//匹配后缀为exe,zip和rar的文件
let reg=/(\.exe|\.zip|\.rar)$/i;
//匹配最后一个/后面的内容作为名字
let reg2 = /([^/]+)$/;
// 判断有没有http/https
let reg3=/^(http)/;
//遍历所有需要下载的网站
for(let i=0;i<downloadWeblist.length;i++){
//起个名字
let nowDownload=downloadWeblist[i];
//利用renquest模块去访问要下载的网站
request(nowDownload,(...data) =>{
//访问成功
if (!data[0] && data[1].statusCode == 200) {
//网页加载完成后定义$,详情查看cheerio的api
$ = cheerio.load(data[2]);
//找到网页中所有的a标签
let result=$('a');
//遍历a标签
for(let i=0;i<result.length;i++){
//如果包含exe,zip或rar的后缀
if(reg.test(result[i].attribs.href)){
//设置名字
let name=result[i].attribs.href.match(reg2)[0];
//链接起个名字
let link=result[i].attribs.href;
//判断有没有http/https,如果有直接下载,没有加上下载网站的域名
if(reg3.test(link)){
try{
//下载到当前目录的download文件夹中,注意,没有这个文件夹会报错
request(link).pipe(fs.createWriteStream(path.join('./download',name)));
}catch(e){
//错误信息
console.log(`"${link}的${name}"下载失败.(╥╯^╰╥).错误信息:${e}`);
};
}else{
try {
//下载到当前目录的download文件夹中,注意,没有这个文件夹会报错
request(`${nowDownload}${link}`).pipe(fs.createWriteStream(path.join('./download',name)));
} catch (e) {
//错误信息
console.log(`"${nowDownload}${link}的${name}"下载失败.(╥╯^╰╥).错误信息:${e}`);
};//这
};//就是
};//传说中的
};//回调
};//地狱
});//吗
};//?

可以先在本地试一下可不可以.

新建在同级目录下新建download文件夹,执行文件

1
node app

如果download文件夹下出现文件的名字了表示下载成功,可以按ctrl+c 取消,如果没出现查看错误信息.

然后在服务器中安装nodejs,因为我是centos系统,所以使用yum安装

  • 获取nodejs 资源

    1
    curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
  • 安装

    1
    yum install -y nodejs
  • 测试是否安装成功

    1
    node -v 

    出现版本号则安装成功

  • 如果node版本比较低,可以使用n 模块升级

  • 全局安装n

    1
    npm install n -g
  • 升级到最新版

    1
    n latest
  • 升级完成后断开vps 重新连接**(不是重启)**,查看是否升级成功

    1
    node -v

    nodejs 安装完成以后把文件上传到服务器,个人感觉FlashFXP 挺好用,带ui 界面

然后在服务器执行node app 看看是否能下载到vps 里**(别忘了在同级目录新建download文件夹)**

———————————-我是分割线———————–

现在已经可以成功的把文件下载到vps 里面了,接下来就需要上传到百度云了,在这用的是bpcs_uploader 插件,作者网站,作者博客

bpcs_uploader安装和使用

  1. 首先安装php

    1
    yum install php
  2. 把项目clone到vps

    1
    git clone https://github.com/oott123/bpcs_uploader.git
  3. 为脚本添加权限

    1
    2
    cd bpcs_uploader
    chmod +x bpcs_uploader.php
  4. 初始化脚本

    1
    ./bpcs_uploader.php quickinit 

这个时候终端会询问你是否初始化,输入Y,然后会打印出许多文字,其中包括授权码。

在浏览器中访问百度授权申请。输入授权码,确定,成功后返回终端按回车键,看到屏幕上打印出了你百度网盘的容量,证明初始化完成。

完成以后就可以尝试同步一下,看看是否可以把vps的文件同步到百度网盘.

1
2
3
4
5
6
7
8
9
10
11
12
//上传:
./bpcs_uploader.php upload [path_local] [path_remote]
//举例:./bpcs_uploader.php upload /root/test.txt /test/test.txt 则本地root目录下的test.txt文件会上传到百度云/我的应用数据/bpcs_uploader/test目录下

//下载:
./bpcs_uploader.php download [path_local] [path_remote]

//删除文件:
./bpcs_uploader.php delete [path_remote]

//离线下载:
./bpcs_uploader.php fetch [path_remote] [path_to_fetch]

可以同步以后就需要实现自动化了,使用命令只能手动同步,并且必须输入文件名,那么可以写一个shell脚本来完成同步.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
# 执行node爬虫把文件下载到服务器
`node app`
# 上传到百度云盘的根目录
baidupan_DIR="/myVPS"
function searchFile(){
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
ergodic $1"/"$file
else
local path=$1"/"$file
#local name=$file
#local size=`du --max-depth=1 $path|awk '{print $1}'`
#echo $name $path $size
#可以得到文件的名称,路径和大小,路径包含名称
/root/bpcs_uploader/bpcs_uploader.php upload $path $baidupan_DIR/$path
fi
done
}
#这个必须要,否则会在文件名中有空格时出错
IFS=$'\n'
#这里是你要批量上传文件的路径
searchFile "/usr/syncdir/download"
exit 0

可以把以上代码复制以后存为.sh 文件进行执行,但是需要注意,如果在windows下编辑并保存以后再vps上执行会报错,使用vi 打开会发现行尾有^M 字符,所以需要去掉.

1
vi -b upload.sh

打开文件后执行以下代码

注意!下面的^M不是直接打出来的,而是ctrl+vctrl+m

1
:%s/^M//g

替换完成后使用:wq保存保存并退出.

再次执行sh文件

1
./upload.sh

查看是否可以在百度云同步成功.

爬虫有了,文件批量同步百度网盘有了,就差最后一步自动化了,可以使用crontab 进行定时任务.

执行:

1
2
service crond status
//查看crond是否为开启状态

其他操作:

1
2
3
4
5
service crond start    //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看服务状态

执行

1
crontab -e

使用vi输入:

1
0 2 * * 1 /你的路径/upload.sh

以上的意思为每周一的凌晨2点执行upload.sh 脚本一次

然后按下esc,输入:wq保存并退出

为了保险起见可以重启一下进程:

1
service crond restart  //重启服务

DONE

当然如果没用明白没关系,你可以留言给我需要下载的外网资源,我来添加到爬虫里,然后可以使用我的百度网盘分享进行下载.

密码:8g3a.

作者

刘念

发布于

2018-07-11

更新于

2021-02-21

许可协议

评论