python自动化------问卷星刷问卷3.0版本

接上,之前做的问卷星刷问卷的功能单一,每个题目只能选一个选项。现在的3.0版本功能增加了计数器(刷了几份问卷)、多选项的选择、通过滑块验证。想要了解之前的相关信息请看下面的链接:

隔壁寝室刷问卷刷疯了,我们寝室则相反,打游戏的同时问卷份数也在增加,隔壁寝室的人投来羡慕的目光,向我要代码!!

python基础知识------生成多个随机数

本篇文章将会将该程序拆分成代码块逐一讲解其功能。

注意:经过本人测试,刷问卷,一次只能刷51份,第52次运行程序时,会出现滑动验证,即使程序中写了过滑动验证的相关代码并且成功通过了滑动滑块,但是问卷星会重新弹出是否进行验证,然后又重新弹出滑动验证码。手动滑动,接下来会进行以上的循环。关闭浏览器,问卷星份数并未增加。

           所以即使增加了滑动验证码的代码,其结果还是只能在短期内刷51份。当然,当出现滑动验证码时,只要暂停程序,过一个小时(具体时间未测量)后又能重新开始刷了。如有不同想法和测试结果,请指正。

目录

一、模块导入

二、代码块的解析

1.生成多选题不重复的随机选项

2.计数器(记录运行次数)

3.伪装selenium

4.滑动验证码---滑动距离

5.滑动验证码---滑动滑块

6.定时运行程序

7.run()函数的编写

三、源代码及结果展示

四、总结


一、模块导入

import random
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
import schedule as schedule

二、代码块的解析

1.生成多选题不重复的随机选项

# 多选题的多个选项
def int_random(m, n, o):p = []while len(p) < o:new_int = random.randint(m, n)if (new_int not in p):p.append(new_int)else:passreturn p

该代码实现的功能是生成m到n之间的o个不重复的数字,可用于多选题随机选项的选择,详细内容请看我之前的博文

python基础知识------生成多个随机数

2.计数器(记录运行次数)

# 计数器
count = 0
def sum():global countcount += 1w = print("第{}次运行".format(count))return w

这里的global的用法是在局部函数中对全局变量重新赋值,这样就起到了每运行一次程序,计数器计数的功能。

3.伪装selenium

    url = 'https://www.wjx.cn/vm/maBODlH.aspx'# 躲避智能检测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)

该代码在之前的博文中讲过具体原因

隔壁寝室刷问卷刷疯了,我们寝室则相反,打游戏的同时问卷份数也在增加,隔壁寝室的人投来羡慕的目光,向我要代码!!

4.滑动验证码---滑动距离

def get_track(distance):  # distance为传入的总距离# 移动轨迹track = []# 当前位移current = 0# 计算间隔t = 0.2# 初速度v = 0while current < distance:# 加速度a = 50v0 = v# 当前速度v = v0 + a * t# 移动距离# move = v0 * t + 1 / 2 * a * t * tmove = v0 * t + a * t# 当前位移current += move# 加入轨迹track.append(round(move))return track  # track列表 返回的是整个滑动条的多个焦点,可以模拟鼠标的缓慢滑动

首先该代码返回的是track列表(其中包含了移动的轨迹),定义当前位移current=0,时间间隔t=0.2,初始速度v=0,接下来通过判断语句,判断当前距离是否小于你所输入的总距离,如果成立,则通过物理的知识,通过加速度a,速度v计算位移,然后将它加到current中。

注:这里的a、t、v都可以自定义,甚至我连move = v0 * t + 1 / 2 * a * t * t这个公式也更改了。

因为python自动化讲究效率,速度很关键,而且对于这类简单的滑动验证,不用那些先加速后减速的套路,所以只需要一直加速即可。

5.滑动验证码---滑动滑块

def move_to_gap(slider, tracks):  # slider是要移动的滑块,tracks是要传入的移动轨迹ActionChains(driver).click_and_hold(slider).perform()for x in tracks:ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()time.sleep(0.1)ActionChains(driver).release().perform()

 ①ActionChains(driver).click_and_hold(slider).perform()中
      click_and_hold(slider)---点击鼠标左键,不松开,其中slider为需要定位要移动的滑块

        (例如huakuai = driver.find_element_by_css_selector('#nc_1_n1z'))
      perform()---执行该动作;

②接下来遍历tracks

      ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()中

      move_by_offset(xoffset=x, yoffset=0)---鼠标向右移动x的px

③ActionChains(driver).release().perform()中

      release()---释放

    注:4和5一般在一起使用

6.定时运行程序

def run():passschedule.every(5).seconds.do(run)while True:schedule.run_pending()

run()函数为主函数,通过schedule实现每隔5秒运行一次程序

7.run()函数的编写

代码如下

def run():global driverurl = 'https://www.wjx.cn/vm/maBODlH.aspx'# 躲避智能检测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)sum()# 总共有13个题目i = 1while i <= 13:base_xpath1 = '//*[@id="div{}"]'.format(i)base_xpath2 = base_xpath1 + '/div[2]/div'a = driver.find_elements_by_xpath(base_xpath2)# print(len(a))# 在选项个数范围内,随机生成一个数字 如有四个选项,随机生成数字3b = random.randint(1, len(a))# print(b)# 通过随机数字,点击该数字的选项# time.sleep(1)# 当第六个问题回答第四个选项(其他)时,需要填写if i == 6 and b == 4:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()# time.sleep(1)# 这里你可以每隔一段时间更改send_keys中的内容,也可以将答案写出来,然后随机选择哪个选项driver.find_element_by_css_selector('#tqq6_4').send_keys('QQ群和微信群')elif i == 5 or i == 7 or i == 8 or i == 11:q = int_random(1, len(a), b)# sort函数表示将列表排序,如果未加参数表示从小到大排列q.sort()for r in q:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, r)).click()# time.sleep(0.5)else:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()# 当第三个问题答案是是时,跳到5if i == 3 and b == 1:i = 5else:i += 1
#     # 点击提交按钮time.sleep(0.5)driver.find_element_by_xpath('//*[@id="ctlNext"]').click()# 出现点击验证码验证time.sleep(1)driver.find_element_by_xpath('//*[@id="alert_box"]/div[2]/div[2]/button').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="rectMask"]').click()time.sleep(4)try:huakuai = driver.find_element_by_css_selector('#nc_1_n1z')move_to_gap(huakuai, get_track(328))except:passfinally:# 关闭页面handles = driver.window_handlesdriver.switch_to.window(handles[0])time.sleep(0.5)# 刷新页面(可要可不要)# driver.refresh()# 关闭当前页面,如果只有一个页面,则也关闭浏览器driver.close()

这里面的代码需要你根据具体问卷星的内容进行改写。

问卷星问卷的网址为浙水院经管学院2020级大学生勤工俭学和兼职问题调查【复制】,大家可以自己查看一下问卷星问卷内容,对于该问卷

首先,题目为13个,所以判断条件为i <= 13,

len(a)为选项的个数,b为在选项个数内随机生成整数

如果第六个问题,随机数b为4时,则还要填写文本内容;

如果是第5、7、8、11个问题,则调用上面1.生成多选题不重复的随机选项的函数,再通过sort()函数将列表从小到大排列(这一过程可省略),最后遍历该列表,选择里面生成的随机选项。

剩下的就是单选题了,这个比较简单

对于那些隐藏的题目,即当且仅当选择了前面某题的某选项才出现时,需要重新在if语句中写,

并且该if语句要放在所以if语句的最后,因为这个if中含有i,如果放前面会因为i提前变化,导致找不到相关内容,最终报错。

写好这些以后,就开始点击提交问卷按钮,并开始进行验证了。刷问卷选项时可以不设间隔时间,但是以下的操作就需要足够时间,需要用到time.sleep(),不然会使得刷问卷失败。所以刷问卷所需时长主要花在验证这里。

    try:huakuai = driver.find_element_by_css_selector('#nc_1_n1z')move_to_gap(huakuai, get_track(328))except:passfinally:# 关闭页面handles = driver.window_handlesdriver.switch_to.window(handles[0])time.sleep(0.5)# 刷新页面(可能不需要)# driver.refresh()# 关闭当前页面,如果只有一个页面,则也关闭浏览器driver.close()

该代码段表示,先执行try代码块,如果发现错误,则执行except代码块,finally表示不管代码会不会报错,都会执行finally代码块。

在本代码中,前51次不会出现滑块验证,因此执行try代码块时本应该会报错,但是我们将except段pass,使得代码不会报错,最终不管代码是否会报错,都会执行finally代码块。

当然,如上所说,即使过了滑动验证,还是会重新弹出滑动验证,导致无法提交,份数也不会增加,所以我们可以不用在代码中加入这段。

    # 点击提交按钮time.sleep(0.5)driver.find_element_by_xpath('//*[@id="ctlNext"]').click()# 出现点击验证码验证time.sleep(1)driver.find_element_by_xpath('//*[@id="alert_box"]/div[2]/div[2]/button').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="rectMask"]').click()time.sleep(4)# 关闭页面handles = driver.window_handlesdriver.switch_to.window(handles[0])time.sleep(1)# 刷新页面(可能不需要)# driver.refresh()# 关闭当前页面,如果只有一个页面,则也关闭浏览器driver.close()

所以也不需要用到

get_track(distance)和move_to_gap(slider, tracks)这两个函数。

三、源代码及结果展示

# -*- coding: utf-8-*-
import random
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
import schedule as schedule
# 多选题的多个选项
def int_random(m, n, o):p = []while len(p) < o:new_int = random.randint(m, n)if (new_int not in p):p.append(new_int)else:passreturn p
# 计数器
count = 0
def sum():global countcount += 1w = print("第{}次运行".format(count))return wdef get_track(distance):  # distance为传入的总距离# 移动轨迹track = []# 当前位移current = 0# 计算间隔t = 0.2# 初速度v = 0while current < distance:a = 50v0 = v# 当前速度v = v0 + a * t# 移动距离# move = v0 * t + 1 / 2 * a * t * tmove = v0 * t + a * t# 当前位移current += move# 加入轨迹track.append(round(move))return track  # list 返回的是整个滑动条的多个焦点,可以模拟鼠标的缓慢滑动def move_to_gap(slider, tracks):  # slider是要移动的滑块,tracks是要传入的移动轨迹ActionChains(driver).click_and_hold(slider).perform()for x in tracks:ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()time.sleep(0.1)ActionChains(driver).release().perform()def run():global driverurl = 'https://www.wjx.cn/vm/maBODlH.aspx'# 躲避智能检测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)sum()# 总共有13个题目i = 1while i <= 13:base_xpath1 = '//*[@id="div{}"]'.format(i)base_xpath2 = base_xpath1 + '/div[2]/div'a = driver.find_elements_by_xpath(base_xpath2)# print(len(a))# 在选项个数范围内,随机生成一个数字 如有四个选项,随机生成数字3b = random.randint(1, len(a))# print(b)# 通过随机数字,点击该数字的选项# time.sleep(1)# 当第六个问题回答第四个选项(其他)时,需要填写if i == 6 and b == 4:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()# time.sleep(1)# 这里你可以每隔一段时间更改send_keys中的内容,也可以将答案写出来,然后随机选择哪个选项driver.find_element_by_css_selector('#tqq6_4').send_keys('QQ群和微信群')elif i == 5 or i == 7 or i == 8 or i == 11:q = int_random(1, len(a), b)# sort函数表示将列表排序,如果未加参数表示从小到大排列q.sort()for r in q:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, r)).click()# time.sleep(0.5)else:driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()# 当第三个问题答案是是时,跳到5if i == 3 and b == 1:i = 5else:i += 1
#     # 点击提交按钮time.sleep(0.5)driver.find_element_by_xpath('//*[@id="ctlNext"]').click()# 出现点击验证码验证time.sleep(1)driver.find_element_by_xpath('//*[@id="alert_box"]/div[2]/div[2]/button').click()time.sleep(0.5)driver.find_element_by_xpath('//*[@id="rectMask"]').click()time.sleep(4)try:huakuai = driver.find_element_by_css_selector('#nc_1_n1z')move_to_gap(huakuai, get_track(328))except:passfinally:# 关闭页面handles = driver.window_handlesdriver.switch_to.window(handles[0])time.sleep(0.5)# 刷新页面(可能不需要)# driver.refresh()# 关闭当前页面,如果只有一个页面,则也关闭浏览器driver.close()schedule.every(1).seconds.do(run)while True:schedule.run_pending()

该结果刷的是另外一份问卷

四、总结

在发这篇博文之前,我已经帮三个人刷过问卷了,每一种问卷内容都不一样,run()函数需要自己写。

​​​​​​

 其中有些问卷非常复杂(如下),你需要花时间了解问卷,然后再写程序

 

现在,问卷星自动化刷问卷3.0版本已经完结,如果有其他想法的,欢迎和我交流,如果上述有误的,请指正!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44967.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何愉快的填写问卷星

从业务开发&#xff0c;了解http本质。 问卷星代刷方法: pythonselenium 通过自动化测试工具正常填写&#xff0c;方法低效&#xff0c;容易出现安全检测&#xff08;本文不讲&#xff09;。post请求&#xff0c;模拟包发送&#xff0c;简单快捷&#xff0c;跳过安全检测&…

问卷星最新调研爬虫自动填写

利用简单权重设置选项比例分配以及条件判断语句即可将问卷往你选择的放向走&#xff0c;需要对前端稍微了解即可&#xff0c;用谷歌的开发者工具查看元素 例如&#xff1a;check rank[i].find_elements(byBy.CLASS_NAME,value"ui-radio") from selenium import webd…

仿造问卷星--开发一套调查问卷设计工具(2/3)--完整流程

本章主要内容是完善index.js逻辑功能。 1&#xff0c;修改index.html&#xff0c;直接copy html和css文件直接从源码中拷贝&#xff1a; html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-eq…

Python自动化问卷填写-问卷星(含完整代码)

目录 一、环境安装二、代码分析&#xff08;一&#xff09;库的引用&#xff08;二&#xff09;驱动的运行&#xff08;三&#xff09;各类题型的程序&#xff08;四&#xff09;主程序&#xff08;根据问卷客制&#xff09; 三、完整代码 由于网上的问卷星填写代码良莠不齐&am…

Python自动化填写问卷星问卷

本文使用pyhton实现常见的问卷星问卷自动化填写。如果出现智能验证&#xff0c;本文还不能有效绕过问卷星提交时出现的智能检测&#xff0c;还需要手动点击智能检测才能完成问卷的填写。 在网络问卷中&#xff0c;我们常见的问题有单选题、多选题和李克勤量表题&#xff0c;如下…

python自动填写问卷星

python自动填写问卷星 参考链接1 参考链接2 用python实现自动填问卷&#xff0c;通过智能验证以及滑动验证 1. 下载浏览器驱动 python自动化填写问卷需要依赖浏览器驱动,这里使用的是谷歌浏览器&#xff0c;所以需要下载chromedriver&#xff0c;且下载的版本要和浏览器版本…

问卷星问卷数据怎么快速导入SPSSAU?

最近收到小伙伴询问问卷星导入的问卷数据怎么编码&#xff1f; 现在的问卷调查&#xff0c;很多都是通过网络问卷的方式进行&#xff0c;问卷星是一个专业的在线问卷调查、测评投票平台&#xff0c;如果你的问卷正好是在问卷星网站发放&#xff0c;填答&#xff0c;回收数据&am…

python问卷星模拟提交

*一、前言 ** 笔者在家闲得无聊&#xff0c;突然想突破一下问卷星的反爬虫机制&#xff0c;顺便刷刷问卷&#xff0c;于是就开始分析了。 ** 二、分析过程 ** 1、fiddler抓包 模拟提交首先当然是打开fiddler看看提交了什么包啦。 2、分析不变参数 我们先来看不变的参数&…

使用python实现问卷星自动答题功能——基础篇

题主在学习的过程中&#xff0c;老是有人来让填问卷星&#xff0c;就觉得人填的很麻烦&#xff0c;于是就自己动手写了一个python脚本来实现自动填写问卷星 1.首先我们得学会使用python里面的一个库&#xff0c;selenium&#xff0c;这个库是用来专门面对浏览器的一个库&#…

用Python实现问卷星自动填写(超详细!!!)

用Python实现问卷星自动填写&#xff08;超详细&#xff01;&#xff01;&#xff01;&#xff09; 前言一、配置环境1.1安装依赖1.2安装驱动 二、实战处理2.1、引入库函数2.2、程序所需函数详解&#xff08;1&#xff09;自定义单选函数&#xff08;2&#xff09;自定义多选函…

自动填写问卷星并提交

自动填写问卷星并提交 鉴于好多小伙伴要做数据分析的时候发放大量的问卷&#xff0c;但收回来的却寥寥无几&#xff0c;还受到其他小伙伴的冷眼&#xff0c;所以在下决定通过代码的方式&#xff0c;来实现问卷星的自动填写并提交。 以谷歌浏览器为例 1.随便到一个页面&#x…

【python】自动填写问卷星问卷及提交

前言&#xff1a;问卷是很好的网络调查方式之一&#xff0c;近年来&#xff0c;问卷星被广泛应用于各方面的调查。本文介绍了利用python代码自动填写问卷星基本题目&#xff0c;拥有自动填写、解决智能验证、批量提交问卷等功能。 目录 1.下载浏览器驱动 2. selenium基本配置…

利用GoogleTampermonkeyModify Headers实现问卷星调查问卷的自动填写提交

前言 首先一个月没有更新博客&#xff0c;是因为去苏州尝试了一下暑假工&#xff0c;然后对于大家在博客留下的评论和问题也没有来得及回复&#xff0c;实在不好意思。不得不说&#xff0c;暑假工挺累的&#xff0c;而且基本上在消磨时间&#xff0c;说实话也不算后悔&#xf…

Python实现问卷星调查问卷自动填写

文章目录 前言一、配置环境1.1 下载依赖selenium1.2 安装chrome驱动1.3 引入库 二、简易版快速上手教程1.自定义变量2.自定以函数3 主函数编写 三 逐步解析1 基础代码2 实现步骤 四 代码总结 前言 如何使用python实现对问卷的自动填写提交任务并且还能解决智能验证问题。 一、…

Mac 软件出现「意外退出」及「打不开」解决方法

解决方法 方法其实有很多种&#xff0c;这里介绍常用的几种 终端法需先安装Xcode或Apple命令行工具 如未装Xcode可以使用下列命令安装Apple命令行工具&#xff08;如安装有Xcode可忽略&#xff09; xcode-select --install 1.终端法 sudo codesign --force --deep --sign -…

postman能正常打开但不显示窗口

1.最近使用postman偶尔出现以下问题 postman在任务栏能正常打开&#xff0c;如下图&#xff0c;使用AltTab也能看到&#xff0c;但是窗口就是显示不了 2.解决方案 将鼠标放在任务栏上&#xff0c;使用快捷键Alt空格&#xff0c;弹出小窗口&#xff0c;然后点击弹框中的最大化…

MPAndroidChart的HorizontalBarChart数值显示不全问题

现在使用的版本是&#xff1a;v3.1.0 方案一&#xff1a; private HorizontalBarChart hor_bar_chart; hor_bar_chart(HorizontalBarChart) findViewById(R.id.hor_barchart); YAxis leftYAxishor_bar_chart.getAxisLeft(); // 设置y轴边距&#xff0c;解决数值过大显示不全问…

解决 echarts 图中 tooltip 文本内容太长导致显示不全

问题&#xff1a; 使用 tooltip 的 extraCssText&#xff0c;高效方便 tooltip: {show:true,trigger: "axis",confine: true, // 文本太长自动换行extraCssText: white-space: normal; word-break: break-all;, // 文本太长自动换行效果&#xff1a;

CoordinatorLayout显示不全问题

问题一 <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"android:layout_width"match_parent"android:layout_height&…