zoukankan      html  css  js  c++  java
  • 使用免费ip代理进行投票

    只要是投票系统,必然要限制一个用户投多张票。

    如何限制呢?限制ip是最直观最简单的思路,可是代理池可以解决限制ip的情况。
    如果投票页面前面加上一个验证码,那程序就会有点困难了。

    有些投票使用微信号,一个微信号只允许投一张票。这个其实是非常安全的。因为微信号的获取比ip的获取麻烦多了。人们可以很容易地制造出ip池,却难以构造一个微信号池。

    于是,如何限制用户就很简单了:什么东西是一人一份并且人们不会把自己的借给别人用。

    回到本文上来,限制ip可以用代理池应对。

    ip代理池网上有很多收费的,也有很多免费的。
    编一个爬虫把ip地址爬下来,构成一个ip库。逐个尝试这个ip库,对于每个ip直到被封了就切换ip,直到把全部ip库试玩一遍。如果还没有完成任务,重新从免费ip代理网站上爬取ip库。

    import re
    
    import requests
    from pyquery import PyQuery as pq
    
    
    # 查看投票界面,返回候选人信息列表
    def seepage(out=True):
        resp = requests.get(
            "http://www.ciotimes.com/index.php?m=toupiao&c=index&a=init&formart=fx&from=timeline&isappinstalled=0")
        html = pq(resp.text)
        box = html(".liebiao-bottom-box")  # 候选人列表
        people = []
        for i in range(box.length):
            it = box.eq(i)
            name = it(".liebiao-name").text()
            name = re.sub('s', '', name)
            desc = it(".liebiao-jieshao").text()
            id_ = it(".liebiao-button-box button").val()
            value = it(".liebiao-piaonum span").text()
            if out:
                print(name, desc, id_, value)
            people.append({
                'name': name,
                'desc': desc,
                'id': id_,
                'value': value
            })
        return people
    
    
    # 按照proxy给id投票,返回投票是否成功
    def toupiao(id, proxy):
        id = str(id)
        try:
            resp = requests.get("http://www.ciotimes.com/index.php?m=toupiao&c=index&a=add_form&id=" + id, proxies={
                'http': proxy
            }, timeout=2)
            return int(resp.text)
        except:
            return -1
    
    
    # 查看id候选人当前票数
    def howmany(id):
        for i in seepage(out=False):
            if i['id'] == id:
                return i['value']
    
    
    # 从网上免费ip池中,获取ip列表
    def getips():
        urls = ["http://www.xicidaili.com/nn", "http://www.xicidaili.com/nt", "http://www.xicidaili.com/wn",
                "http://www.xicidaili.com/wt"]
        ans = []
        for i in urls:
            resp = requests.get(i, headers={
                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
                "Accept-Encoding": "gzip, deflate",
                "Accept-Language": "zh-CN,zh;q=0.8",
                "Cache-Control": "max-age=0",
                "Connection": "keep-alive",
                "Host": "www.xicidaili.com",
                "Upgrade-Insecure-Requests": "1",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36"
            })
            trs = pq(resp.text)("#ip_list tr")
            for j in range(trs.length):
                tr = trs.eq(j)
                tds = tr("td")
                if len(tds) != 10: continue
                ip = tds.eq(1).text()
                port = tds.eq(2).text()
                ans.append(ip + ":" + port)
        return list(set(ans))
    
    
    # 给id候选人投票cnt次,如果失败了就换ip
    def go(id, cnt):
        counter = 0
        while counter < cnt:
            for i in getips():
                print(i)
                while toupiao(id, i) == 0:
                    counter += 1
                    print(counter)
                    if counter >= cnt:
                        return
    
    
    go(194, 1000)
    
    
  • 相关阅读:
    UI控件
    iOS 上架
    UISwitch 开关
    UISlider 的属性
    SQL SERVER 触发器
    sql server数据库操作
    二叉堆实现优先队列
    散列表
    AVL树
    C++基础-02
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/7498177.html
Copyright © 2011-2022 走看看