前言
每次使用 shadow#socks 时都要更改密码(用的免费s#s账号,每6小时换次密码),打开网站再复制粘贴也挺费劲的,正好今天没事,就想写个爬虫自动把密码抓下来复制到剪贴板,我直接粘贴就好。
想着 jQuery 对 HTML 的 DOM 树操作挺方便的,就搜了下 python 相关的库,看有没关于 DOM 的,没想到还真有——PyQuery,而且语法与jQuery几乎相同。cool~~
那么,目标就很明确了:
- 工具:python & PyQuery;
- 功能:抓取 ss 密码,并把目标密码自动复制进剪贴板;
- 附加:选择 ss 地址,1 – 美国,2 – 日本,3 – 新加坡;
关于 PyQuery 的安装与使用方法,在另一篇文章中介绍,本篇只说这个小爬虫。
过程
这个爬虫很简单,思路很清晰,就是获取网页,使用 pyquery 在 HTML 中把 3 个密码抓出来,并把选择的目标密码复制进剪贴板中。
首先查看目标网站的网页源码,锁定我们所需要的目标信息—— s#s 密码的位置,可以发现账号信息都在 id 为 #free 的<section> 中:
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 | <!-- 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.ssx.host</h4> <h4>端口:1024</h4> <h4>A密码:03005590</h4> <h4>加密方式:aes-256-cfb</h4> <h4><a data-toggle="modal" data-target="#qr01" href="#">二维码</a></h4> <h4><font color="red">注意:每6小时更换一次密码</font></h4> </div> <div class="col-sm-4 text-center"> <h4>B服务器地址:b.ssx.host</h4> <h4>端口:10008</h4> <h4>B密码:07078148</h4> <h4>加密方式:aes-256-cfb</h4> <h4><a data-toggle="modal" data-target="#qr02" href="#">二维码</a></h4> <h4><font color="red">注意:每6小时更换一次密码</font></h4> </div> <div class="col-sm-4 text-center"> <h4>C服务器地址:c.ssx.host</h4> <h4>端口:10008</h4> <h4>C密码:34649908</h4> <h4>加密方式:aes-256-cfb</h4> <h4><a data-toggle="modal" data-target="#qr03" href="#">二维码</a></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> |
那么,接下来就是获取这段代码,并把所需要的 3 个密码取出来。
获取 id 为 #free 的代码段:
1 2 3 4 | url = 'http://www.ishadowsocks.mobi/' data = urllib2.urlopen(url).read().decode('utf-8') d = pq(data) content = d('#free') |
取出密码,因为密码在 <h4> 标签中,又没有 id 或者 class 等特殊标识,可以使用正则取出它们,既然用了pyquery,就干脆直接使用其 .eq(index) 好了,通过给定的索引号得到指定元素,3 个密码的索引也很好看出来:2,8,14:
1 2 3 | keyA = content('h4').eq(2).html() keyB = content('h4').eq(8).html() keyC = content('h4').eq(14).html() |
有 3 个地址的 ss,我们只要选一个使用就够了,再增加一个选择功能,python 中没有 switch ,这里可以用字典替代实现:
1 2 3 4 5 6 | value = {'1': keyA[4:], '2': keyB[4:], '3': keyC[4:]} info = '1: USA\n2: JP\n3: SG\n' choice = raw_input(info) key = str(value[choice]) print key |
到这里就可以把所需密码抓下来了,还要把所选密码自动复制到剪贴板:
1 2 3 4 5 6 7 8 | import win32clipboard as w import win32con def setText(aString): w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_TEXT, aString) w.CloseClipboard() |
完整代码:
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 | # -*- coding: utf-8 -*- from pyquery import PyQuery as pq import urllib2 import win32clipboard as w import win32con #import sys #type = sys.getfilesystemencoding() # 获得系统的默认编码 def setText(aString): w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_TEXT, aString) w.CloseClipboard() def getKey(): url = 'http://www.ishadowsocks.mobi/' data = urllib2.urlopen(url).read().decode('utf-8') d = pq(data) content = d('#free') keyA = content('h4').eq(2).html() keyB = content('h4').eq(8).html() keyC = content('h4').eq(14).html() value = {'1': keyA[4:], '2': keyB[4:], '3': keyC[4:]} #print keyA + '\n' + keyB + '\n' + keyC #print value info = '1: USA\n2: JP\n3: SG\n' choice = raw_input(info) key = str(value[choice]) #print key return key if __name__ == '__main__': setText(getKey()) |