Python爬虫教程:你还在苦苦拉票吗?刷票案例原理剖析

你还在苦苦拉票吗?

  • 前言
  • 剖析投票原理
  • 处理思路
  • 具体实战
  • 主要流程
  • 具体细节python
  • 代码实例python
  • 具体细节java
  • 代码实现java
  • 总结
私信小编01即可获取大量Python学习资料
前言
Python爬虫教程:你还在苦苦拉票吗?刷票案例原理剖析文章插图
现在生活中离不开各类的比赛 , 然而 , 各个比赛离不开投票 , 我们会清一色有时候找到我们的朋友在朋友圈发—帮宝贝投一票 , 帮某某老师 , 学生投一票 。 又或许你自己参加比赛 , 你在为你自己拉票 。
剖析投票原理作为一名程序员 , 你是否想为自己的生活开一点G呢?熟悉网络请求的我们 , 应该从问题根源分析问题 。 对于一个投票的网站 。 大致分为两类:
  • 登录类:这类网站是确实不太好操作 , 一般是每个账户每天能够刷若干票 。 因为账户的资源是有限的 , 我们很难通过获取大量的账户资源为我们服务 。 况且 , 一般的登录稍微大厂或者技术高点其中的js加密会比较复杂 , 对于普通人js水平不高很难行的通这条路 。 比如常见需要微信登录 , qq登陆的网站投票 , 就很难开挂 。
  • 非登录类:并不是所有网站都有腾讯的登录授权的 , 有很多他们自己的官网他们自己就是一个体系 。 这类网站普通人或许也感觉不到差异:投几票之后也不能投 。 然后纷纷找朋友帮忙投 。 剖析这类网站 , 既然没有登录机制 , 那么它就是根据ip机制进行鉴定 。 因为正常你的公网ip相对来说是稳定 。 所以正常一个用户只能投固定的几票 。 或许高级一点他会和浏览器信息结合鉴定 , 但这种还是比较少的 。
处理思路既然原理已经剖析完成 , 那么剩下的就是设计程序的问题了 , 对于一个点击投票的事件 , 它的实质就是一次http(post)请求 , 然后后台对数据进行更改 。 那么我们就可以对这个操作流程进行抓包 , 分析这个请求是那种类型 , 需要那些参数 。 然后根据这个请求模拟写出请求 。
然而最重要的就是ip代理 , 你要用代理的ip去访问那个接口 , 让对方以为是你代理的那个ip再对他访问 , 所以你需要维护一个代理ip池 。 对于代理ip池 , 并不是什么高大上的东西 , 准确的来说就是一个集合中包含一些可用的ip , 能够供我使用 。 市面上也有很多出售代理ip , 也不贵 。 我用的是蘑菇代理 。
具体实战主要流程碰巧 , 最近参加的一个比赛就有拉票环节 , 如果人为手动拉票的话效率地下 , 并且你肯定也不会愿意天天去舔人家求情 。 那就自己分析一波!
  1. 首先 , 打开你在的网站(有的手机端 , 电脑端好抓包可调) , 谷歌或者其他浏览器F12抓包 , 点击network , xhr准备(肯定是ajax请求不用想) 。
  2. 分析这个请求的重要参数.(header)找到url和几个参数 , 就可以准备程序了 。 模拟请求了
具体细节python因为这是多次请求 , 所以要考虑性能的问题和效率问题 。 不能让异常漫天飞 , 中断 , ip白白浪费 , 或者苦苦等待吧 。 对于代理ip , 各家卖的虽然有些差异但是大体相同 。 大致均为卖数量 , 然后每个ip从开始被用后能够维持几分钟的使用 。 并且有的ip是不能用的 , 有的是高延迟的 , 这些在写程序的时候都要过滤掉 。 这里面就要考虑下这个程序额设计 。
  1. 多线程:python虽然多线程有个全局锁大大的影响效率 。 但是对于io请求型多线程还是能有一定的提速的 。 因为io有大量的线程等待 。 多线程的模块大致为定义一个线程类 , 定义初始方法和run函数 。 然后在外面定义几个线程 , 让他们跑任务 。
  2. ip处理和资源处理正常的ip代理是一群ip随机抽取其中作为代理ip , 进行爬取任务 , 然后ip失效从ip池中删除 。 而url的链接一般放到线程安全的全局容器中一个个抛出 。 ip放到list或者redis中进行维护 , 做好try catch异常即可 。 但是这个刷票只有一个url 。 并且一个ip只能用有限次数 。 所以换个思路 , url不需要容器维护 。 而ip用队列维护最好 , 并且python的队列是线程安全的 。 所以整个程序的架构也就很清晰了 。 只需要用个queue解析ip获取的格式进行相应储存 。 然后被消费 , 当少于一定个数时 , 请求api获取ip进行填充 。
  3. 在预处理方面 , 以前介绍过另一个蘑菇代理使用和ip池类似的问题 , 可以预先参考 。
代码实例pythonimport requestsimport randomimport timeimport threadingfrom queue import Queuedef loadip():url2 = ';count=20 WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}formData = http://kandian.youth.cn/index/{'Referer':';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()