目录
一、前言
二、模块准备
①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实现问卷星刷份数的代码与文章(如下)
不过之前写的属于面向过程版本,它有很大的局限性,即根据不同的问卷需要按照逻辑步骤写相应的代码,代码量非常繁琐,并且很多代码都是重复的,因此如果后续查看与更改起来也非麻烦;此外,由于距离上一次写关于问卷星的时间较长,问卷星页面元素定位可能发生了更改,需要重新获取相应的元素定位,如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属性,从而能够通过智能检测。
详情可以看笔者写的之前的文章
更新知识 selenium的更新
chromedriver的知识我就不细说了,主要讲的是selenium更新后,元素定位的方法发生改变。
以前:
模块
定位元素方法
更新后:
需要在导入一个模块
定位元素方法
01 danxuan()→单选题(随机选择)
-
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!