问卷星自动填写python selenium脚本(2021vim版,亲测有效,看这一篇就够了)


前言

问卷星已经成为收集问卷的一个很重要的工具,有时可以用来报名参加活动,有时可以用来收集某些领域相关的情况,为了更快地填写问卷,特别是报名参加一些名额有限的活动的时候,或者批量填写问卷,可以利用python写个问卷星自助填写程序。


提示:以下是本篇文章正文内容,下面案例可供参考,码字不易,觉得有用的可以点赞收藏关注。

一、前期准备

我采用的是python的selenium模块,前期准备工作需要下载chrome驱动,然后要有python ide(如pycharm)
谷歌浏览器驱动链接
找到自己的谷歌浏览器版本下载就可以啦。谷歌浏览器的查看方式为:打开浏览器->…->设置->关于Chrome:
下载后,解压,打开放在Python的目录下面。

二、具体步骤

1.导入库与预定义变量

导入库,没有的就用pip自定义安装,预定义变量可以方便修改

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import random

#填写问卷星问卷的地址,2021年都是带vm字符偏多
urlip = "https://www.wjx.top/vm/xxxx.aspx"
#名字
name = "小红"
#性别
sex=2
#手机
phone = '18100000000'
#邮箱
Email = 'xiaohong@foxmail.com'

2.打开浏览器,防止识别为脚本

这里参考的是

https://blog.csdn.net/qq_45717425/article/details/119737648

    # 给出所需的url和option参数
    url_survey = (urlip)  # 根据需要填写url
    #防止被浏览器识别为脚本
    option = webdriver.ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    option.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=option)
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                           {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
    driver.get(url_survey)
    time.sleep(0.2)

3浏览问题,选择问题

1、首先找到每个问题,answers = driver.find_elements(By.CSS_SELECTOR, “.ui-field-contain”)
用answers存储每个问题,然后可以遍历问题,用i存储每个问题的序号

2、如何解析问题呢, 可以用title = answer.find_element(By.CSS_SELECTOR, “.field-label”),
找到问题的标题,然后判断其中的问题是什么?

3、接着就找到选项,进行解析、选择,如果是填空类的,如姓名,可以使用send_keys

if (“姓名” in title.text or “名字” in title.text):
idfind=“q%d”%i
a = driver.find_element_by_id(idfind)
a.send_keys(name)
如果是选项类,如性别,要看按钮是什么类型,可以对每个选项进行解析
例如:
radios = answer.find_elements(By.CSS_SELECTOR, “.ui-radio”)
可以存储每个按钮,然后遍历,找到想要的按钮,然后用click()函数去点击
for radio in radios:
j += 1
if (sex in (radio.text)):
radiofind = “//*[@id=‘div%d’]/div[2]/div[%d]/div” % (i, j)(这里是用xpath格式去找到按钮在哪)
print(radiofind)
driver.find_element_by_xpath(radiofind).click()(这里可以点击按钮)
注意,用css_selector去找对应框时,要用F12开发者选项去看具体的是什么类型,才能确保找对,填空类可能有不同类型,如textarea。

    answers = driver.find_elements(By.CSS_SELECTOR, ".ui-field-contain")
    i = 0
    for answer in answers:
        try:
            i+=1
            driver.execute_script("arguments[0].scrollIntoView();", answer)
            title = answer.find_element(By.CSS_SELECTOR, ".field-label")
            print(title.text)
            ### 有选项
            if ("姓名" in title.text or "名字" in title.text):
                idfind="q%d"%i
                a = driver.find_element_by_id(idfind)
                a.send_keys(name)
            elif ("学号" in title.text ):
                idfind = "q%d" % i
                driver.find_element_by_id(idfind).send_keys(cardnumber)
            elif ("手机" in title.text or "电话" in title.text):
                idfind = "q%d" % i
                driver.find_element_by_id(idfind).send_keys(phone)
            elif ("性别" in title.text):
                idfind = "//*[@id='div%d']/div[2]/div[1]/div" % i
                print(idfind)
                driver.find_element_by_xpath(idfind).click()
                radios = answer.find_elements(By.CSS_SELECTOR, ".ui-radio")
                j = 0
                for radio in radios:
                    j += 1
                    if (sex in (radio.text)):
                        radiofind = "//*[@id='div%d']/div[2]/div[%d]/div" % (i, j)
                        print(radiofind)
                        driver.find_element_by_xpath(radiofind).click()
            elif ("邮箱" in title.text or "mail" in title.text):
                idfind = "q%d" % i
                driver.find_element_by_id(idfind).send_keys(email)
            elif ("时间" in title.text ):
                radios = answer.find_elements(By.CSS_SELECTOR, ".ui-radio")
                j = 0
                for radio in radios:
                    print(radio.text)
                    j += 1
                    radiofind = "//*[@id='div%d']/div[2]/div[%d]/div" % (i, j)
                    print(radiofind)
                    driver.find_element_by_xpath(radiofind).click()
                checks = answer.find_elements(By.CSS_SELECTOR, ".ui-checkbox")
                j = 0
                for radio in checks:
                    print(radio.text)
                    j += 1
                    radiofind = "//*[@id='div%d']/div[2]/div[%d]/div" % (i, j)
                    print(radiofind)
                    driver.find_element_by_xpath(radiofind).click()
            else:
                ans = answer.find_elements(By.CSS_SELECTOR, ".ui-controlgroup")
                if ans:
                    print("ans:", ans)
                    lsans = random.choice(ans)
                    lsans.click()
                    continue
                inputtext = answer.find_element_by_css_selector("textarea")
                inputtext.send_keys('没有')
        except Exception as e:
            print(e)

4提交按钮,验证

找到提交按钮,提交,可能需要验证,最后如果是想出错了自己填写,可以加sleep函数,给自己时间填写,如果是批量填写,想要快速就不用。

    time.sleep(1)
    am = driver.find_element_by_xpath("//*[@id='ctlNext']")
    am.click()
    time.sleep(0.5)

    # 模拟点击智能验证按钮
    # 先点确认
    driver.find_element_by_xpath("//button[text()='确认']").click()
    # 再点智能验证提示框,进行智能验证
    driver.find_element_by_xpath("//div[@id='captcha']").click()
    print("end")
    time.sleep(100

全部代码

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import random

#填写问卷星问卷的地址
urlip = "https://www.wjx.top/vm/trZjDys.aspx"
#名字
name = "小红"
#学号
cardnumber="202130072021"
#性别
sex="女"
#手机
phone = '18100000000'
#邮箱
email = 'xiaohong@foxmail.com'

def auto():
    print("正在执行操作......")
    # 给出所需的url和option参数
    url_survey = (urlip)  # 根据需要填写url
    #防止被浏览器识别为脚本
    option = webdriver.ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    option.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=option)
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                           {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
    driver.get(url_survey)
    time.sleep(0.2)

    answers = driver.find_elements(By.CSS_SELECTOR, ".ui-field-contain")
    i = 0
    for answer in answers:
        try:
            i+=1
            driver.execute_script("arguments[0].scrollIntoView();", answer)
            title = answer.find_element(By.CSS_SELECTOR, ".field-label")
            print(title.text)
            ### 有选项
            if ("姓名" in title.text or "名字" in title.text):
                idfind="q%d"%i
                a = driver.find_element_by_id(idfind)
                a.send_keys(name)
            elif ("学号" in title.text ):
                idfind = "q%d" % i
                driver.find_element_by_id(idfind).send_keys(cardnumber)
            elif ("手机" in title.text or "电话" in title.text):
                idfind = "q%d" % i
                driver.find_element_by_id(idfind).send_keys(phone)
            elif ("性别" in title.text):
                idfind = "//*[@id='div%d']/div[2]/div[1]/div" % i
                print(idfind)
                driver.find_element_by_xpath(idfind).click()
                radios = answer.find_elements(By.CSS_SELECTOR, ".ui-radio")
                j = 0
                for radio in radios:
                    j += 1
                    if (sex in (radio.text)):
                        radiofind = "//*[@id='div%d']/div[2]/div[%d]/div" % (i, j)
                        print(radiofind)
                        driver.find_element_by_xpath(radiofind).click()
            elif ("邮箱" in title.text or "mail" in title.text):
                idfind = "q%d" % i
                driver.find_element_by_id(idfind).send_keys(email)
            elif ("时间" in title.text ):
                radios = answer.find_elements(By.CSS_SELECTOR, ".ui-radio")
                j = 0
                for radio in radios:
                    print(radio.text)
                    j += 1
                    radiofind = "//*[@id='div%d']/div[2]/div[%d]/div" % (i, j)
                    print(radiofind)
                    driver.find_element_by_xpath(radiofind).click()
                checks = answer.find_elements(By.CSS_SELECTOR, ".ui-checkbox")
                j = 0
                for radio in checks:
                    print(radio.text)
                    j += 1
                    radiofind = "//*[@id='div%d']/div[2]/div[%d]/div" % (i, j)
                    print(radiofind)
                    driver.find_element_by_xpath(radiofind).click()
            else:
                ans = answer.find_elements(By.CSS_SELECTOR, ".ui-controlgroup")
                if ans:
                    print("ans:", ans)
                    lsans = random.choice(ans)
                    lsans.click()
                    continue
                inputtext = answer.find_element_by_css_selector("textarea")
                inputtext.send_keys('没有')
        except Exception as e:
            print(e)
    time.sleep(1)
    am = driver.find_element_by_xpath("//*[@id='ctlNext']")
    am.click()
    time.sleep(0.5)

    # 模拟点击智能验证按钮
    # 先点确认
    driver.find_element_by_xpath("//button[text()='确认']").click()
    # 再点智能验证提示框,进行智能验证
    driver.find_element_by_xpath("//div[@id='captcha']").click()
    print("end")
    time.sleep(100)

if __name__ == '__main__':
    auto()

感谢阅读,如果对您有帮助,欢迎点赞,关注,收藏

<think>好的,我现在需要帮助用户找到实现问卷自动答题脚本的方法。首先,用户提到了他们之前尝试过GitHub上的源码,并修改了一些代码,所以可能对编程有一定的了解。他们需要具体的实现方式,可能包括使用的工具、步骤和注意事项。 首先,我应该回忆常见的自动化工具,比如PythonSelenium库,因为它可以控制浏览器进行自动化操作。另外,用户提到的引用中提到了使用Python和随机库,所以可能需要结合这些内容。 接下来,我需要整理实现的大致步骤。首先是环境准备,安装PythonSelenium,还有对应的浏览器驱动,比如ChromeDriver。然后是如何定位问卷的题目元素,可能需要用到XPath或CSS选择器。对于不同的题型,如单选、多选、填空,处理方式不同,需要分别说明。 另外,用户可能关心如何绕过验证码或者防止被检为机器人,这部分需要考虑等待时间和模拟人类操作,比如随机延迟、随机点击等。引用中提到使用random库来随机选择答案,这也是一个关键点,需要详细说明。 还需要考虑提交表单后的处理,比如多次填写时的间隔时间,以及可能遇到的验证码问题。引用中的示例代码使用了input()来暂停,可能需要更自动化的处理方式,比如设置等待时间或处理可能的弹窗。 然后,我要确保回答结构清晰,分步骤说明,让用户能一步步跟着操作。同时,引用相关的参考资料,比如GitHub上的项目和使用Python的实现,这样用户可以参考更多资源。 最后,生成相关问题,帮助用户进一步解决可能遇到的问题,比如如何提高成功率、处理验证码、优化脚本等。这些问题应该基于用户的实际需求,帮助他们深入理解和应用脚本。</think>### 问卷自动答题脚本实现方式 #### 1. 技术选型与工具 - **核心工具**:推荐使用$Python$ + $Selenium$库,因其能模拟浏览器操作(如点击、输入、提交)[^2]。 - **浏览器驱动**:需安装对应浏览器的驱动(如ChromeDriver),与浏览器本匹配。 - **随机化处理**:结合$random$库实现选择题答案的随机选择。 #### 2. 实现步骤 **步骤1:环境配置** ```python # 安装依赖库 pip install selenium # 下载ChromeDriver并配置环境变量 ``` **步骤2:定位题目元素** - **单选/多选**:通过XPath定位选项,例如: ```python # 定位第1题第3个选项 driver.find_element_by_xpath('//*[@id="div1"]/div[2]/div[3]').click() ``` - **填空题**:使用$send\_keys()$方法输入内容: ```python driver.find_element_by_id("q2").send_keys("示例文本") ``` **步骤3:模拟人类操作** ```python import time, random # 随机等待时间(降低检风险) time.sleep(random.uniform(0.5, 2.0)) # 随机选择选项(如第5题的4个选项中随机选1个) choice = random.randint(1,4) driver.find_element_by_xpath(f'//*[@id="div5"]/div[2]/div[{choice}]').click() ``` **步骤4:提交与验证码处理** ```python # 提交按钮点击 driver.find_element_by_xpath('//*[@id="submit_button"]').click() # 若出现验证码,可添加OCR识别或手动干预代码(需额外库支持) ``` #### 3. 完整示例代码框架 ```python from selenium import webdriver import time, random driver = webdriver.Chrome() driver.get("https://www.wjx.cn/jq/XXXXXX.aspx") # 替换为目标问卷链接 # 填写单选题(第1题选第2项) driver.find_element_by_xpath('//*[@id="div1"]/div[2]/div[2]').click() # 填写填空题(第2题) driver.find_element_by_id("q2").send_keys("自动试") # 随机填写多选题(第3题,假设有5个选项) selected = random.sample(range(1,6), k=2) # 随机选2项 for i in selected: driver.find_element_by_xpath(f'//*[@id="div3"]/div[2]/div[{i}]').click() driver.find_element_by_id("submit_button").click() time.sleep(5) driver.quit() ``` #### 4. 注意事项 - **反爬机制**:问卷可能检频繁请求,建议设置$time.sleep()$随机延迟[^3]。 - **动态元素**:若问卷结构变化需重新定位XPath,可通过浏览器开发者工具检查元素。 - **法律风险**:需遵守平台规则,仅用于学习试,禁止恶意刷票[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值