- 利用大量ssr科学上网节点实现动态切换节点,达到动态代理爬取数据的目的
缘由
最近在搞某网站数据,搜刮一些数据后就会弹出滑动验证码进行验证!换ip是最方便的解决方案,但是苦于囊中羞涩买不起高质量的高匿ip,也买不起adsl动态ip服务器。某天蹲坑突然想起,自己购买了大量的ssr科学上网节点呀,是否可以利用下!安装配置shadowsocks
命令行ssr客户端安装:点这儿看安装过程
这玩意安装完程序无法使用呀,因为他是socket通讯方式,要把它变成http代理可以使用上面教程里面的polipo也可以使用privoxyprivoxy安装教程在这
完整的运行环境已经搞成了个docker地址是这个:registry.cn-beijing.aliyuncs.com/icodebug/java8-python-ssr-privoxy:1.0
上代码
最后面有完整的demo代码链接
初始化节点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
public class BaseInitalizer {
private static List<Shadowsocks> ssrs = new ArrayList<>();
public BaseInitalizer() {
System.out.println("BaseInitalizer初始化信息!!!!!");
ShellUtil.setPrivoxyConfig();//项目启动的时候需要配置下privoxy的配置文件增加个转发配置 forward-socks5t / 127.0.0.1:1080 .
ShellUtil.startPrivoxy();//启动 privoxy 服务
initSsr();
}
/**
* 初始化ssr节点
*/
public void initSsr(){
if (ssrs.size()<1){/*todo 这里增加自己的ssr代理节点信息*/
ssrs.add(new Shadowsocks("xxx.xxx.com","1111","rc4-md5","1111"));
ssrs.add(new Shadowsocks("xxx.xxx.com","1111","rc4-md5","1111"));
ssrs.add(new Shadowsocks("xxx.xxx.com","1111","rc4-md5","1111"));
ssrs.add(new Shadowsocks("xxx.xxx.com","1111","rc4-md5","1111"));
}
}
/**
* 随机获取一个ssr节点(因为封ip隔段时间会解封所以这里随机获取)
* @return
*/
public static List<String> getSsrBash(){
if (ssrs.size()>0){
return ssrs.get(RandomUtils.nextInt(0,ssrs.size()-1)).getBash();
}
return null;
}
}
切换ssr节点,干掉ssr节点,测试当前代理ip地址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
("/ssr")
public class SsrController {
/**
* 测试当前的代理ip
* @param port
* @return
*/
public ResponseEntity test(Integer port){
port = port==null?8118:port;
try {
System.getProperties().setProperty("proxySet", "true");
Document document = Jsoup.connect("https://ip.gs").proxy(ShellUtil.getLocalIp(),port).ignoreHttpErrors(true).get();
String body = document.body().text();
return ResponseEntity.ok(body);
} catch (IOException e) {
e.printStackTrace();
}
return ResponseEntity.ok("");
}
/**
* 启动代理ip
* @return
*/
("/start")
public ResponseEntity start(){
ShellUtil.sslocalStart();
return ResponseEntity.ok("代理已启动");
}
("/kill")
public ResponseEntity kill(){
ShellUtil.sslocalStop();
return ResponseEntity.ok("干死了");
}
}
代码已经本地测试完工木有问题,需要注意的是代码使用前一定不要忘记自己添加些ssr节点。直接运行 build.sh 脚本自动把项目打包到docker里面启动项目。