Python 自动提交问卷星随机答案

Python 提交问卷星随机答案

毕业需要大量的问卷调查,手动提交几分后发现,太麻烦了!
是否可以通过Python进行直接提交
答案肯定不能都一样,必须随机选取

参考不知道是否是原文,但是从这里找到的!原文地址

需要的准备

  • 首先通过抓包软件对数据进行分析
  • 爬取免费代理IP网站发布的Ip地址池,构建IP地址池
  • 调用fake_useragent库中的User_Agent方法,获取随机浏览器标示
  • Heard中需要包涵的内容,通过抓包就可以全部获取到
    • Host
    • User-Agent
    • Content-Type
    • Referer
    • Cookie
    • X-Forwarded-For
小细节
  • 由于post地址采用https协议,所以如果直接使用requests方法来传参,将会报错(可能是证书相关的问题,这里就不深究了),那么可以通过以下方法解决
import requests
requests.packages.urllib3.disable_warnings()#缺少将会报错警告,但好像不影响脚本运行
r = requests.post(url, headers=headers, data=data, verify=False)# verify默认是True的,所以手工设置为False,
  • 意外错误,使用Python3.7进行执行的时候会报错
    urllib.error.URLError:
    解决方法,使用Anaconda就不会有问题。暂时没有做太多的研究。

开始编辑代码
导入到模块

import requests
import urllib.request
from fake_useragent import UserAgent
import re
import random
import time

获取IP代理池

def Get_IP():
    headers = {
        'User-Agent': UserAgent().random
    }
    html = urllib.request.Request(url='https://www.xicidaili.com/nn/', headers=headers)
    html = urllib.request.urlopen(html).read().decode('utf-8')
    reg = r'(.+?)'
    reg = re.compile(reg)
    pools = re.findall(reg, html)[0:499:5]
    Random_IP = random.choice(pools)
    return Random_IP

编写Heards

def Get_Headers():
    headers = {
        'Host':'www.wjx.cn',
        'User-Agent': UserAgent().random,#随机User-Agent,需要从fake_useragent 库中 UserAgent包
        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8', # 以表格形式提交数据
            'Referer':'https://www.wjx.cn/m/xxxxx.aspx',#你的调查问卷链接
        'Cookie': " ", #抓包写自己的
        'X-Forwarded-For':Get_IP(),#调用函数获取代理IP地址
    }
    return headers

编构建传参函数用来提交参数

def Auto_WjX():
    url = '目的url' # 这个也可以抓取到
    #data是提交的参数(填写的问卷数据需要自己按实际情况编写)
    #若包含中文参数则需要指定编码,例:data = 'submit=1$2}2$3}3$python大法好啊'.encode("utf-8").decode("latin1")
    # 根据数据的规则可以看出来1是第一题,$后面是选项 如果多选的的话是1|3.
      # 标准答案
    # data = "submitdata=1$2}2$1}3$2}4$2}5$1|3|4}6$3}7$1}8$2}9$2}10$2}11$1}12$2}13$1|2|4|5}14$2}15$3}16$1|3}17$2}18$5}19$2}20$1|2|3}21$1!1;6,2!1;5;6,3!1;3;4}22$1}23$1|2|3}24$1|2|4}25$1|2|4}26$"

    #随机答案(使用random.randint随机整数进行选择答案,本人因题太多,所以把data数据进行截断,只是为了好看点。如果题少点话,可以直接写一条data数据。)
    # one 1--10题
    one = "submitdata=1$%s}2$%s}3$%s}4$2}5$%s|%s|%s}6$%s}7$%s}8$%s}9$%s}10$%s}" % (random.randint(1, 2), random.randint(1, 3), random.randint(1, 3), random.randint(1, 2),random.randint(3, 4), random.randint(5, 6), random.randint(1, 5), random.randint(1, 2), random.randint(1, 3),random.randint(1, 2), random.randint(1, 2))
    # two 11--20题
    two = '11$1}12$%s}13$%s|%s}14$%s}15$%s}16$%s|%s}17$%s}18$%s}19$%s}20$%s|%s}' % (random.randint(1, 2), random.randint(1, 3), random.randint(4, 5), random.randint(1, 4),random.randint(2, 3), random.randint(1, 2), random.randint(3, 4), random.randint(1, 2), random.randint(3, 5),random.randint(1, 3), random.randint(1, 2), random.randint(3, 4))
    # 21题到后面
    three = "21$1!%s;%s,2!%s;%s;%s,3!%s;%s;%s}22$1}23$1|%s}24$%s|%s}25$%s|%s}26$" % (random.randint(1, 3), random.randint(4, 7), random.randint(1, 2), random.randint(3, 4), random.randint(5, 7),random.randint(1, 2), random.randint(3, 4), random.randint(5, 7), random.randint(2, 3),random.randint(1, 2), random.randint(3, 4), random.randint(1, 2), random.randint(3, 4))
    data = one + two + three
    
    r = requests.post(url, headers=Get_Headers(), data=data, verify=False)
    result = r.text[0:2]
    resultt = r.text[-3:]
    return result,resultt

编写自己的mian函数了

def main():
    global PostNum
    for i in range(500):
        num = Auto_WjX()
        if int(num[0]) in [10]:
            print("\033[1;32;47m第%s份问卷  ===> 提交成功\033[0m" % num[1])
            PostNum += 1
        else:
            print('\033[5;31;47m第%s份问卷  ===> 提交失033[0m' % num[1])

        print("30秒后再次提交,请等待")
        time.sleep(30)  # 设置休眠时间,这里要设置足够长的休眠时间

    print('脚本运行结束,成功提交%s份调查报告' % PostNum)  # 总结提交成功的数量,并打印

if __name__ == '__main__':
    main()

仅供研究学习,勿要滥用!
完整代码

import requests
import urllib.request
from fake_useragent import UserAgent
import re
import random
import time
from multiprocessing import Process

requests.packages.urllib3.disable_warnings()
PostNum = 0

def Get_Headers():
    headers = {
        'Host':'www.wjx.cn',
        'User-Agent': UserAgent().random,
        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
        'Referer':'https://www.wjx.cn/m/xxxxxxx.aspx',
        'Cookie': "acw_tc=2f624a2715707742490114846e11af314ae7a232ed18707c9ed7d7796002c8; .ASPXANONYMOUS=aD0md4y21QEkAAAANmIzNGIzNDEtNDk4OS00MjNjLTg5YTItMjU2YWIwMTdkZGM4_qytsxBWi11-sOz1HwVnB_Y516Q1; jac47027148=19962282; %26ntime%3D1570771906; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1570774251; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1570774251; jpckey=%u5927%u5B66%u751F",
        'X-Forwarded-For':Get_IP(),
    }
    return headers

def Get_IP():
    headers = {
        'User-Agent': UserAgent().random
    }
    html = urllib.request.Request(url='https://www.xicidaili.com/nn/', headers=headers)
    html = urllib.request.urlopen(html).read().decode('utf-8')
    reg = r'(.+?)'
    reg = re.compile(reg)
    pools = re.findall(reg, html)[0:499:5]
    Random_IP = random.choice(pools)
    return Random_IP

def Auto_WjX():
    # url = "https://www.wjx.cn/joinnew/processjq.ashx?curid=47027148&starttime=2019%2F10%2F11%2011%3A28%3A55&source=directphone&submittype=1&ktimes=133&hlv=1&rn=2945543818.43549698&jpm=13&iwx=1&t=1570764567174&jqnonce=f9077c2c-27d4-44a1-8d65-b86cc2be27ff&jqsign=e%3A344%601%60.14g7.77b2.%3Bg56.a%3B5%60%601af14ee"
    url = 'https://www.wjx.cn/joinnew/processjq.ashx?curid=470x148&starttime=2019%2F10%2F11%2014%3A10%3A48&source=directphone&submittype=1&ktimes=274&hlv=1&rn=2073019949.19962282&jpm=13&iwx=1&t=1570774285057&jqnonce=684e1271-560c-4455-90b4-121a612b065e&jqsign=2%3C0a5635)124g)0011)%3D4f0)565e256f421a'


    # 标准答案
    # data = "submitdata=1$2}2$1}3$2}4$2}5$1|3|4}6$3}7$1}8$2}9$2}10$2}11$1}12$2}13$1|2|4|5}14$2}15$3}16$1|3}17$2}18$5}19$2}20$1|2|3}21$1!1;6,2!1;5;6,3!1;3;4}22$1}23$1|2|3}24$1|2|4}25$1|2|4}26$"

    #随机答案
    one = "submitdata=1$%s}2$%s}3$%s}4$2}5$%s|%s|%s}6$%s}7$%s}8$%s}9$%s}10$%s}" % (random.randint(1, 2), random.randint(1, 3), random.randint(1, 3), random.randint(1, 2),random.randint(3, 4), random.randint(5, 6), random.randint(1, 5), random.randint(1, 2), random.randint(1, 3),random.randint(1, 2), random.randint(1, 2))
    two = '11$1}12$%s}13$%s|%s}14$%s}15$%s}16$%s|%s}17$%s}18$%s}19$%s}20$%s|%s}' % (random.randint(1, 2), random.randint(1, 3), random.randint(4, 5), random.randint(1, 4),random.randint(2, 3), random.randint(1, 2), random.randint(3, 4), random.randint(1, 2), random.randint(3, 5),random.randint(1, 3), random.randint(1, 2), random.randint(3, 4))
    three = "21$1!%s;%s,2!%s;%s;%s,3!%s;%s;%s}22$1}23$1|%s}24$%s|%s}25$%s|%s}26$" % (random.randint(1, 3), random.randint(4, 7), random.randint(1, 2), random.randint(3, 4), random.randint(5, 7),random.randint(1, 2), random.randint(3, 4), random.randint(5, 7), random.randint(2, 3),random.randint(1, 2), random.randint(3, 4), random.randint(1, 2), random.randint(3, 4))
    data = one + two + three

    r = requests.post(url, headers=Get_Headers(), data=data, verify=False)
    result = r.text[0:2]
    resultt = r.text[-3:]
    return result,resultt

def main():
    global PostNum
    for i in range(500):
        num = Auto_WjX()
        if int(num[0]) in [10]:
            print("\033[1;32;47m第%s份问卷  ===> 提交成功\033[0m" % num[1])
            PostNum += 1
        else:
            print('\033[5;31;47m第%s份问卷  ===> 提交失033[0m' % num[1])

        print("30秒后再次提交,请等待")
        time.sleep(30)  # 设置休眠时间,这里要设置足够长的休眠时间

    print('脚本运行结束,成功提交%s份调查报告' % PostNum)  # 总结提交成功的数量,并打印

if __name__ == '__main__':
    main()

多进程源码就不放了,和上面单进程基本一致,只是从multiprocessing 调用了Process方法。可以实现多个进程一起进行提交!

有兴趣的可以私下交流

你可能感兴趣的:(Python 自动提交问卷星随机答案)