Python+Selenium模拟问卷星填写

Python+Selenium模拟问卷星填写

本文为“菜鸡”(博主)第一次用PYTHON模拟问卷填写。
因此,特别声明:本文仅供学术/兴趣研究,不用于商业用途,亦不会用于毕业论文的实际应用中

下面代码的主要思路来源于网上各位前辈的文章,在此表示感谢。
由于水平有限,而且单纯拿来练手
故本文存在以下几个问题:

  1. 缺乏隐匿性,没有设置IP代理池
  2. 缺乏灵活性,没能构思出在一定概率下的提交方案(如:以3:7的男女比例提交),或是更贴合成人提交
  3. 缺乏应用型,由于问卷网址的元素都不一样,无法照抄或是照搬,需要个人解析

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个小时,才把一个简单的问卷模拟写出来,还是很辣鸡。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值