Python 学习之 爬虫应用

使用Python实现一键爬取免费ss帐号

Posted by JenI on 2016-11-11 00:00:00+08:00

前言

ss代理相信大家都不陌生了,不管是爬墙出去查资料,还是挂代理隐匿自己的真实ip,ss都成了首选方式。但是作为一个穷鬼,实在不舍得花几十块钱买一个稳定的ss代理服务器(现在只是偶尔查个资料用,感觉买一个并不是十分必要),所以一直使用网上提供的免费的ss账号,免费账号地址请戳 这里 。但是免费的账号也存在一些问题,一个是网络不太稳定,还有一个就是每六个小时换一次密码,需要手动去修改配置文件,重新开启代理服务。虽然每六个小时才需要改一次,但作为一个懒人,还是觉得太麻烦,于是写了个简单的爬虫,将抓到的账号密码直接更新到配置文件,并开启代理服务。

当然,如果你需要一个稳定的、可长期使用的ss,还是推荐拿钞票去换个账号。

环境

  • linux系统
  • 命令行版的shadowsocks

正常方式挂代理

首先要安装 shadowsocks ,archlinux下执行

sudo pacman -S shadowsocks

debain系执行

sudo apt-get install shadowsocks

然后

  1. 访问前言给出的免费的ss账号网站,记录下想要使用的ss代理账号和密码
  2. 修改 /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
    }
    
  3. 执行
    archlinux:
    sslocal -c /etc/shadowsocks/config.json
    

    debain:
    service shadowsocks restart
    

浏览器代理改为 socks5 ,127.0.0.1,1080 便可以访问被墙掉的网站。

爬虫编写过程

上面给出的正常情况下开启 sock5 代理的方法比较繁琐,我们写个简单的爬虫自动化这个过程。

首先,我们要抓取整个页面的内容,导入 urllib2 库,使用 urlopen() 函数打开网页。

from urllib2 import urlopen

res = 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 BeautifulSoup

soup = 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 json

json.dump(iss,open("config.json","w"))

最后将所有代码整合到一起,并引入 sys 模块,通过该模块处理脚本执行时传入的服务器号码(第几台服务器),以及 os 模块,用来执行系统命令。最终代码为

#coding=utf-8  

from 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]))

o

使用方法 st 执行下列命令获取第一台服务器配置并自动开启 socks5 代理

python getserver.py # 或者在末尾加数字 1

执行下列命令获取第二台服务器配置并自动开启 socks5 代理

python getserver.py 2

执行下列命令获取第三台服务器配置并自动开启 socks5 代理

python getserver.py 3

当输入数字大于3时默认取第一台服务器


作者:   JenI   转载请注明出处,谢谢


Comments !