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)行提交!
有興趣的可以私下交流