前言
ss代理相信大家都不陌生了,不管是爬墙出去查资料,还是挂代理隐匿自己的真实ip,ss都成了首选方式。但是作为一个穷鬼,实在不舍得花几十块钱买一个稳定的ss代理服务器(现在只是偶尔查个资料用,感觉买一个并不是十分必要),所以一直使用网上提供的免费的ss账号,免费账号地址请戳 这里 。但是免费的账号也存在一些问题,一个是网络不太稳定,还有一个就是每六个小时换一次密码,需要手动去修改配置文件,重新开启代理服务。虽然每六个小时才需要改一次,但作为一个懒人,还是觉得太麻烦,于是写了个简单的爬虫,将抓到的账号密码直接更新到配置文件,并开启代理服务。
当然,如果你需要一个稳定的、可长期使用的ss,还是推荐拿钞票去换个账号。
环境
- linux系统
- 命令行版的shadowsocks
正常方式挂代理
首先要安装 shadowsocks ,archlinux下执行
sudo pacman -S shadowsocks
debain系执行
sudo apt-get install shadowsocks
然后
- 访问前言给出的免费的ss账号网站,记录下想要使用的ss代理账号和密码
- 修改 /etc/shadowsocks/config.json文件,将记录下的免费ss账号、端口、密码填入,格式如下
{ "server":"my_server_ip", "server_port":10000, "local_address": "127.0.0.1", "local_port":1080, "password":"mypassword", "timeout":300, "method":"aes-256-cfb", "fast_open": false, "workers": 1, "prefer_ipv6": false }
- 执行
archlinux:
sslocal -c /etc/shadowsocks/config.json
debain:
service shadowsocks restart
浏览器代理改为 socks5 ,127.0.0.1,1080 便可以访问被墙掉的网站。
爬虫编写过程
上面给出的正常情况下开启 sock5 代理的方法比较繁琐,我们写个简单的爬虫自动化这个过程。
首先,我们要抓取整个页面的内容,导入 urllib2 库,使用 urlopen() 函数打开网页。
from urllib2 import urlopenres = urllib2.urlopen('http://www.ishadowsocks.org') print res.read()
此时我们可以看到该网页的整页 html 源码,我们需要从获取到的源码内提取出关键的部分,也就是免费的账号密码部分,该部分源码如下:
<!-- Free Shadowsocks Section --> <section id="free"> <div class="container"> <div class="row"> <div class="col-lg-12 text-center"> <h3>实验帐号</h3> <hr class="star-primary"> </div> </div> <div class="row"> <div class="col-sm-4 text-center"> <h4>A服务器地址:a.iss.tf</h4> <h4>端口:1024</h4> <h4>A密码:00543226</h4> <h4>加密方式:aes-256-cfb</h4> <h4>状态:<font color="green">正常</font></h4> <h4><font color="red">注意:每6小时更换一次密码</font></h4> </div> <div class="col-sm-4 text-center"> <h4>B服务器地址:b.iss.tf</h4> <h4>端口:20000</h4> <h4>B密码:32459517</h4> <h4>加密方式:aes-256-cfb</h4> <h4>状态:<font color="green">正常</font></h4> <h4><font color="red">注意:每6小时更换一次密码</font></h4> </div> <div class="col-sm-4 text-center"> <h4>C服务器地址:c.iss.tf</h4> <h4>端口:10008</h4> <h4>C密码:</h4> <h4>加密方式:aes-256-cfb</h4> <h4>状态:<font color="green">正常</font></h4> <h4><font color="red">注意:每6小时更换一次密码</font></h4> </div> </div> <div class="row"> <div class="col-sm-12 text-center"> </br> <p><a href="http://www.shadowsocks8.net/" class="btn btn btn-info" target="_blank"> <i class="fa fa-paper-plane-o"></i> 更多帐号</a></p> </div> </div> </section>
高端的做法是使用正则表达式逐步匹配到该部分的关键内容,但是,懒惰的我们有更方便的选择,也就是使用 bs4 ,全称 Beautiful Soup ,它是 python 的一个库,它提供了简单的函数用来处理导航、搜索、修改分析树等功能,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的程序。首先安装bs4
sudo pip install BeautifulSoup4
在代码中导入bs4并使用它解析网页源码
from bs4 import BeautifulSoupsoup = BeautifulSoup(urlopen('http://www.ishadowsocks.org').read(),'html5lib')
其中 html5lib 是我之前安装的第三方的解析器,这里使用 python 标准库中的 html.parser 是一样的,只是 html5lib 的容错性好一点,尽管它比较慢。(使用 html5lib 需使用 pip 进行安装)
使用 find_all(class_='col-sm-4 text-center') 方式筛选出所有使用了该样式的块内的源码,由于首页上免费的账号有三个,所以使用 [:3] 切片的方式截取前三条数据(find_all 方法取出的内容为列表)。
soup.find_all(class_='col-sm-4 text-center')[:3]
上面的代码截取出的内容应该如下所示:
<div class="col-sm-4 text-center"> <h4>A服务器地址:a.iss.tf</h4> <h4>端口:1024</h4> <h4>A密码:00543226</h4> <h4>加密方式:aes-256-cfb</h4> <h4>状态:<font color="green">正常</font></h4> <h4><font color="red">注意:每6小时更换一次密码</font></h4> </div> <div class="col-sm-4 text-center"> <h4>B服务器地址:b.iss.tf</h4> <h4>端口:20000</h4> <h4>B密码:32459517</h4> <h4>加密方式:aes-256-cfb</h4> <h4>状态:<font color="green">正常</font></h4> <h4><font color="red">注意:每6小时更换一次密码</font></h4> </div> <div class="col-sm-4 text-center"> <h4>C服务器地址:c.iss.tf</h4> <h4>端口:10008</h4> <h4>C密码:</h4> <h4>加密方式:aes-256-cfb</h4> <h4>状态:<font color="green">正常</font></h4> <h4><font color="red">注意:每6小时更换一次密码</font></h4> </div>
两侧的 html 标签如何处理?没关系,我们循环输出列表出的每一条数据,使用 stripped_strings 方法进行处理(去掉多余的换行和提取 html 标签内的内容),再将提取出的内容逐条添加到一个新的空列表
message = [] for i in soup.find_all(class_='col-sm-4 text-center')[:3]: for j in i.stripped_strings: message.append(j)此时 message 列表的内容如下:
A服务器地址:a.iss.tf 端口:1024 A密码:08615258 加密方式:aes-256-cfb 状态: 正常 注意:每6小时更换一次密码 B服务器地址:b.iss.tf 端口:20000 B密码:56875323 加密方式:aes-256-cfb 状态: 正常 注意:每6小时更换一次密码 C服务器地址:c.iss.tf 端口:10008 C密码:72834677 加密方式:aes-256-cfb 状态: 正常 注意:每6小时更换一次密码
由于 config.json 文件中加密方式等都是固定的,所以每次只需要更新服务器地址、端口号、密码就可以了(如果服务器不变的话其实只需要更新密码)。先定义一个字典(windows 根据自己的配置文件可能字典内容略有不同)
iis = { "server":"my_server_ip", "server_port":10000, "local_address": "127.0.0.1", "local_port":1080, "password":"mypassword", "timeout":300, "method":"aes-256-cfb", "fast_open": false, "workers": 1, "prefer_ipv6": false }
如果想获取第一台服务器配置文件
iss.update({"server":message[0].split(":")[1].encode('ascii'),"server_port":int(message[1].split(":")[1]),"password":str(message[2].split(":")[1])})
如果想获取第二台服务器配置文件
iss.update({"server":message[7].split(":")[1].encode('ascii'),"server_port":int(message[8].split(":")[1]),"password":str(message[9].split(":")[1])})
如果想获取第三台服务器配置文件
iss.update({"server":message[14].split(":")[1].encode('ascii'),"server_port":int(message[15].split(":")[1]),"password":str(message[16].split(":")[1])})
引入 json 模块,将更新过的字典 iss 导出到配置文件
import jsonjson.dump(iss,open("config.json","w"))
最后将所有代码整合到一起,并引入 sys 模块,通过该模块处理脚本执行时传入的服务器号码(第几台服务器),以及 os 模块,用来执行系统命令。最终代码为
#coding=utf-8ofrom urllib2 import urlopen from bs4 import BeautifulSoup from os import system import json import sys
def main(number): iss = { "server":"", "server_port":None, "local_address":"127.0.0.1", "local_port":1080, "password":None, "timeout":300, "method":"aes-256-cfb", "fast_open":False, "workers":1 } try: soup = BeautifulSoup(urlopen('http://www.ishadowsocks.org').read(),'html5lib') message = [] for i in soup.find_all(class_='col-sm-4 text-center')[:3]: for j in i.stripped_strings: message.append(j) if number == 1: iss.update({"server":message[0].split(":")[1].encode('ascii'),"server_port":int(message[1].split(":")[1]),"password":str(message[2].split(":")[1])}) elif number == 2: iss.update({"server":message[7].split(":")[1].encode('ascii'),"server_port":int(message[8].split(":")[1]),"password":str(message[9].split(":")[1])}) elif number == 3: iss.update({"server":message[14].split(":")[1].encode('ascii'),"server_port":int(message[15].split(":")[1]),"password":str(message[16].split(":")[1])}) else: iss.update({"server":message[0].split(":")[1].encode('ascii'),"server_port":int(message[1].split(":")[1]),"password":str(message[2].split(":")[1])}) except Exception,e: print "[-]ERROR :" + str(e) json.dump(iss,open("config.json","w")) # windows 用户导出到 shadowsocks 代理软件所在目录,并改名为 gui-config.json system('sslocal -c config.json') # debain 用户使用 system('service shadowsocks restart') 开启服务。windows用户删掉这行
if __name__ == '__main__': if len(sys.argv) != 2: main(1) else: main(int(sys.argv[1]))
使用方法 st 执行下列命令获取第一台服务器配置并自动开启 socks5 代理
python getserver.py # 或者在末尾加数字 1
执行下列命令获取第二台服务器配置并自动开启 socks5 代理
python getserver.py 2
执行下列命令获取第三台服务器配置并自动开启 socks5 代理
python getserver.py 3
当输入数字大于3时默认取第一台服务器
作者: JenI 转载请注明出处,谢谢
Comments !