Python+Selenium模拟问卷星填写
本文为“菜鸡”(博主)第一次用PYTHON模拟问卷填写。
因此,特别声明:本文仅供学术/兴趣研究,不用于商业用途,亦不会用于毕业论文的实际应用中
下面代码的主要思路来源于网上各位前辈的文章,在此表示感谢。
由于水平有限,而且单纯拿来练手
故本文存在以下几个问题:
- 缺乏隐匿性,没有设置IP代理池
- 缺乏灵活性,没能构思出在一定概率下的提交方案(如:以3:7的男女比例提交),或是更贴合成人提交
- 缺乏应用型,由于问卷网址的元素都不一样,无法照抄或是照搬,需要个人解析
1.问卷的设计
问卷:https://www.wjx.cn/jq/51844399.aspx
3道单选题,1道多选题(问卷星还有很多题型,但是我
水平有限,只能模拟这么多了)
2.代码部分
import time
import random
from fake_useragent import UserAgent
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
#设置随机请求头,欺骗问卷星提交
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'User-Agent': UserAgent().random,
'Connection': 'keep-alive'
}
# 使用copy()防止修改原代码定义dict
desired_cap = DesiredCapabilities.PHANTOMJS.copy()
# 设置其他请求投信息,其中key为要修改的请求投键名
for key, value in headers.items():
desired_cap['phantomjs.page.customHeaders.{}'.format(
key)] = value
#声明PhantomJS浏览器,启动随机浏览器头
driver = webdriver.PhantomJS(executable_path=r'C:/Users/ASUS/AppData/Local/Programs/Python/Python37/phantomjs-2.1.1-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe',
desired_capabilities=desired_cap)
#获取网站
def geturl():
try:
driver.get("https://www.wjx.cn/m/51844399.aspx")
time.sleep(3) #休眠3秒钟,等待网页显示
#获取标题
a = driver.find_element_by_id("htitle").text
print("您要爬取的问卷标题是:",a)
except Exception as e:
print('无法获取网站')
#输出当前所有问题,由于我这里就4个问题,就不设置自动获取编号
#与此同时,这个参数我并没有放进主程序里面,只是我网页解析的时候,多写一步而已
def get_question():
geturl()
for i in range(1,5):
a = "div"+str(i)
b = driver.find_element_by_id(a).text
print(b)
#模拟主程序
def run():
try:
geturl()
#获取选项q1_1(男)的文本被隐藏了,后来发现style="display:none;"
#driver.find_element_by_id("q1_1").is_displayed()
#获取整个选项的文本,反而获取成功,故而我猜测style应该是隐藏元素的控制键
#driver.find_element_by_id("div1").text
#参考网站(元素隐藏):
#https://www.cnblogs.com/klb561/p/9332968.html
#Q1问题_两个选项(单选),q1_1男性,q1_2女性
#构建随机数
r = random.randint(1,2)
if r==1:
driver.find_element_by_css_selector("div[for='q1_1']").click()
elif r==2:
driver.find_element_by_css_selector("div[for='q1_2']").click()
#休眠2秒钟,防止做题过快,被网站监测到
time.sleep(3)
#Q2问题_两个选项(单选),q2_1吃了,q2_2没吃
r = random.randint(1,2)
if r==1:
driver.find_element_by_css_selector("div[for='q2_1']").click()
elif r==2:
driver.find_element_by_css_selector("div[for='q2_2']").click()
#Q3问题_四个选项(单选),q3_1吃饭,q3_2看书,q3_3做卷子,q3_4看B站
time.sleep(3)
r = random.randint(1,4)
if r==1:
driver.find_element_by_css_selector("div[for='q3_1']").click()
elif r==2:
driver.find_element_by_css_selector("div[for='q3_2']").click()
elif r==3:
driver.find_element_by_css_selector("div[for='q3_3']").click()
else:
driver.find_element_by_css_selector("div[for='q3_4']").click()
#Q4问题_7个选项(多选),q4_1-6为单项选择,q4_7填空
time.sleep(5)
#随机填写1-5次
r = random.randint(1,5)
for i in range(1,r+1):
r1 = random.randint(1,7)
if r1== 7:
driver.find_element_by_css_selector("div[for='q4_7']").click()
#定义填写的内容
d = ["撸猫","看书","科学上网","学日语"]
r2 = random.randint(0,3)
q4_7 = d[r2]
driver.find_element_by_id("tqq4_7").send_keys(q4_7)
else:
#随机选择
q3_x = "div[for="+"'q4_"+str(r1)+"\']"
driver.find_element_by_css_selector(q3_x).click()
#提交问卷
driver.find_element_by_id("ctlNext").click()
except Exception as e:
print('运行出错')
#主函数,填写5份卷子
if __name__ == '__main__':
for i in range(1,6):
run()
print("问卷模拟已完成,祝您学业进步")
3.结果
截取多选题的结果看看,还行吧
4.反思
对于网站的元素解析,严重缺乏,而且还有很多东西要学,而且写了才不多8,9个小时,才把一个简单的问卷模拟写出来,还是很辣鸡。