Python 自動(dòng)提交問卷星隨機(jī)答案

Python 提交問卷星隨機(jī)答案

畢業(yè)需要大量的問卷調(diào)查,手動(dòng)提交幾分后發(fā)現(xiàn),太麻煩了!
是否可以通過Python進(jìn)行直接提交
答案肯定不能都一樣,必須隨機(jī)選取

參考不知道是否是原文,但是從這里找到的!原文地址

需要的準(zhǔn)備

  • 首先通過抓包軟件對(duì)數(shù)據(jù)進(jìn)行分析
  • 爬取免費(fèi)代理IP網(wǎng)站發(fā)布的Ip地址池,構(gòu)建IP地址池
  • 調(diào)用fake_useragent庫中的User_Agent方法,獲取隨機(jī)瀏覽器標(biāo)示
  • Heard中需要包涵的內(nèi)容,通過抓包就可以全部獲取到
    • Host
    • User-Agent
    • Content-Type
    • Referer
    • Cookie
    • X-Forwarded-For
小細(xì)節(jié)
  • 由于post地址采用https協(xié)議,所以如果直接使用requests方法來傳參,將會(huì)報(bào)錯(cuò)(可能是證書相關(guān)的問題,這里就不深究了),那么可以通過以下方法解決
import requests
requests.packages.urllib3.disable_warnings()#缺少將會(huì)報(bào)錯(cuò)警告,但好像不影響腳本運(yùn)行
r = requests.post(url, headers=headers, data=data, verify=False)# verify默認(rèn)是True的,所以手工設(shè)置為False,
  • 意外錯(cuò)誤,使用Python3.7進(jìn)行執(zhí)行的時(shí)候會(huì)報(bào)錯(cuò)
    urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1076)>
    解決方法,使用Anaconda就不會(huì)有問題。暫時(shí)沒有做太多的研究。

開始編輯代碼
導(dǎo)入到模塊

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'<td>(.+?)</td>'
    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,#隨機(jī)User-Agent,需要從fake_useragent 庫中 UserAgent包
        'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8', # 以表格形式提交數(shù)據(jù)
            'Referer':'https://www.wjx.cn/m/xxxxx.aspx',#你的調(diào)查問卷鏈接
        'Cookie': " ", #抓包寫自己的
        'X-Forwarded-For':Get_IP(),#調(diào)用函數(shù)獲取代理IP地址
    }
    return headers

編構(gòu)建傳參函數(shù)用來提交參數(shù)

def Auto_WjX():
    url = '目的url' # 這個(gè)也可以抓取到
    #data是提交的參數(shù)(填寫的問卷數(shù)據(jù)需要自己按實(shí)際情況編寫)
    #若包含中文參數(shù)則需要指定編碼,例:data = 'submit=1$2}2$3}3$python大法好啊'.encode("utf-8").decode("latin1")
    # 根據(jù)數(shù)據(jù)的規(guī)則可以看出來1是第一題,$后面是選項(xiàng) 如果多選的的話是1|3.
      # 標(biāo)準(zhǔn)答案
    # 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$"

    #隨機(jī)答案(使用random.randint隨機(jī)整數(shù)進(jìn)行選擇答案,本人因題太多,所以把data數(shù)據(jù)進(jìn)行截?cái)?,只是為了好看點(diǎn)。如果題少點(diǎn)話,可以直接寫一條data數(shù)據(jù)。)
    # 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函數(shù)了

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秒后再次提交,請(qǐng)等待")
        time.sleep(30)  # 設(shè)置休眠時(shí)間,這里要設(shè)置足夠長(zhǎng)的休眠時(shí)間

    print('腳本運(yùn)行結(jié)束,成功提交%s份調(diào)查報(bào)告' % PostNum)  # 總結(jié)提交成功的數(shù)量,并打印

if __name__ == '__main__':
    main()

僅供研究學(xué)習(xí),勿要濫用!
完整代碼

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'<td>(.+?)</td>'
    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'


    # 標(biāo)準(zhǔn)答案
    # 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$"

    #隨機(jī)答案
    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秒后再次提交,請(qǐng)等待")
        time.sleep(30)  # 設(shè)置休眠時(shí)間,這里要設(shè)置足夠長(zhǎng)的休眠時(shí)間

    print('腳本運(yùn)行結(jié)束,成功提交%s份調(diào)查報(bào)告' % PostNum)  # 總結(jié)提交成功的數(shù)量,并打印

if __name__ == '__main__':
    main()

多進(jìn)程源碼就不放了,和上面單進(jìn)程基本一致,只是從multiprocessing 調(diào)用了Process方法??梢詫?shí)現(xiàn)多個(gè)進(jìn)程一起進(jìn)行提交!

有興趣的可以私下交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容