当前位置:   article > 正文

记录一个python小白写问卷星定时答题代码的过程_python定时提交问卷星

python定时提交问卷星

萌生想法的原因

学校的一些学分要自己抢公众号的活动修满的,要蹲点等公众号发的定时问卷开始填写,几乎秒没。

每次和舍友一起抢,发现大家手速网速各有不同,最后几家欢喜几家愁。

于是萌生了想法——通过代码解决这个问卷星抢活动,定时定点按照相关内容填写,然后自动提交。

目前只在学校学过一点简单的python,经过查阅了一番资料终于弄出了一个符合我目前设想的效果。

第一代代码

在微信公众号找到了一段代码,修改了一些参数打算就开始run了。

1.参考的代码

原代码微信公众号文章链接

2.代码展示

  1. import time
  2. from selenium import webdriver
  3. #启动谷歌浏览器
  4. driver = webdriver.Chrome()
  5. driver.maximize_window()
  6. driver.implicitly_wait(2)
  7. driver.get("问卷网址") # 输入网址
  8. def dingshikQ(time, driver, name, nianji, number, Email):
  9. time_start = time.time() #开始计时
  10. print(time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime()))
  11. driver.refresh()
  12. #设置显式等待
  13. from selenium.webdriver.support import expected_conditions as EC
  14. from selenium.webdriver.common.by import By
  15. from selenium import webdriver
  16. wait1 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  17. wait1.until(EC.presence_of_element_located((By.XPATH,"//div[contains(text(),'姓名')]/following-sibling::div[1]/input[1]")))
  18. # 开始填写
  19. driver.find_element_by_xpath("//div[contains(text(),'姓名')]/following-sibling::div[1]/input[1]").send_keys("%s"%name) #输入姓名
  20. driver.find_element_by_xpath("//div[contains(text(),'年级')]/following-sibling::div[1]/input[1]").send_keys("%s"%nianji) #输入年级
  21. driver.find_element_by_xpath("//div[contains(text(),'学号')]/following-sibling::div[1]/input[1]").send_keys("%s"%number) #输入学号
  22. driver.find_element_by_xpath("//div[contains(text(),'邮箱')]/following-sibling::div[1]/input[1]").send_keys("%s"%Email) #输入邮箱
  23. # 点击提交
  24. driver.find_element_by_xpath("//div[contains(text(),'提交')]").click()
  25. if '请点击'in driver.find_element_by_xpath("//div[contains(text(),'请点击')]").text:
  26. driver.refresh() # #浏览器刷新(点击刷新按钮)
  27. wait2 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  28. wait2.until(EC.presence_of_element_located((By.XPATH,"//div[contains(text(),'是否继续')]")))
  29. driver.find_element_by_xpath("//button[contains(text(),'确认')]").click()
  30. wait3 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  31. wait3.until(EC.presence_of_element_located((By.XPATH,"//div[contains(text(),'提交')]"))) #这里必须是三个括号
  32. driver.find_element_by_xpath("//div[contains(text(),'提交')]").click()
  33. time_end = time.time() #结束计时
  34. time_c= time_end - time_start #运行所花时间
  35. print('time cost=%.1fs'%time_c)
  36. name='姓名'
  37. nianji='年级'
  38. number='12345678'
  39. Email='12345678@163.com'
  40. dingshikQ(time, driver, name, nianji, number, Email)

3.发现的问题及解决方案

修改了一些参数run了以后,发现run不起来。经过一番资料查阅,发现是selenium库的更新换代,引用一些模块的时候方式变化了。

然后就增加了‘from selenium.webdriver.support.wait import WebDriverWait‘的引用和修改了每一条xpath的引用,代码终于run起来了

引入WebDriverWait模块参考的博客

xpath路径引用方式的修改参考博客

第二代代码

1.代码展示和效果图

  1. import time
  2. from selenium import webdriver
  3. #启动火狐浏览器
  4. driver = webdriver.Firefox()
  5. driver.maximize_window()
  6. driver.implicitly_wait(2)
  7. driver.get("问卷地址") # 输入网址
  8. def dingshikQ(time, driver, name, nianji, number, Email):
  9. time_start = time.time() #开始计时
  10. print(time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime()))#输出本地时间
  11. driver.refresh() #刷新浏览器
  12. #设置显式等待
  13. from selenium.webdriver.support import expected_conditions as EC
  14. from selenium.webdriver.common.by import By
  15. from selenium.webdriver.support.wait import WebDriverWait
  16. wait1 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  17. wait1.until(EC.presence_of_element_located((By.XPATH,"//div[contains(text(),'姓名')]/following-sibling::div[1]/input[1]")))
  18. # 开始填写
  19. driver.find_element(By.XPATH,"//div[contains(text(),'姓名')]/following-sibling::div[1]/input[1]").send_keys("%s"%name) #输入
  20. driver.find_element(By.XPATH,"//div[contains(text(),'年级')]/following-sibling::div[1]/input[1]").send_keys("%s"%nianji) #输入
  21. driver.find_element(By.XPATH,"//div[contains(text(),'学号')]/following-sibling::div[1]/input[1]").send_keys("%s"%number) #输入
  22. driver.find_element(By.XPATH,"//div[contains(text(),'邮箱')]/following-sibling::div[1]/input[1]").send_keys("%s"%Email) #输入
  23. # 点击提交
  24. driver.find_element(By.XPATH,"//div[contains(text(),'提交')]").click()
  25. if '请点击'in driver.find_element(By.XPATH,"//div[contains(text(),'请点击')]").text:
  26. driver.refresh() # #浏览器刷新(点击刷新按钮)
  27. wait2 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  28. wait2.until(EC.presence_of_element_located((By.XPATH,"//div[contains(text(),'是否继续')]")))
  29. driver.find_element(By.XPATH,"//button[contains(text(),'确认')]").click()
  30. wait3 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  31. wait3.until(EC.presence_of_element_located((By.XPATH,"//div[contains(text(),'提交')]"))) #这里必须是三个括号
  32. driver.find_element(By.XPATH,"//div[contains(text(),'提交')]").click()
  33. time_end = time.time() #结束计时
  34. time_c= time_end - time_start #运行所花时间
  35. print('time cost=%.1fs'%time_c)
  36. name='姓名'
  37. nianji='年级'
  38. number='12345678'
  39. Email='12345678@163.com'
  40. dingshikQ(time, driver, name, nianji, number, Email)

2.发现的问题

run了以后电脑自动打开并填写了,但会遇到一个智能验证的按钮,电脑操作太快没反应过就到了上述画面。即使我点了如图的确定再重新手打后,按智能验证的按钮还是不能通过。

3.解决方案:

上csdn搜索相关解决问卷星的智能验证按钮的问题。发现原来这是问卷星的发爬虫的一种机制,通过识别selenium就会弹出这个按钮。目前最新能够解决的办法是:

①下载旧版chrome浏览器

要用chrome浏览器打开问卷地址,而且是还要下载旧版的chrome浏览器复制旧版的chrome.exe到python的工作目录。

参考博客

下载旧版chrome并复制到python工作目录参考博客

②引入一段反反爬虫的代码

代码具体如下:
  1. url = "问卷地址" #实例url
  2. option = webdriver.ChromeOptions()
  3. option.add_experimental_option('excludeSwitches', ['enable-automation'])
  4. option.add_experimental_option('useAutomationExtension', False)
  5. driver = webdriver.Chrome(service=s,options=option)
  6. driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
  7. })
  8. driver.get(url)
参考博客

引入反反爬虫参考代码

③模拟点击智能验证按钮的代码:

代码具体如下
  1. # 先点确认
  2. try:
  3. browser.find_element(By.XPATH, '//*[@id="layui-layer1"]/div[3]/a[1]').click()
  4. time.sleep(1)
  5. except:
  6. pass
  7. # 再点智能验证提示框,进行智能验证
  8. try:
  9. browser.find_element(By.XPATH, '//*[@id="SM_BTN_WRAPPER_1"]').click()
  10. time.sleep(3)
  11. except:
  12. pass
  13. ————————————————
  14. 版权声明:本文为CSDN博主「理工大猪猪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  15. 原文链接:https://blog.csdn.net/weixin_52030368/article/details/128772162
参考博客

点击智能验证按钮的代码参考博客

修改后的第三代代码

1.代码展示

按照上述操作修改了自己的代码如下:

  1. import time
  2. from selenium import webdriver
  3. #反反爬虫
  4. from selenium.webdriver.chrome.options import Options
  5. url = "问卷地址" #实例url
  6. option = webdriver.ChromeOptions()
  7. option.add_experimental_option('excludeSwitches', ['enable-automation'])
  8. option.add_experimental_option('useAutomationExtension', False)
  9. driver = webdriver.Chrome(options=option)
  10. driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
  11. })
  12. driver.get(url)
  13. #定义抢课函数
  14. def dingshikQ(time, driver, name, nianji, number, Email):
  15. time_start = time.time() #开始计时
  16. print(time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime()))#输出本地时间
  17. driver.refresh() #刷新浏览器
  18. #设置显式等待
  19. from selenium.webdriver.support import expected_conditions as EC
  20. from selenium.webdriver.common.by import By
  21. from selenium.webdriver.support.wait import WebDriverWait
  22. wait1 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  23. wait1.until(EC.presence_of_element_located((By.XPATH,"//div[contains(text(),'姓名')]/following-sibling::div[1]/input[1]")))
  24. # 开始填写
  25. driver.find_element(By.XPATH,"//div[contains(text(),'姓名')]/following-sibling::div[1]/input[1]").send_keys("%s"%name) #输入
  26. driver.find_element(By.XPATH,"//div[contains(text(),'学号')]/following-sibling::div[1]/input[1]").send_keys("%s"%nianji) #输入
  27. driver.find_element(By.XPATH,"//div[contains(text(),'学院')]/following-sibling::div[1]/input[1]").send_keys("%s"%number) #输入
  28. driver.find_element(By.XPATH,"//div[contains(text(),'请输入您的手机号码')]/following-sibling::div[1]/input[1]").send_keys("%s"%Email) #输入
  29. # 点击提交
  30. driver.find_element(By.XPATH,"//div[contains(text(),'提交')]").click()
  31. # 先点确认
  32. try:
  33. driver.find_element(By.XPATH, '//*[@id="layui-layer1"]/div[3]/a[1]').click()
  34. time.sleep(1)
  35. except:
  36. pass
  37. # 再点智能验证提示框,进行智能验证
  38. try:
  39. driver.find_element(By.XPATH, '//*[@id="SM_BTN_WRAPPER_1"]').click()
  40. time.sleep(3)
  41. except:
  42. pass
  43. time_end = time.time() #结束计时
  44. time_c= time_end - time_start #运行所花时间
  45. print('time cost=%.1fs'%time_c)
  46. name='林芝'
  47. nianji='大一'
  48. number='12345678'
  49. Email=159123456789
  50. dingshikQ(time, driver, name, nianji, number, Email)

2.效果图

3.发现的问题以及解决方案:

还是没能自动点击这个按钮。后来仔细对比自己的代码和原文博客的代码,原来是那段反反爬虫的代码要放在定义的函数下面。

对比参考的博客

然后就run了,在问卷星发布的问卷后台那里一看,果然看到了自己刚交的问卷。

第四代代码(终版)

代码展示

还添加了定时的效果(还有一些小改动,删除了函数的形参driver、显示等待、计时功能,添加了print('恭喜!问卷提交成功!'))

  1. #引入一些需要用到的库
  2. import time
  3. from selenium import webdriver
  4. from selenium.webdriver.chrome.options import Options
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from selenium.webdriver.common.by import By
  7. from selenium.webdriver.support.wait import WebDriverWait
  8. #定义抢活动函数
  9. def dingshikQ(time, name, nianji, number, Email):
  10. while True:
  11. time_now=time.strftime("%Y-%m-%d-%H:%M:%S", time.localtime())
  12. #定时问卷
  13. if time_now=="2023-02-08-19:28:00":
  14. #解决反爬虫的参数
  15. url = "https://www.wjx.cn/vm/P3JxRus.aspx" #实例url
  16. option = webdriver.ChromeOptions()
  17. option.add_experimental_option('excludeSwitches', ['enable-automation'])
  18. option.add_experimental_option('useAutomationExtension', False)
  19. driver = webdriver.Chrome(options=option)
  20. driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
  21. })
  22. driver.get(url)
  23. # 开始填写
  24. driver.find_element(By.XPATH,"//div[contains(text(),'学院名称')]/following-sibling::div[1]/input[1]").send_keys("%s"%name) #输入
  25. driver.find_element(By.XPATH,"//div[contains(text(),'学号')]/following-sibling::div[1]/input[1]").send_keys("%s"%nianji) #输入
  26. driver.find_element(By.XPATH,"//div[contains(text(),'姓名')]/following-sibling::div[1]/input[1]").send_keys("%s"%number) #输入
  27. driver.find_element(By.XPATH,"//div[contains(text(),'专业')]/following-sibling::div[1]/input[1]").send_keys("%s"%Email) #输入
  28. submit = driver.find_element(By.XPATH,"//*[@id='ctlNext']") #网页源代码的xpath
  29. submit.click() #点击
  30. #延时 太快会被检测是脚本
  31. time.sleep(0.5)
  32. # 模拟点击智能验证按钮
  33. # 先点确认
  34. wait3 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  35. wait3.until(EC.presence_of_element_located((By.XPATH,'//*[@id="layui-layer1"]/div[3]/a[1]')))
  36. driver.find_element(By.XPATH,'//*[@id="layui-layer1"]/div[3]/a[1]').click()
  37. time.sleep(1)
  38. # 再点智能验证提示框,进行智能验证
  39. wait3 = webdriver.support.wait.WebDriverWait(driver,60,0.01)
  40. wait3.until(EC.presence_of_element_located((By.XPATH,'//*[@id="SM_BTN_WRAPPER_1"]')))
  41. driver.find_element(By.XPATH,'//*[@id="SM_BTN_WRAPPER_1"]').click()
  42. time.sleep(3)
  43. print('恭喜!问卷提交成功!')
  44. name='经济与管理'
  45. nianji='20975356'
  46. number='小欧欧'
  47. Email='工商管理'
  48. dingshikQ(time, name, nianji, number, Email)

觉得还可以改善的地方:

①运行的时间问题

因为防止被检测出是脚本添加了sleep(),增加了运行时间;但是增加了运行时间同时降低提交问卷的速度,不利于和学校那些’手速怪‘竞争名额。(试过不用sleep,但是太短的时间后台收不到问卷)

②其他可能出现的情形

问卷还有微信登录和文本检测的功能,如何解决微信登录还有手机号码的输入时而文本时而数字的问题。

③做成一个插件

做成一个插件,一打开就有一个窗口填写相关的数值,不需要一直翻找代码那么麻烦

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

闽ICP备14008679号