当前位置:   article > 正文

python实现问卷星自动填写(详细版)_代码随机刷问卷

代码随机刷问卷

前言

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

一、安装环境

1.1 、selenium和pyautogui库

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

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

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

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

1.2 、驱动文件

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

首先打开设置

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

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

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

二、代码如下

2.1、导入所需库

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

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

2.2、验证信息

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

  1. def gundong(driver, distance): #延时+屏幕滚动
  2. js = "var q=document.documentElement.scrollTop=" + str(distance) #下拉像素(800是基于最顶端测算的距离)
  3. driver.execute_script(js)
  4. time.sleep(0.5)
  5. def renzheng(driver):
  6. # 智能验证,找到智能认证的标签
  7. bth = driver.find_element_by_css_selector(
  8. '#layui-layer1 > div.layui-layer-btn.layui-layer-btn- > a.layui-layer-btn0')
  9. bth.click()#点击
  10. time.sleep(1)
  11. rectBottom = driver.find_element_by_css_selector('#rectBottom') #提交按钮
  12. rectBottom.click() #点击
  13. time.sleep(5)

2.3、跳过滑块

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

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

2.4、程序所需函数选择

   2.4.1、单选题自定义函数

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

  1. def One(driver):
  2. # 第一页,通过f12发现可用的标签有十个,且第一个是废标签,所以不用管
  3. for i in range(1, 11):
  4. #对应的绝对子标签
  5. gundong(driver, i * 400)
  6. ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
  7. # 找到对应题,然后进行答题
  8. if i == 2:
  9. driver.find_element(By.XPATH, f'//*[@id="div{2}"]/div[2]/div[2]').click()
  10. elif i == 3:
  11. driver.find_element(By.XPATH,f'//*[@id="div{3}"]/div[2]/div[2]').click()
  12. else:
  13. for s in ans:
  14. iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
  15. random.choice(iSsA).click()
  16. time.sleep(random.randint(1, 2))

 2.4.2、多选题自定义函数

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

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

2.5、项目主要代码

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

  1. def zonghe(times, GoogleExe, GoogleDriver):
  2. for i in range(0, times):
  3. # 初始配置,地址
  4. url_survey = '你问卷的链接'
  5. option = webdriver.ChromeOptions()
  6. option.add_argument('--disable-automation')
  7. option.add_experimental_option('excludeSwitches', ['enable-automation'])
  8. option.add_experimental_option('useAutomationExtension', False)
  9. # 本地下载的谷歌浏览器地址
  10. option.binary_location = GoogleExe
  11. # 下载好的Chrome驱动的地址
  12. driver = webdriver.Chrome(executable_path=GoogleDriver, options=option)
  13. driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
  14. {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
  15. driver.get(url_survey)
  16. One(driver) # 第一页函数
  17. # gundong(driver, distance=600)
  18. time.sleep(1)
  19. driver.find_element(By.CSS_SELECTOR, "#divNext > a").click() # 找到下一页
  20. Two(driver) # 第二页函数
  21. # gundong(driver, distance=600)
  22. time.sleep(1)
  23. driver.find_element(By.CSS_SELECTOR, "#ctlNext").click()
  24. # gundong(driver, 800)#调用滚动屏幕函数,如果不需要则注释掉
  25. # 最后交卷点击提交//*[@id="drv19_4"]/td[2]/a/i[1] //*[@id="drv19_4"]/td[3]/a/i[1]
  26. # time.sleep(random.randint(0, 1))
  27. # time.sleep(4)
  28. #
  29. # renzheng(driver)#智能认证函数调用
  30. # huakuai()#滑块函数调用
  31. print('已经提交了{}次问卷'.format(int(i) + int(1)))
  32. time.sleep(4)
  33. driver.quit()#停止

2.6、填写次数

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

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

三、完整代码展示

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

  1. from selenium.webdriver.common.by import By # 没有selenium库的(请在所用的环境下pip install selenium)
  2. from selenium import webdriver #selenium库
  3. import random # 用于产生随机数
  4. import time # 用于延时
  5. import pyautogui # 用于模拟人手
  6. def gundong(driver, distance): #延时+屏幕滚动
  7. js = "var q=document.documentElement.scrollTop=" + str(distance) #下拉像素(800是基于最顶端测算的距离)
  8. driver.execute_script(js)
  9. time.sleep(0.5)
  10. def renzheng(driver):
  11. # 智能验证,找到智能认证的标签
  12. bth = driver.find_element_by_css_selector(
  13. '#layui-layer1 > div.layui-layer-btn.layui-layer-btn- > a.layui-layer-btn0')
  14. bth.click()#点击
  15. time.sleep(1)
  16. rectBottom = driver.find_element_by_css_selector('#rectBottom') #提交按钮
  17. rectBottom.click() #点击
  18. time.sleep(5)
  19. def huakuai():
  20. # 当次数多了的时候就会出现滑块,这里是模拟人手解决滑块拖动
  21. pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2
  22. time.sleep(1)
  23. pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1
  24. time.sleep(1)
  25. pyautogui.click(random.randint(652, 667), random.randint(793, 795))#让鼠标点击x,y处
  26. time.sleep(1)
  27. pyautogui.moveTo(random.randint(494, 496), 791, 0.2)#控制鼠标移动到x,y处,耗时0.2
  28. time.sleep(1)
  29. pyautogui.dragTo(random.randint(888, 890), 791, 1)#让鼠标点击并拖拽到x,y处,耗时1
  30. def One(driver):
  31. # 第一页,通过f12发现可用的标签有十个,且第一个是废标签,所以不用管
  32. for i in range(1, 11):
  33. #对应的绝对子标签
  34. gundong(driver, i * 400)
  35. ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
  36. # 找到对应题,然后进行答题
  37. if i == 2:
  38. driver.find_element(By.XPATH, f'//*[@id="div{2}"]/div[2]/div[2]').click()
  39. elif i == 3:
  40. driver.find_element(By.XPATH,f'//*[@id="div{3}"]/div[2]/div[2]').click()
  41. else:
  42. for s in ans:
  43. iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
  44. random.choice(iSsA).click()
  45. time.sleep(random.randint(1, 2))
  46. def Two(driver):
  47. # 第二页,通过f12发现可用的标签有11-25个,且第一个是废标签,所以不用管
  48. for i in range(11, 25):
  49. gundong(driver, i * 400)
  50. #对应的绝对子标签
  51. ans = driver.find_elements(By.XPATH, f'//*[@id="div{i}"]/div[2]')
  52. # gundong(driver, distance=800)
  53. if i == 17:
  54. driver.find_element(By.XPATH, '//*[@id="div17"]/div[2]/div[3]').click()
  55. elif i == 19:
  56. for j in range(1, 8):
  57. s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a/i[1]')
  58. s.click()
  59. time.sleep(1.5)
  60. elif i == 20:
  61. for j in range(1, 8):
  62. s = driver.find_element(By.XPATH, f'//*[@id="drv{i}_{j}"]/td[{random.randint(2, 5)}]/a')
  63. s.click()
  64. time.sleep(1.5)
  65. elif i == 22:
  66. for answer in ans:
  67. s = answer.find_elements(By.CSS_SELECTOR,".ui-checkbox") # 对应的绝对子标签
  68. # 随机填几次
  69. for k in range(1, 4): # 这里的7可以改成51012
  70. random.choice(s).click() # 找到标签并点击
  71. time.sleep(random.randint(0, 1))
  72. else:
  73. for s in ans:
  74. iSsA = s.find_elements(By.CSS_SELECTOR, '.ui-radio')
  75. random.choice(iSsA).click()
  76. time.sleep(random.randint(1, 2))
  77. def zonghe(times, GoogleExe, GoogleDriver):
  78. for i in range(0, times):
  79. # 初始配置,地址
  80. url_survey = '你问卷的链接'
  81. option = webdriver.ChromeOptions()
  82. option.add_argument('--disable-automation')
  83. option.add_experimental_option('excludeSwitches', ['enable-automation'])
  84. option.add_experimental_option('useAutomationExtension', False)
  85. # 本地下载的谷歌浏览器地址
  86. option.binary_location = GoogleExe
  87. # 下载好的Chrome驱动的地址
  88. driver = webdriver.Chrome(executable_path=GoogleDriver, options=option)
  89. driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
  90. {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
  91. driver.get(url_survey)
  92. One(driver) # 第一页函数
  93. # gundong(driver, distance=600)
  94. time.sleep(1)
  95. driver.find_element(By.CSS_SELECTOR, "#divNext > a").click() # 找到下一页
  96. Two(driver) # 第二页函数
  97. # gundong(driver, distance=600)
  98. time.sleep(1)
  99. driver.find_element(By.CSS_SELECTOR, "#ctlNext").click()
  100. # gundong(driver, 800)#调用滚动屏幕函数,如果不需要则注释掉
  101. # 最后交卷点击提交//*[@id="drv19_4"]/td[2]/a/i[1] //*[@id="drv19_4"]/td[3]/a/i[1]
  102. # time.sleep(random.randint(0, 1))
  103. # time.sleep(4)
  104. #
  105. # renzheng(driver)#智能认证函数调用
  106. # huakuai()#滑块函数调用
  107. print('已经提交了{}次问卷'.format(int(i) + int(1)))
  108. time.sleep(4)
  109. driver.quit()#停止
  110. if __name__ == "__main__":
  111. # 填写谷歌浏览器的位置
  112. googleExe = r"D:\python目录\Win_1129160_chrome-win\chrome-win\chrome.exe"
  113. # 填写对应谷歌驱动的位置
  114. googleDriver = r"D:\python目录\Win_1129160_chromedriver_win32\chromedriver.exe"
  115. # 里面填写的数是表示要提交多少次问卷
  116. zonghe(3, googleExe, googleDriver)

四、代码的修改及拓展

4.1、环境

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

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

4.2、所需地址

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

4.3、修改地址

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

4.4、演示修改地址

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

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

五、项目总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/444320
推荐阅读
相关标签
  

闽ICP备14008679号