美文网首页爬虫专题
python——刷票脚本

python——刷票脚本

作者: lan_ha | 来源:发表于2017-06-01 22:58 被阅读0次

    前言

    现在部分比赛为了推广赞助商或者比赛本身,需要参赛队伍进行网上拉票,甚至票数还会占一定比例的成绩。因此,刷票也就应运而生了。此次我们团队参加一个比赛,就需要网上投票决出前几名,作为一位技术人员,当然是得“解决”技术能解决的问题嘛,所以就写了个刷票插件来刷一刷。

    原理

    刷票的原理很简单,就是相当于模拟人登录网站去投票,只是把这个过程程序化,让程序代替人到网站去投票。具体一点说把,首先是客户端(我们)发出请求(Request)给服务端(投票网站),跟他们说,我们需要看他们网站的信息,然后服务端就会回复(Respose)我们,我们再把填好的表单发给他们(Request),他们收到后就会回复我们(Respose)。

    主要内容

    • 分析网站
    • 表单提交
    • 构造代理IP池

    1. 分析网站

    由于每个网站需要提交的信息都不一样,那么首先我们需要对目标网站进行相对应的分析,找出他们的表单接口(也就是URL或者叫网址)以及我们需要提交的信息。

    1.1 收集信息

    首先我们登录目标网站

    目标网站

    使用F12,打开审核元素,点击Network,真实地进行一次表单提交

    框住的两个内容就是我们需要知道的一部分表单信息

    • Request URL:请求网址,我们提交的信息就是传到这个url里面去
    • Request method:请求方法,我们提交的方法
    表单信息1

    下面有两个框分别框住两个不同的信息区域,具体有什么用呢?下面就来详细解释一下这个

    • Request Headers:请求头,当我们访问网站的时候,我们都需要提交一个请求头过去,以证明我们不是爬虫,而是真实的访问,所以我们要把这个拿到,以便假装我们不是爬虫。
    • From Data:这就是我们要提交的数据了,现在提交的数据都是以json格式提交,按照这些信息写好我们需要提交的json数据就好
    表单信息2

    以上就是需要获得的基本信息,根据这些信息我们就可以编写刷票插件了,但作为一个对自身有高标准严要求的程序员来说,仅仅这样就足够吗?当然不会啦,我们得找一找这个提交过程有没有什么漏洞。

    怎么找?分析源代码,找了找,果真还让我找到了!


    表单漏洞

    看出什么没有,它这里有两个致命的漏洞:

    1. 它允许提交3支或3支以上的队伍,并且没有限制最大数量,只限制了最少数量。
    2. 它没有进行相同数据的筛选。

    意思就是说,我们可以一次提交几百上千个,甚至上万个==相同的==数据。但我会这么做吗?考虑到后果的话肯定不会,因为没有人可以在很短时间内投很多票,要是他们追查起来,那发现还不简单?毕竟我们是在模拟真实投票嘛,所以就投3票给自己好了,隐藏功与名。

    2. 表单提交

    好了,既然把收集到的数据都整理好了,那么就开始写代码进行表单提交了。

    2.1 运用到的库

    • requests:非常好用的第三方库,用于表单提交

    Requests库官方技术文档

    把它看一遍,所有操作就没问题了,下面就来写代码吧!

    2.2 构造表单信息

    拿着这个代码就能去投票啦,开不开心?

    # 请求头信息
    headers = {
        'Accept': '*/*',
        'Accept-Encoding': 'gzip',
        'Accept-Language': 'zh-CN',
        'Connection': 'keep-alive',
        'Content-Length': '16',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Host': 'www.dingnf.com',
        'Origin': 'http://www.dingnf.com',
        'Referer': 'http://www.dingnf.com/active/wxws_s',
        'User-Agent': 'Mozilla/4.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.3029.110 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
    }
    
    # post表单网址
    url = "http://www.dingnf.com/active/wxws_t"
    params = {'ids': ['22', '22', '22']}
    r = requests.post(url=url, data=params, headers=headers, proxies=proxies)
    

    突然发现问题来了,只能提交一次!这是为什么?

    3. 构造代理IP池

    大部分投票网站都会记录投票的IP地址,避免同一个IP多次投票,那怎么办?我们能模仿真实投票,还换不了IP地址?换IP地址是可以的,不过比较麻烦,我们有一种更加简便的方法:使用代理服务器去爬去某个网站的内容,那对方网站上显示的就不是我们真实的IP地址了,而是代理服务器的IP地址,在python中,使用代理服务器设置很简单。

    3.1 找到代理IP

    这里推荐西刺免费代理IP,西刺,值得你拥有

    代理IP

    使用API可以快速获得我们需要的IP地址,当然,我们也可以做个爬虫,去爬它网站上的URL,这里就不展开说了。


    网站API

    3.2 构造IP代理容器

    由于从API上获得的数据多出一些换行符和回车符,不利于直接提取IP地址,所以就先用正则表达式直接提取需要的信息,再写进列表里面,方便之后读取。

    def WriteIPadress():
        all_url = [] # 存储IP地址的容器
        # 代理IP的网址
        url = "http://api.xicidaili.com/free2016.txt"
        r = requests.get(url=url)
        all_url = re.findall("\d+\.\d+\.\d+\.\d+\:\d+",r.text)
        with open("D:\\code\\python\\new\\Brush ticket\\IP.txt",'w') as f:
            for i in all_url:
                f.write(i)
                f.write('\n')
        return all_url
    

    4. 主函数

    count = 0 # 计数器
    while count < 4000:
        all_url = WriteIPadress()
        for i in all_url:
            proxies = {"http": i}
            try:
                r = requests.post(url=url, data=params, headers=headers, proxies=proxies)
                if(r.json()['flag'] == True):
                    count += 1
                    print("成功投票%d次!" % (count))
                print(r.json())
            except Exception as reason:
                print("错误原因是:",reason)
    

    由于某些IP地址是存在问题的,所以需要设置异常处理,以便让程序能够正常运行,而API的数据每15分钟更新一次,我们每跑完一遍列表的时间也差不多,因此也就不做其他处理了。

    运行日志


    日志

    源代码

    完整源代码

    个人博客,最新更新的文章都发在这,欢迎关注:https://yeah-kun.github.io/

    相关文章

      网友评论

        本文标题:python——刷票脚本

        本文链接:https://www.haomeiwen.com/subject/zhlyfxtx.html