前言

    相信大家在写论文、作业的同时,想必大家被问卷填写的人数给难倒,尤其是低三下四求别人填写的时候,如果大家是像我这种平时不社交那一定是苦中苦了。那么有没有一种工具让我们实现自动化呢,答案是有的!在编程语言选择的同时,大家知道最易上手的,那莫过于我们大家都熟知的python语言了。那么接下来就让大家通过python实现大家心目中(ps:废话可直接跳过)

一、安装环境

1.1 、selenium和pyautogui库

1.1.1  这里需要安装selenium库,此库作用是帮我们爬取网站信息和需要处理的页面。

1.1.2  还需要安装pyautogui库,此库作用为模拟我们真人填写。

我们将直接使用清华镜像网站安装

pip install pyautogui -i  https://pypi.tuna.tsinghua.edu.cn/simple 
pip install selenium -i  https://pypi.tuna.tsinghua.edu.cn/simple

1.2 、驱动文件

1.2.1 执行本次程序需要在谷歌安装驱动文件(如未安装谷歌浏览器,请先下载谷歌浏览器下载链接),在下载驱动之前我们还需要去查找谷歌对应版本,步骤如下。

首先打开设置

Python爬取问卷星内容 python刷问卷星调查问卷_CSS

然后点击关于chrome即可看到版本号

Python爬取问卷星内容 python刷问卷星调查问卷_python_02

下面我们就可以下载谷歌驱动了(下载链接),找到对应的版本号进行下载,如果没找到对应的版本号,那么需要一个比较近的下载即可。假如你的版本号为103.0.5060.44,那么应该下载对应版本103.0.5060.53。(尽量把浏览器更新到近几月的版本,这样更全面。)

Python爬取问卷星内容 python刷问卷星调查问卷_Python爬取问卷星内容_03

下载完成是一个压缩包,将压缩包解压后是一个.exe文件,将文件放进谷歌浏览器文件中,大家可以跟我放相同的文件中,如图所示。

Python爬取问卷星内容 python刷问卷星调查问卷_python_04

二、代码如下

2.1、导入所需库

这里我们将所有需要的库全部导入

from selenium.webdriver.common.by import By  # 没有selenium库的(请在所用的环境下pip install selenium)
from selenium import webdriver  #selenium库
import random  # 用于产生随机数
import time  # 用于延时
import pyautogui  # 用于模拟人手

2.2、验证信息

这里我们设置模拟人手滚动页面加延时,最后进行验证。

def gundong(driver, distance): #延时+屏幕滚动
    js = "var q=document.documentElement.scrollTop=" + str(distance)    #下拉像素(800是基于最顶端测算的距离)
    driver.execute_script(js)
    time.sleep(0.5)

def renzheng(driver):
    # 智能验证,找到智能认证的标签
    bth = driver.find_element_by_css_selector(
        '#layui-layer1 > div.layui-layer-btn.layui-layer-btn- > a.layui-layer-btn0')
    bth.click()#点击
    time.sleep(1)
    rectBottom = driver.find_element_by_css_selector('#rectBottom') #提交按钮
    rectBottom.click() #点击
    time.sleep(5)

2.3、跳过滑块

因次数过多,可能出现滑块需要验证。我们将模拟人手滑动滑块

def huakuai():
    # 当次数多了的时候就会出现滑块,这里是模拟人手解决滑块拖动
    pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
    time.sleep(1)
    pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒
    time.sleep(1)
    pyautogui.click(random.randint(652, 667), random.randint(793, 795))#让鼠标点击x,y处
    time.sleep(1)
    pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
    time.sleep(1)
    pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒

2.4、程序所需函数选择

   2.4.1、单选题自定义函数

当问卷中有十个单选,可直接判断进行自动答题,也可设置其中一题为特定答案。

def One(driver):
    # 第一页,通过f12发现可用的标签有十个,且第一个是废标签,所以不用管
    for i in range(1, 11):

        #对应的绝对子标签
        gundong(driver, i * 400)
        ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
        # 找到对应题,然后进行答题
        if i == 2:
            driver.find_element(By.XPATH, f'//*[@id="div{2}"]/div[2]/div[2]').click()

        elif i == 3:
            driver.find_element(By.XPATH,f'//*[@id="div{3}"]/div[2]/div[2]').click()
        else:
            for s in ans:
                iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
                random.choice(iSsA).click()
        time.sleep(random.randint(1, 2))

 2.4.2、多选题自定义函数

if为多少就是多少题,循环需设置你题目共有多少选择题。

def Two(driver):
    # 第二页,通过f12发现可用的标签有11-25个,且第一个是废标签,所以不用管
    for i in range(11, 25):
        gundong(driver, i * 400)
        #对应的绝对子标签
        ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
        # gundong(driver, distance=800)
        if i == 17:
            driver.find_element(By.XPATH, '//*[@id="div17"]/div[2]/div[3]').click()
        elif i == 19:
            for j in range(1, 8):
                s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a/i[1]')
                s.click()
                time.sleep(1.5)
        elif i == 20:
            for j in range(1, 8):
                s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a')
                s.click()
                time.sleep(1.5)
        elif i == 22:
            for answer in ans:
                s = answer.find_elements(By.CSS_SELECTOR,".ui-checkbox")  # 对应的绝对子标签
                # 随机填几次
                for k in range(1, 4):  # 这里的7可以改成5,10,12
                    random.choice(s).click()  # 找到标签并点击
                time.sleep(random.randint(0, 1))
        else:
            for s in ans:
                iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
                random.choice(iSsA).click()
            time.sleep(random.randint(1, 2))

2.5、项目主要代码

这里将展示提交页面、以及你问卷的链接。是本次问卷最核心部位。

def zonghe(times, GoogleExe, GoogleDriver):
    for i in range(0, times):
        # 初始配置,地址
        url_survey = '你问卷的链接'
        option = webdriver.ChromeOptions()
        option.add_argument('--disable-automation')
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_experimental_option('useAutomationExtension', False)
        # 本地下载的谷歌浏览器地址
        option.binary_location = GoogleExe
        # 下载好的Chrome驱动的地址
        driver = webdriver.Chrome(executable_path=GoogleDriver, options=option)
        driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                               {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})

        driver.get(url_survey)
        One(driver) # 第一页函数
        # gundong(driver, distance=600)
        time.sleep(1)
        driver.find_element(By.CSS_SELECTOR, "#divNext > a").click()  # 找到下一页
        Two(driver) # 第二页函数
        # gundong(driver, distance=600)
        time.sleep(1)
        driver.find_element(By.CSS_SELECTOR, "#ctlNext").click()
        # gundong(driver, 800)#调用滚动屏幕函数,如果不需要则注释掉

        # 最后交卷点击提交//*[@id="drv19_4"]/td[2]/a/i[1] //*[@id="drv19_4"]/td[3]/a/i[1]
        # time.sleep(random.randint(0, 1))

        # time.sleep(4)
        #
        # renzheng(driver)#智能认证函数调用
        # huakuai()#滑块函数调用
        print('已经提交了{}次问卷'.format(int(i) + int(1)))
        time.sleep(4)
        driver.quit()#停止

2.6、填写次数

这里写上你谷歌的地址,以及你驱动的地址,然后填上你需要完成的次数。

if __name__ == "__main__":
    # 填写谷歌浏览器的位置
    googleExe = r"D:\python目录\Win_1129160_chrome-win\chrome-win\chrome.exe"
    # 填写对应谷歌驱动的位置
    googleDriver = r"D:\python目录\Win_1129160_chromedriver_win32\chromedriver.exe"
    # 里面填写的数是表示要提交多少次问卷
    zonghe(3, googleExe, googleDriver)

三、完整代码展示

下面将完整代码展示给大家。

from selenium.webdriver.common.by import By  # 没有selenium库的(请在所用的环境下pip install selenium)
from selenium import webdriver  #selenium库
import random  # 用于产生随机数
import time  # 用于延时
import pyautogui  # 用于模拟人手


def gundong(driver, distance): #延时+屏幕滚动
    js = "var q=document.documentElement.scrollTop=" + str(distance)    #下拉像素(800是基于最顶端测算的距离)
    driver.execute_script(js)
    time.sleep(0.5)

def renzheng(driver):
    # 智能验证,找到智能认证的标签
    bth = driver.find_element_by_css_selector(
        '#layui-layer1 > div.layui-layer-btn.layui-layer-btn- > a.layui-layer-btn0')
    bth.click()#点击
    time.sleep(1)
    rectBottom = driver.find_element_by_css_selector('#rectBottom') #提交按钮
    rectBottom.click() #点击
    time.sleep(5)

def huakuai():
    # 当次数多了的时候就会出现滑块,这里是模拟人手解决滑块拖动
    pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
    time.sleep(1)
    pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒
    time.sleep(1)
    pyautogui.click(random.randint(652, 667), random.randint(793, 795))#让鼠标点击x,y处
    time.sleep(1)
    pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2秒
    time.sleep(1)
    pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1秒


def One(driver):
    # 第一页,通过f12发现可用的标签有十个,且第一个是废标签,所以不用管
    for i in range(1, 11):

        #对应的绝对子标签
        gundong(driver, i * 400)
        ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
        # 找到对应题,然后进行答题
        if i == 2:
            driver.find_element(By.XPATH, f'//*[@id="div{2}"]/div[2]/div[2]').click()

        elif i == 3:
            driver.find_element(By.XPATH,f'//*[@id="div{3}"]/div[2]/div[2]').click()
        else:
            for s in ans:
                iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
                random.choice(iSsA).click()
        time.sleep(random.randint(1, 2))

def Two(driver):
    # 第二页,通过f12发现可用的标签有11-25个,且第一个是废标签,所以不用管
    for i in range(11, 25):
        gundong(driver, i * 400)
        #对应的绝对子标签
        ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
        # gundong(driver, distance=800)
        if i == 17:
            driver.find_element(By.XPATH, '//*[@id="div17"]/div[2]/div[3]').click()
        elif i == 19:
            for j in range(1, 8):
                s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a/i[1]')
                s.click()
                time.sleep(1.5)
        elif i == 20:
            for j in range(1, 8):
                s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a')
                s.click()
                time.sleep(1.5)
        elif i == 22:
            for answer in ans:
                s = answer.find_elements(By.CSS_SELECTOR,".ui-checkbox")  # 对应的绝对子标签
                # 随机填几次
                for k in range(1, 4):  # 这里的7可以改成5,10,12
                    random.choice(s).click()  # 找到标签并点击
                time.sleep(random.randint(0, 1))
        else:
            for s in ans:
                iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
                random.choice(iSsA).click()
            time.sleep(random.randint(1, 2))


def zonghe(times, GoogleExe, GoogleDriver):
    for i in range(0, times):
        # 初始配置,地址
        url_survey = '你问卷的链接'
        option = webdriver.ChromeOptions()
        option.add_argument('--disable-automation')
        option.add_experimental_option('excludeSwitches', ['enable-automation'])
        option.add_experimental_option('useAutomationExtension', False)
        # 本地下载的谷歌浏览器地址
        option.binary_location = GoogleExe
        # 下载好的Chrome驱动的地址
        driver = webdriver.Chrome(executable_path=GoogleDriver, options=option)
        driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                               {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})

        driver.get(url_survey)
        One(driver) # 第一页函数
        # gundong(driver, distance=600)
        time.sleep(1)
        driver.find_element(By.CSS_SELECTOR, "#divNext > a").click()  # 找到下一页
        Two(driver) # 第二页函数
        # gundong(driver, distance=600)
        time.sleep(1)
        driver.find_element(By.CSS_SELECTOR, "#ctlNext").click()
        # gundong(driver, 800)#调用滚动屏幕函数,如果不需要则注释掉

        # 最后交卷点击提交//*[@id="drv19_4"]/td[2]/a/i[1] //*[@id="drv19_4"]/td[3]/a/i[1]
        # time.sleep(random.randint(0, 1))

        # time.sleep(4)
        #
        # renzheng(driver)#智能认证函数调用
        # huakuai()#滑块函数调用
        print('已经提交了{}次问卷'.format(int(i) + int(1)))
        time.sleep(4)
        driver.quit()#停止


if __name__ == "__main__":
    # 填写谷歌浏览器的位置
    googleExe = r"D:\python目录\Win_1129160_chrome-win\chrome-win\chrome.exe"
    # 填写对应谷歌驱动的位置
    googleDriver = r"D:\python目录\Win_1129160_chromedriver_win32\chromedriver.exe"
    # 里面填写的数是表示要提交多少次问卷
    zonghe(3, googleExe, googleDriver)

四、代码的修改及拓展

4.1、环境

如果你的问卷是其他的题目跟我的题目完全对不上怎么办,这里教你如何修改代码。

我们首先打开我们的谷歌浏览器,然后点击键盘上的F12开发者工具。

Python爬取问卷星内容 python刷问卷星调查问卷_Python爬取问卷星内容_05

4.2、所需地址

大家可使用CTRL+SHIFT+C来启动元素来找到我们需要的题号。

Python爬取问卷星内容 python刷问卷星调查问卷_python_06

4.3、修改地址

我们在这里可以查看到element、selector、xpath等多个地址。我们将css地址复制粘贴到代码对应位置即可。

Python爬取问卷星内容 python刷问卷星调查问卷_开发语言_07

4.4、演示修改地址

如何修改代码,话不多说将题号和div直接修改即可。如修改第二题,将第二题f‘后面直接修改即可。多选题和单选题相同,都是一样的步骤。

if i == 2:
            driver.find_element(By.XPATH, f'//*[@id="div{2}"]/div[2]/div[2]').click()

五、项目总结

Selenium是一个用于自动化Web应用程序测试的工具,它可以使用不同的编程语言进行使用,其中Python就是本次讲的全部内容。Selenium可以模拟用户和浏览器的交互,实现自动化测试和网站数据抓取等功能。问卷星是一种常见的在线调查工具,在Python中使用Selenium可以方便地完成对问卷的填写和提交的自动化操作。