使用免费ip代理进行投票
2024-08-24 10:46:27
只要是投票系统,必然要限制一个用户投多张票。
如何限制呢?限制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)
最新文章
- 实现Div拖拽
- Vue.js基本规则提炼总结及计算属性学习
- python 从文件导入分类
- 关于Excel导入的HDR=YES; IMEX=1详解
- ubuntu下格式化内存当硬盘使的小实验
- 大数据性能调优之HBase的RowKey设计
- Java设计模式---工厂方法模式(Factory-Method)
- 1.4.1. Core Data Helper 简介(Core Data 应用程序实践指南)
- MySQL批量插入数据的几种方法
- 应用TortoiseGit为github账号添加SSH keys,解决pull总是提示输入密码的问题
- GBK转UTF8
- python pytz时区设置模块
- VS2010发布、打包安装程序(超全超详细)
- 计算概论(A)/基础编程练习(数据成分)/2:奥运奖牌计数
- G 最水的一道
- 在CentOS7下从0开始搭建docker并发布tomcat项目
- 【JavaEE】SSH+Spring Security整合及example
- sklearn fit transform fit_transform
- k8s认证及ServiceAccount-十五
- easyui权限管理
热门文章
- [Mongo] 解决mongoose不支持条件操作符 $gt$gte:$lte$ne $in $all $not
- MySQL必会的28条经典查询
- 【BZOJ】【4066】简单题(强制在线)
- Java:java+内存分配及变量存储位置的区别
- 理清Processor, Processor Sockets, Processor Cores, Logical Processors, Hyperthreading这些概念吧
- Reverse Linked List II leetcode java
- Template Method 模板方法 MD
- jQuery EasyUI 教程-Tooltip(提示框)
- android 多线程概述
- WebApi的缺点