用SS+Privoxy+树莓派让Node爬虫翻墙

前言

之前一直想要做一个feed读取器,并利用feed获取的链接去抓取资讯全文。然而有一些feed需要科学上网才能获取,这就让我萌生了:如何让Node科学上网来进行爬虫抓取。

查阅了资料发现,Node的http模块本身带有一个Proxy代理功能,除此之外,没有科学上网的本领。而我已经买了一年的shadowsocks账号,是不是可以把这两者结合一下?

不过这里有一个需要解决的问题:两者通讯协议不同

shadowsocks使用的协议是socks,而proxy所发出的代理是http协议,要让两者能够通讯,就要使用Privoxy,Privoxy是一个轻量的代理服务器,与之相似的还有Squid等,不过Privoxy比较简单易用。

文章信息

  • 时间 / 2017年4月30日

准备

硬件

树莓派。我使用树莓派3B作为代理服务器,你也可以用自己的本机做服务器,只不过不像树莓派可以一直24小时开机,毕竟有些爬虫抓取需要费时很久。

软件

  • Shadowsocks
  • Privoxy

步骤

安装Shadowsocks

首先安装python,然后再安装shadowsocks

1
2
sudo apt-get install python-pip
sudo pip install shadowsocks

安装完成后,我们要对shadowsocks进行配置,选择一个自己喜欢的文件夹,创建一个json配置文件:

~/conf.json

1
2
3
4
5
6
7
8
9
{
"server": "ss服务商的地址",
"server_port":"ss服务商的端口",
"local_address":"127.0.0.1",
"local_port":1080,
"password":"ss服务商的密码",
"timeout":600,
"method":"AES-256-CFB"
}

说明:

  • server 是ss服务商提供的域名或者IP地址;
  • server_port 是ss服务商提供的端口号;
  • password 是ss服务商提供的密码;
  • method 是ss服务商提供的加密方式
  • local_address 是本地的代理地址,127.0.0.1代表本机地址;
  • local_port 代表本地代理端口
  • 其他的请按照上述默认填写即可

接下来,我们要打开Shadowsocks服务:

1
2
3
4
5
6
sudo sslocal -c ~/conf.json -d stop #结束Shadowsocks
sudo sslocal -c ~/conf.json -d start #开启Shadowsocks
#如果开启成功,会显示:
INFO: loading config from conf.json
INFO loading libcrypto from libcrypto.so.1.0.0
started

安装Privoxy

1
sudo apt-get install python-pip privoxy

安装完成后,我们要对Privoxy进行详细的配置,打开配置文件/etc/privoxy/config

我们可以看到目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
config #需要修改
default.action
default.filter
match-all.action
pac.action #需要修改
templates
trust
user.action
user.filter
# 执行以下命令:
sudo nano config
#修改一下两行(文件比较长,要耐心寻找):
listen-address 192.168.1.163:8118
forward-socks5 / 127.0.0.1:1080 .
# 把以上两行前面的#去掉,并修改参数,
# 第一行代表Privoxy服务开启的服务端口
# 因为我的树莓派在路由器中已经绑定成固定的IP地址:192.168.1.163
# 所以我填写这个
# 8118代表Privoxy端口号,可以随意填写,
# 不要与现有的一些端口冲突即可
# 第二行代表是Shadowsocks的端口号
# 填写的就是上述Shadowsocks的本地配置端口
# 记住后面有一个(.)

接着我们要对PAC策略做一些调整

1
2
3
4
5
6
7
# 执行以下命令
sudo nano pac.action
# 这里是科学上网的一些策略配置,可以看到已经有一些规则在里面,只需要在最后添加你需要科学上网的域名即可。
{shadowsocks}
google.com
facebook.com

最后我们需要开启Privoxy

1
2
3
4
5
sudo /etc/init.d/privoxy start
# 当你重新修改了conf或者pac.action,需要重新开启:
sudo /etc/init.d/privoxy restart
# 停止服务
sudo /etc/init.d/privoxy stop

有能力的同学可以自己去查阅Privoxy官网文件

验证端口

在完成了上述的操作后,我们需要先验证一下各个服务的情况

1
2
3
4
5
6
7
8
9
10
11
12
# 验证Shadowsocks
netstat -an | grep 1080
# 1080是Shadowsocks服务的端口号
# 如果出现以下,则说明服务正常
tcp 0 0 127.0.0.1:1080 0.0.0.0:* LISTEN
udp 0 0 127.0.0.1:1080 0.0.0.0:*
# 验证Privoxy
netstat -an | grep 8118
# 8118是Privoxy服务的端口号
# 如果出现以下,则说明服务正常
tcp 0 0 192.168.1.163:8118 0.0.0.0:* LISTEN

开启树莓派的防火墙

完成了上述的操作,只能保证树莓派本身能够科学上网,但如果同一个局域网发送代理,并不能成功,因为树莓派有一个内置的防火墙。

1
2
3
4
5
6
7
8
9
# 查看防火墙状态
sudo ufw status
# 如果未出现服务,则说明没有安装,可以不用看后面的操作
# 允许外部访问8118端口
sudo ufw allow 8118
# 建议:开启允许所有来自局域网的请求
sudo ufw allow from 192.168.0.0/16

至此,应该能够通过8118端口进行访问了。

你可以在safari或者chrome的代理中加入

  • 地址:192.168.1.163
  • 端口:8118

就可以科学上网了。

当然我们的教程还有最后一步,就是让Node请求能够科学上网。

Node的Proxy代理

这里我使用了request模块

1
2
3
4
5
6
7
8
9
10
11
12
13
var request = require('request'),
url = 'http://www.test.com',
proxy = {
url:url,
proxy:'192.168.1.163:8118'
};
request(proxy,function(error, response, body){
if(response && response.statusCode===200){
console.log(body);
}else{
console.log(response.statusCode);
}
});

关于我