Python爬虫教程:你仍在千辛万苦拉票吗?刷票微信小程序实例基本原理分析!
你仍在千辛万苦拉票吗?
- 序言
- 分析投票基本原理
- 解决构思
- 实际实战演练
- 关键步骤
- 实际关键点python
- 编码案例python
- 实际关键点java
- 编码完成java
- 汇总
点一下这里,获得大量Python学习材料!
序言
作为一名程序猿,你是不是想给自己的日常生活开一点G呢?了解互联网要求的大家,应当从难题根本原因分析问题。针对一个投票的网址。大概分成两大类: 即然基本原理早已分析进行,那麼剩余的便是设计方案程序流程的难题了,针对一个点一下投票的恶性事件,它的本质便是一次http(post)要求,随后后台管理对数据信息开展变更。那麼大家就可以对这一操作步骤开展抓包软件,剖析这一要求是那类种类,必须这些主要参数。随后依据这一要求仿真模拟写成要求。 殊不知最重要的便是ip代理,你需要用代理商的ip去浏览哪个插口,让另一方认为就是你代理商的哪个ip再对他浏览,因此 你需要维护保养一个代理ip池。针对代理ip池,并不是什么高端大气的物品,精确的而言便是一个结合中包括一些能用的ip,可以供我应用。目前市面上也是有许多 售卖ip代理,都不贵。我就用的是蘑菇代理。 恰巧,近期报名参加的一个赛事就会有拉票阶段,假如人为因素手动式拉票得话高效率地底,而且你毫无疑问也不会想要每天去舔别人道歉。那么就自身剖析一波! 由于它是数次要求,因此 要考虑到特性的难题和高效率难题。不可以让出现异常满天飞,终断好声音投票,ip浪费,或是苦苦等待吧。 結果 在java中较为繁杂的便是java本身对json和http要求的解决不太便捷好声音投票,必须依靠第三方jar,而且一些实际操作稍显的繁杂。 最先java要搞清几个方面: 对于上边的难题。写了个demo检测开展准备,针对获取ip的api,大概这类文件格式 随后写个demo跑一下
如今日常生活离不了各种的赛事,殊不知,每个赛事离不了投票,大家会清一色有时寻找我们的朋友在微信朋友圈发—帮商品投一票,帮某某某教师,学员投一票。又也许你自己参加比赛好声音投票,你一直在给你自身拉票。分析投票基本原理
这类网址是的确不大好实际操作,一般是每一个帐户每日可以刷多个票。由于帐户的資源是比较有限的,大家难以根据获得很多的帐户資源为大家服务项目。更何况,一般的登陆略微大型厂或是技术性高些在其中的js加密会非常复杂,针对平常人js水准不高难以行的通这条道路。例如普遍必须微信登陆,qq登陆的网址投票,就难以开外挂。
并并不一定网址都是有腾讯官方的登陆受权的,有很多他们自己的官方网站他们自己便是一个管理体系。这类网址平常人也许也觉得不上差别:投几票以后也不可以投。随后竞相找个朋友帮助投。分析这类网址,即然沒有登陆体制,那麼它便是依据ip体制开展评定。由于一切正常你的外网地址ip相对而言是平稳。因此 一切正常一个客户只有投固定不动的几票。也许高級一点他会和电脑浏览器信息内容融合评定,但这类還是较为少的。解决构思
实际实战演练
关键步骤
寻找url和好多个主要参数,就可以提前准备程序流程了。仿真模拟要求了实际关键点python
针对ip代理,每家卖的尽管一些差别可是大致同样。大概均为卖总数,随后每一个ip从开始被用后可以保持十多分钟的应用。而且有的ip是不能用的,有些是高延迟时间的,这种在写程序的情况下必须过虑掉。这里边就需要考虑到下这一程序流程额设计方案。
python尽管线程同步有一个全局性锁极大地危害高效率。可是针对io要求型线程同步還是能有一定的加速的。由于io有很多的进程等候。线程同步的控制模块大概为界定一个进程类,界定原始方式和run涵数。随后在外面界定好多个进程,让她们跑每日任务。
一切正常的ip代理是一群ip随机抽取在其中做为ip代理,开展抓取每日任务,随后ip无效从ip池中删掉。而url的连接一般放进线程安全的全局性器皿中一个个抛出去。ip放进list或是redis中开展维护保养,搞好try catch出现异常就可以。可是这一刷票只有一个url。而且一个ip只有用比较有限频次。因此 换一个构思,url不用器皿维护保养。而ip用序列维护保养最好是,而且python的序列是线程安全的。因此 全部程序流程的构架也就很清楚了。只必须用个queue分析ip获得的文件格式开展相对存储。随后被消費,当低于一定数量时,要求api获取ip开展添充。编码案例python
import requests
import random
import time
import threading
from queue import Queue
def loadip():
url2 = 'http://piping.mogumiao.com/proxy/api/get_ip_al?appKey=f16367295e284173ae450fc38d9099a3&count=20&expiryDate=0&format=1&newLine=2'
req = requests.get(url2)
date = req.json()
if(date['code'])!='3001':
ipdate2 = date['msg']
global ipdate
ipdate.extend(ipdate2)
for va in ipdate2:
que.put(va)
print(ipdate)
class downspider(threading.Thread):
def __init__(self, threadname, que):
threading.Thread.__init__(self)
self.threadname = threadname
self.que = que
def run(self):
print('start thread' self.threadname)
while True:
try:
print(self.name,end='')
toupiaospider(que,self.threadname)
except Exception as e:
print(e,'888')
break
def getproxies():
b = ipdate[0]
b=que.get()
d = '%s:%s' % (b['ip'], b['port'])
global proxies
proxies['http'] = d
global msg
msg = b
return proxies
def toupiaospider(que,threadname):
if (que.qsize() < 15): # 扩展ip池
loadip()
proxies2=getproxies()
for i in range(0,5):
try:
#formData['times']=i
req = requests.post(url, headers=header, data=formData, proxies=proxies2, timeout=1.5)
res = req.json()
if res['res']==2001 or req.status_code!=200:
#ipdate.remove(msg)
continue
print(threadname,res,que.qsize())
except Exception as e:
print('errror',e)
# ipdate.remove(msg)
if __name__ == '__main__':
ipdate = []
msg = {}
proxies = {'http': ''}
stadus = 0
que = Queue()
threads=[]#进程
url='http://yunxin.163.com/api/vote/update'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
formData = {
'Referer':'http://yunxin.163.com/promotion/minichallenge/gallery?from=groupmessage&isappinstalled=0',
'id':'17',
'times':'1',
'activity':'minichallenge1'
}
proxies = {'http': '182.247.92.99:21136',
}
loadip()
time.sleep(5)
threadList = ['thread-1','thread-2','thread-3','thread-4','thread-4']
for j in threadList:
thread = downspider(j, que)
thread.start()
threads.append(thread)
for t in threads:
t.join()
实际关键点java
java关键有二种代理商方法,一种是jdkpac模式,另一种是net包了的proxy代理商。针对线程同步程序流程而且ip只有用一次的自然是用net的proxy代理商。
根据api获取ip,文件格式固定不动的,必须依靠fastjson分析json串获得必须的信息内容。
最先你需要免费下载fastjson和jsoup的jar包。或是添加maven依靠。(可在maven官方网站下jar包)package com.bigsai;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class test2 {
static int va=1;
public static void main(String[] args) {
String ti="{"code":"0","msg":[{"port":"40034","ip":"114.237.64.247"},{"port":"33257","ip":"223.240.210.250"},{"port":"39618","ip":"113.101.255.11"},{"port":"43151","ip":"183.135.106.62"},{"port":"41795","ip":"182.108.44.227"}]}";
JSONObject jsonObject= JSON.parseObject(ti);
String code=(String) jsonObject.get("code");
JSONArray jsonArray=jsonObject.getJSONArray("msg");
for(Object te:jsonArray)
{
JSONObject team=(JSONObject) te;
String ip=team.getString("ip");
int port=team.getInteger("port");
System.out.println(team " " ip " " port);
}
ExecutorService ex= Executors.newFixedThreadPool(10);
for(int i=0;i<200;i )
{
threadtest threadtest=new threadtest();
ex.execute(threadtest);
}
ex.shutdown();
}
static synchronized void addva()//除掉注解试一下
{
va ;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() " " va);
}
static class threadtest implements Runnable{
@Override
public void run() {
addva();
}
}
}
#p#分页标题#e#