python自动填写问卷代码_Python Selenium 问卷星自动填写 更快速修改代码以便应用...

Python自动填写问卷星

在前段时间自己编写了一段Selenium的的代码(当然是不包含识别验证码的工序的),在应用的过程中,发现了代码修改比较麻烦,每个click控件的选项上都需要添加一次xpath路径,在选择题较少的情况下,情况还好,但是选择题的数目和选项一旦增多就会造成代码修改的复杂程度。下面给出一个表做一个形象的说明

数量

添加xpath次数

10道题 每道题4个选项

40

30道题 每道题4个选项

120

30道题 每道题8个选项

240

添加如此多次的xpath路径,会造成不必要的麻烦,xpath路径具有一定的规律性,比如说我这篇

第一道题的A选项://*[@id=“divquestion1”]/ul/li[1]/a

第一道题的B选项://*[@id=“divquestion1”]/ul/li[2]/a

第二道题的A选项://*[@id=“divquestion2”]/ul/li[1]/a

你们是否已经发现了规律呢?当然我们还是重申一下需要用到的几个函数吧

需要用到的一些知识

random.choice(),括号里面可以放一个列表,这样可以随机输出列表当中的某个元素

xpath定位网页元素 driver.find_element_by_xpath

对元素进行操作,有点击click和填入send_keys

字符串的拼接 ‘’//*[@id=“divquestion’ + str(m) + '”]/ul/li[’ + str(q) + ‘]/a’’

函数体的设计以及if-else选择语句

一、问卷形式

Ⅰ、只有单选题的问卷

9-1600824773.png

from selenium import webdriver import random # //*[@id="divquestion1"]/ul/li[2]/a def monomial_choice(m, n): # m为题号 n为选项数 q = random.choice(list(range(1, n + 1))) xpath = '//*[@id="divquestion' + str(m) + '"]/ul/li[' + str(q) + ']/a' driver.find_element_by_xpath(xpath).click() for i in range(100): driver = webdriver.Chrome() driver.get('https://www.wjx.cn/jq/88552774.aspx') for m in range(1, 11): if m == 2: monomial_choice(m, 4) # 第二题四个选项 else: monomial_choice(m, 5) # 除了第二题都有五个选项 driver.find_element_by_xpath('//*[@id="submit_button"]').click() # 提交按钮 print('第' + str(i + 1) + '次填写') driver.quit() # 关闭浏览器

只有短短的数句代码,就可以运行了,是不是很简洁呢。关于代码的修改方式: 我这里定义了一个选择题的函数,在函数内部有一个xpath的路径的字符串拼接方式,把这个字符串拼接方式进行修改,其中两个参数m为题号数,n为单选题的选项个数,这个函数起到随机选择此道选题题某选项进行点击的作用。主函数中设置浏览器驱动器对象,通过get方法获得网址,通过点击单选题以及提交的按钮进行循环。

20200823233135419.png#pic_center

这里一次性能刷大约30份左右,因为出现了验证码的问题,这里先不讨论验证码的处理过程。

Ⅱ、单选题与多选题并存的问卷

多选题就是在单选题的基础上,在几个选项里挑选多个选项进行点击,那么首先要了解python给予我们的随机数机制。

我们依然假设A、B、C、D四个选项中xpath的标签中含有1、2、3、4这四个字符串类型,多选是指两个或者两个以上选项的选择题。利用sample函数可以实现这一点。

函数举例

from random import sample num = list(range(1, 5)) n = sample(num, 2)

num的列表形式为[1,2,3,4] n从num随机挑选两个元素作为列表中的元素

>>> n [2, 4]

问卷见

6-1600824776.png

import random from selenium import webdriver # //*[@id="divquestion1"]/ul/li[2]/a def monomial_choice(m, n): # m为题号 n为选项数 q = random.choice(list(range(1, n + 1))) xpath = '//*[@id="divquestion' + str(m) + '"]/ul/li[' + str(q) + ']/a' driver.find_element_by_xpath(xpath).click() def multiterm_choice(m, n): # m为题号 n为选项数 q = list(range(1, n + 1)) # 多选题的所有索引[1,2,3,4] c = random.randint(1, n) # 设置多选题选择的个数 q = random.sample(q, c) # 多选题选择列表 for i in q: xpath = '//*[@id="divquestion' + str(m) + '"]/ul/li[' + str(i) + ']/a' driver.find_element_by_xpath(xpath).click() for i in range(100): driver = webdriver.Chrome() driver.get('https://www.wjx.cn/jq/88879171.aspx') monomial_choice(1, 2) monomial_choice(2, 4) monomial_choice(3, 2) multiterm_choice(4, 7) multiterm_choice(5, 7) monomial_choice(6, 6) monomial_choice(7, 5) multiterm_choice(8, 5) monomial_choice(9, 3) monomial_choice(10, 5) monomial_choice(11, 6) monomial_choice(12, 5) driver.find_element_by_xpath('//*[@id="submit_button"]').click() # 提交按钮 print('第' + str(i + 1) + '次填写') driver.quit() # 关闭浏览器

Ⅱ、单选题、多选题与填空题并存的问卷

填空题无非是修改了效果控件,send_keys()给空里一个值

import random from selenium import webdriver # //*[@id="divquestion1"]/ul/li[2]/a def monomial_choice(m, n): # m为题号 n为选项数 q = random.choice(list(range(1, n + 1))) xpath = '//*[@id="divquestion' + str(m) + '"]/ul/li[' + str(q) + ']/a' driver.find_element_by_xpath(xpath).click() def multiterm_choice(m, n): # m为题号 n为选项数 q = list(range(1, n + 1)) # 多选题的所有索引[1,2,3,4] c = random.randint(1, n) # 设置多选题选择的个数 q = random.sample(q, c) # 多选题选择列表 for i in q: xpath = '//*[@id="divquestion' + str(m) + '"]/ul/li[' + str(i) + ']/a' driver.find_element_by_xpath(xpath).click() def Completion(m): # m为题号 xpath = '// *[ @ id = "q' + str(m) + '"]' # 填空题xpath路径 choice_list = ['质量不高', '价格不低', '难闻味道', '质感不好'] # 填空的几个选项 n = random.choice(list(range(0, len(choice_list) - 1))) # 随机生成选项下标 choice = choice_list[n] driver.find_element_by_xpath(xpath).send_keys(choice) for i in range(100): driver = webdriver.Chrome() driver.get('https://www.wjx.cn/jq/88875651.aspx') monomial_choice(1, 4) monomial_choice(2, 4) multiterm_choice(3, 7) monomial_choice(4, 5) monomial_choice(5, 4) Completion(6) driver.find_element_by_xpath('//*[@id="submit_button"]').click() # 提交按钮 print('第' + str(i + 1) + '次填写') driver.quit() # 关闭浏览器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值