本文使用pyhton实现常见的问卷星问卷自动化填写。如果出现智能验证,本文还不能有效绕过问卷星提交时出现的智能检测,还需要手动点击智能检测才能完成问卷的填写。

在网络问卷中,我们常见的问题有单选题、多选题和李克勤量表题,如下图:

单选题:

python填问卷 python自动填写微信问卷_自动化


多选题:

python填问卷 python自动填写微信问卷_python填问卷_02


李克勤量表题:

python填问卷 python自动填写微信问卷_chrome_03


本文就是实现了以上问题的问卷星问卷自动填写功能,大家可以根据自己问卷的需要添加其他问题的自动化填写功能。

本文的半自动化填写问卷程序需要依赖浏览器驱动,笔者使用的是谷歌浏览器,所以需要下载chromedriver,且版本需要和目前自己的浏览器版本匹配运行才不会出错。

查看自己的浏览器版本可以点击设置,在“关于Chrome”中即可看到当前浏览器版本。

python填问卷 python自动填写微信问卷_python填问卷_04


点击chromedriver下载或打开网址:https://npm.taobao.org/mirrors/chromedriver/即可下载对应版本的谷歌浏览器驱动。注意:chromedriver解压后的文件需要放到python项目目录下。

此外,python也需要安装selenium浏览器驱动包。

pip install selenium

本文直接讲解填写问卷的方法,如对selenium不熟悉,可以在B站上找相关的视频或者到selenium官方直接学习官方文档,一般爬虫都会讲解selenium的。

完整代码
1、导入所需的包

import random
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from concurrent.futures import ThreadPoolExecutor

2、selenium基本配置

chrome_options = Options()
chrome_options.add_argument(
    'user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"')  # 添加请求头
# 防止被识别(并不绝对能绕过selenium检测)
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])  
chrome_options.add_argument('--disable-blink-features=AutomationControlled')

3、所要答题的问卷星问卷链接地址

url = 'https://www.wjx.cn/vj/eFcdw4q.aspx'

4、主体答题代码

def answer_question(url):
    driver = webdriver.Chrome(options=chrome_options)
    driver.maximize_window()   # 最大化浏览器窗口
    driver.get(url)
    time.sleep(1)
    questions = driver.find_elements_by_class_name('div_question')
    for question in questions:
        answers_one = question.find_elements_by_xpath('.//ul/li/a')
        answers_more_td = question.find_elements_by_xpath('.//table/tbody/tr')
        answers_many = question.find_elements_by_class_name('jqCheckbox')
        # 单选题
        if answers_one != []:
            try:
                choose_one = random.choice(answers_one)
                choose_one.click()
            except Exception as e:
                print(e)
        # 一问题下多问题选择(如五级选题)
        if answers_more_td != []:
            for answers_tr in answers_more_td:
                try:
                    answers_more_ones = answers_tr.find_elements_by_xpath('./td/a')
                    choose_more_one = random.choice(answers_more_ones)
                    choose_more_one.click()
                except Exception as e:
                    print(e)
        # 多选题
        if answers_many != []:
            most = len(answers_many)
            choose_manys = set()
            for i in range(random.randint(1, most + 1)):
                choose = random.choice(answers_many)
                choose_manys.add(choose)
            for choose_many in choose_manys:
                try:
                    choose_many.click()
                except Exception as e:
                    print(e)
    time.sleep(2)
    submit_button = driver.find_element_by_id('submit_button')  # 找到提交按钮
    submit_button.click()  # 点击提交
    time.sleep(random.randint(3, 5))
    # 智能验证
    while 'mainBgColor' in driver.page_source:
        mainBgColor = driver.find_element_by_class_name('mainBgColor')
        mainBgColor.click()
    driver.quit()

def run():
    url_list = [url]*10
    with ThreadPoolExecutor(max_workers=2) as executor:
        executor.map(answer_question, url_list)
        time.sleep(1)


if __name__ == '__main__':
    run()

本文使用多线程(2个线程)进行自动化填写问卷,如果有智能检测需要自己手动完成最后的智能验证后才能提交成功哦。当我们的问卷数量不够的时候,我们可以利用现有的问卷算出人们答题的规律,以此作为答题的权重修改程序,改变随机答题规则,这应该是可以避免在问卷的信度效度检验中无法通过的尴尬情况。
本文仅为技术交流,最好不要用来恶意填写别人的问卷,以造成问卷质量低下的情况,请大家还是根据自己的实际情况填写问卷哦。