python实现刷问卷星份数(面向对象)

目录 一、前言 二、模块准备 ①Sojump.py需要的模块/包 ②具体问卷.py需要的模块/包 三、具体代码…

目录

一、前言

二、模块准备

①Sojump.py需要的模块/包

②具体问卷.py需要的模块/包

三、具体代码讲解

3.1 Sojump.py

功能1 计数器counter()

功能2 伪装selenium

更新知识 selenium的更新

01 danxuan()→单选题(随机选择)

02 fixed_danxuan()→单选题(只选择某个选项)

03 excluded_danxuan()→单选题(排除一个或一些选项)

04 range_danxuan()→单选题(在m到n范围内单选)

05 restrictive_danxuan()→单选题(在某些选项中选择)

06 textinput_danxuan()→单选题(选项中允许填空)

07 duoxuan()→多选题(随机选择)

08 fixed_duoxuan()→多选题(只选择某些选项)

09 excluded_duoxuan()→多选题(排除一个或一些选项)

10 restrictive_duoxuan()→多选题(在某些选项中多选)

11 range_duoxuan()→多选题(在m到n范围内的多选)

12 textinput_duoxuan()→多选题(选项中允许填空)

13 text()→文本题

随机所在城市的选择 random_city_selection()

限制所在城市的选择 restrictive_city_selection()

提交按钮 submit()

★全部代码展示★

3.2 具体问卷.py

★全部代码展示★

具体代码讲解

四、总结


一、前言

笔者之前也写过python实现问卷星刷份数的代码与文章(如下)

隔壁寝室刷问卷刷疯了https://blog.csdn.net/knighthood2001/article/details/120175929?spm=1001.2014.3001.5502python自动化——问卷星刷问卷3.0版本https://blog.csdn.net/knighthood2001/article/details/120175929?spm=1001.2014.3001.5502

不过之前写的属于面向过程版本,它有很大的局限性,即根据不同的问卷需要按照逻辑步骤写相应的代码,代码量非常繁琐,并且很多代码都是重复的,因此如果后续查看与更改起来也非麻烦;此外,由于距离上一次写关于问卷星的时间较长,问卷星页面元素定位可能发生了更改,需要重新获取相应的元素定位,如xpath、css selector;再加上由于selenium的升级,之前定位元素的方法被弃用,需要改变之前写的代码。

以上三个原因,使得笔者重新对之前的代码进行增删改查,最终将之前的面向过程版本写成了面向对象版本。通过将一个个的功能封装成函数,在使用时只需要调用即可。代码量大大降低,且无需重复造车轮,对于后续检查与更改来说也比较轻松。

二、模块准备

首先创建两个python文件,Sojump的翻译就是问卷星,通过在Sojump.py文件中编写主要函数,在具体问卷.py文件中通过导入Sojump,在编写该问卷的代码,最终实现刷份数。

①Sojump.py需要的模块/包

②具体问卷.py需要的模块/包

三、具体代码讲解

3.1 Sojump.py

!这里的内容是重中之重!

①元素定位分析

xpath

上述表示的是问卷星问卷第一题的第1个选项

上述表示的是问卷星问卷第一题的第2个选项

经观察,可以得出问卷星问题的通用xpath,如下

css_selector

大致思路同上,得到问卷星选项的通用css_selector,如下

允许填空选项的css_selector

有些问题的选项允许填空,其通用css_selector 如下

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!注意:笔者发现问卷星有两类问卷,其对应的元素定位有所不同。

具体区分如下(笔者也是在写完该文章后突然发现,大家可以自行去试试你的问卷元素定位属于哪一类,第二种由于没有相应的问卷,可能xpath和css_selector定位会发生错误,不过这不是重点,大家只需找到并更改即可)

如果大家发现无法刷问卷,可能就是元素定位出现了问题

②创建类并初始化

创建一个Wenjuanxing()的类,并初始化url


接下来就开始编写函数了

功能1 计数器counter()

在类外面先定义一个count=0,然后使用下面的counter()函数,用以计数是第几次运行代码,刷了几次问卷。

功能2 伪装selenium

需要进行伪装的原因:笔者发现是因为问卷星的网页有反爬机制,它会检查你是不是通过selenium访问网页的。大多数情况下,检测基本原理是检测当前浏览器窗口下的window.navigator对象是否包含webdriver这个属性。因为在正常使用浏览器的情况下,这个属性是undefined,然而一旦我们使用了selenium,selenium会给window.navigator设置webdriver属性。很多网站就通过JS判断如果webdrive 属性存在,那就直接屏蔽。以下代码可以在每次页面加载之前就不会给window.navigator设置webdriver属性,从而能够通过智能检测。

详情可以看笔者写的之前的文章

隔壁寝室刷问卷刷疯了https://blog.csdn.net/knighthood2001/article/details/120175929?spm=1001.2014.3001.5502

更新知识 selenium的更新

chromedriver的知识我就不细说了,主要讲的是selenium更新后,元素定位的方法发生改变。

以前:

模块

定位元素方法

更新后:

需要在导入一个模块

定位元素方法


01 danxuan()→单选题(随机选择)

讲解:i表示题号

首先使用全局变量并通过format(i)函数给出具体的题号

a表示定位题目所对应的选项

len(a)表示题目所对应的选项个数

b表示随机生成选项个数以内的一个数

最后定位该选项并点击,完成随机选择

注意:在上面的代码,由于笔者在之前的文章中使用过xpath定位,不过出现了定位不到的现象,所以我使用css_selector进行定位元素。


02 fixed_danxuan()→单选题(只选择某个选项)

讲解:b表示需要选择的选项在该题目选项中的位置

03 excluded_danxuan()→单选题(排除一个或一些选项)

思路:是创建一个列表c,然后将选项个数添加进列表,之后根据输入的变量,在列表中逐个去除,最终在剩下的列表中随机选择一个,进行定位与点击。

04 range_danxuan()→单选题(在m到n范围内单选)

思路:是用random.randint(m,n)函数返回一个m到n范围内的随机整数

05 restrictive_danxuan()→单选题(在某些选项中选择)

思路:将所输入的参数存入到列表中,然后使用random.choice()函数随机选择其中的一个数

06 textinput_danxuan()→单选题(选项中允许填空)

思路:首先选择某个选项,如果该选项和自己输入的c相同,即可再输入文字。

07 duoxuan()→多选题(随机选择)

思路:列表m中存放选项;c表示随机生成一个选项以内的数字,即多选题要选择选项的个数;n表示从列表m中随机选择c个个数,返回类型为列表,然后经过遍历,实现多选题的多个选项的选择。

08 fixed_duoxuan()→多选题(只选择某些选项)


09 excluded_duoxuan()→多选题(排除一个或一些选项)

思路:列表c中存放选项个数,然后逐一删除输入的参数,然后在剩下的选项中用多选题的思路进行操作。

10 restrictive_duoxuan()→多选题(在某些选项中多选)

思路:列表m中存放的内容就是所输入的参数, 然后用多选题的思路进行操作。

11 range_duoxuan()→多选题(在m到n范围内的多选)

思路:列表c为m到n的选项组,如当m=2,n=5时,c=[2,3,4,5],然后用多选题的思路进行操作。

12 textinput_duoxuan()→多选题(选项中允许填空)

注意:该函数只适用于一个选项中需要文本输入的多选题。

思路:查看 06 单选题(选项中允许填空)和 07 多选题(随机选择) 即可理解。

13 text()→文本题

思路:通过wenzi参数填写相应的内容,实现文字题的填写。

随机所在城市的选择 random_city_selection()

请选择您所在的城市的题目如上

如上图所示, 问卷星还给出了海外这个选项,不过一般用不到,所以笔者就除去了它,剩下的列表并存在provinces中,之后用random函数即可随机选择城市。

将它存到自制的列表还有一个原因就是selenium的Select提供的三种选择方式select_by_index(index)、select_by_value(value)、select_by_visible_text(visible_text),问卷星中只给出了value,因此很难随机选择。例如:如果给出index,那我们就可以使用random函数进行随机选择。

注意:

①上图中,省份与城市的选择页面是写在ifame中, 因此需要进行frame和iframe之间的切换。关键不要忘记切换回去。如果没有切换回去,即使点击确定键后,它仍在iframe中,会使得接下来元素定位失败。

②a表示省/直辖市下的城市。


限制所在城市的选择 restrictive_city_selection()

以上代码与随机所在城市的选择的差别主要在于,添加了一个不定参数arg

通过在具体问卷.py文件中创立一个具有几个城市的列表,然后随机选择它并将其作为arg参数,实现随机选择你所需要的城市。

例如下面的代码:

具体问卷.py


提交按钮 submit()

上图所示的就是提交按钮的流程

按步骤写代码,如下

注意:有些步骤需要一点时间,所以加上time.sleep()

以上就是Sojump.py的全部代码讲解


全部代码展示

3.2 具体问卷.py

由于问卷涉及一些内容,不便公开,因此我就将问卷内容马赛克了(如下图),网址也不公布了。大家了解一下题目的类型即可

★全部代码展示★


具体代码讲解

①每隔一段时间运行代码

该模板请牢记,上述代码表示每隔五秒运行一次,如果需要每隔一秒运行一次代码,则将其中的

由于count参数表示代码运行的次数,而问卷星在刷50份后得过一小时后才能继续刷,因此得加个判断(如下),防止程序一直运行。

②编写主体代码

因为一些题目的选项中需要填写文本,以及如果大家需要限定省份的随机随机选择。这就需要制作相应的列表,然后通过随机选取列表中的某个内容,自动填写进问卷。

这里需要注意的是: 随机选取列表中内容的代码段需要编写在run()函数中而不能直接写在上述代码下面,否则不经过run()函数,不会进行每隔一段时间运行的过程,其产生的随机内容将在每次使用都不变。这是笔者后来无意发现的,说来惭愧,这一个小失误,导致一次刷的50份的文本内容都一样,因此大家敲代码时需要多思考。

接下来需要调用类

接下来就是编写run()函数,其中主要就是根据问卷内容、题目类型的不同而编写。

代码如下:

着重注意一下以下两题

此外,如果要进行随机省份的选择,只需调用即可(如下)

剩下的其他函数在之前的内容中讲过,也比较简单。


四、总结

问卷星根据题目的不同、题目和选项的搭配能产生很多变化,上述只涉及到几个较常用的几个函数。后续大家如果需要实现一些其他功能的,可以自行编写,也可以与笔者多多交流,完善该模块。

最后希望大家不要光看文章,也可以动手敲敲代码,加深理解。

如果大家发现无法刷问卷,可能就是元素定位出现了问题,可以去看看元素定位属于上述讲的哪一类。

如有错误之处,请批评指正!!

本文来自网络,不代表软粉网立场,转载请注明出处:https://www.rfff.net/p/3601.html

作者: HUI

发表评论

您的电子邮箱地址不会被公开。

返回顶部