Python笔记(二)–Python3.7通过selenium和geckodriver实现问卷星自动填写提交
前段时间,学校布置了一个调查问卷作业,emmmmm…然而到准备结束了,只有收集了二十几三十份的问卷,受人启发就尝试写了这个脚本。仅供研究,请勿滥用!!!
先做好自动化运行的环境
- 这里用到selenium自动化模块,用pip安装selenium
pip install selenium
-
火狐浏览器的xPath Finder插件
安装好插件后,浏览器右上角工具栏中出现了xPath Finder,点击它开启
点击选项框后,左下角出现了该选项框的xpath数值(一般都是有规律的)
-
我用的是火狐浏览器66.0.1==>geckodriver-v0.24.0-win64(这里可以也选择chrome,ie等浏览器,不过要下载对应版本的chromedriver,iedriver)
大家可以去下载:
chrome浏览器 下载地址==>chromedriver
Firefox浏览器 下载地址==>geckodriver
IE浏览器 下载地址==>IEdriver
下载好浏览器和对应的浏览器驱动后,把驱动geckodriver.exe放到项目根目录下
(例如:我的项目PortScaner.py 的根目录是D:\Python\Project\ ,那么把geckodriver.exe也放在里面)
先导入需要用到的库
import time
import random
from selenium import webdriver
接下是selenium的基本应用
def Auto():
try:
browser = webdriver.Firefox() #创建Firefox浏览器对象
browser.get('问卷的url')#这里修改你的url
time.sleep(1) #这里设置休眠1秒
browser.quit() #关闭浏览器
except Exception as e:
print('运行异常')
在填写每道题的间隔设置休眠时间,或者提交前设置足够长的休眠时间,避免网站的防爬虫机制–验证码
main()部分
if __name__ == '__main__':
count = input('请输入答卷次数:') #设定循环次数
for cou in range(int(count)): #通过循环,调用Auto函数
Auto()
print('脚本运行结束!!!')
这里是我的源码,因为每个人的调查问卷选项的XPATH坐标都不一样,所以仅供参考
# -*- coding: utf-8 -*-
import time
import random
from selenium import webdriver
'''
xpath参数可以通过火狐的xpath插件定位
请先下载浏览器驱动chromedriver.exe或者geckodriver.exe,代码进行微调
本程序制作于2019.3.30
'''
def Auto():
try:
browser = webdriver.Firefox()
browser.get('http://www.baidu.com')
time.sleep(1)
browser.get('https://www.wjx.cn/jq/35768419.aspx')#请修改这相应的问卷地址
time.sleep(1)
# 第1题 --两个选项
# #用random.randint()方法得出1~2的随机数
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[1]/div[2]/ul/li[%s]/a" % str(
random.randint(1, 2))).click()
time.sleep(1)
# 第2,3题 --四个选项
# #使用for循环连续填写第2,3题,用random.randint()方法得出1~4的随机数
for q in range(2, 4):
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[%s]/div[2]/ul/li[%s]/a" % (
str(q), str(random.randint(1, 4)))).click()
time.sleep(1)
# 第4题 --三个选项
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[4]/div[2]/ul/li[%s]/a" % str(
random.randint(1, 3))).click()
time.sleep(1)
# 第5,6题 --四个选项
for q in range(5, 7):
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[%s]/div[2]/ul/li[%s]/a" % (
str(q), str(random.randint(1, 4)))).click()
time.sleep(1)
# 第7题 --两个选项
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[7]/div[2]/ul/li[%s]/a" % str(
random.randint(1, 2))).click()
time.sleep(1)
# 第8题 --四个选项
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[8]/div[2]/ul/li[%s]/a" % str(
random.randint(1, 4))).click()
time.sleep(1)
# 第9,10题 --五个选项
for q in range(9, 11):
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[%s]/div[2]/ul/li[%s]/a" % (
str(q), str(random.randint(1, 5)))).click()
time.sleep(1)
# 第11题 --三个选项
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[11]/div[2]/ul/li[%s]/a" % str(
random.randint(1, 3))).click()
time.sleep(1)
# 第12题 --两个选项
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[12]/div[2]/ul/li[%s]/a" % str(
random.randint(1, 2))).click()
time.sleep(1)
# 第13,14题 --三个选项
for q in range(13, 15):
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[%s]/div[2]/ul/li[%s]/a" % (
str(q), str(random.randint(1, 3)))).click()
time.sleep(1)
# 第15,16题 --四个选项
for q in range(15, 17):
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[%s]/div[2]/ul/li[%s]/a" % (
str(q), str(random.randint(1, 4)))).click()
time.sleep(1)
# 第17题 --七个选项(多选)
# 获得随机数X设为选择数量
# 由于时间为题这里留了个小bug,在运程中可能会出现重复点击的状况,甚至导致选择为空,我设定默认选择选项一,其余随机添加 ---19,20题也一样如此
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[17]/div[2]/ul/li[1]/a").click()
time.sleep(1)
for count in range(random.randint(1, 6)):
key = random.randint(2, 7)
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[17]/div[2]/ul/li[%s]/a" % str(
key)).click()
time.sleep(1)
# 第18题 --五个选项
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[18]/div[2]/ul/li[%s]/a" % str(
random.randint(1, 5))).click()
time.sleep(1)
# 第19题 --五个选项(多选)
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[19]/div[2]/ul/li[1]/a").click()
time.sleep(1)
for count in range(random.randint(1, 4)):
key = random.randint(2, 5)
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[19]/div[2]/ul/li[%s]/a" % str(
key)).click()
time.sleep(1)
# 第20题 --六个选项(多选)
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[20]/div[2]/ul/li[1]/a").click()
time.sleep(1)
for count in range(random.randint(1, 5)):
key = random.randint(2, 6)
browser.find_element_by_xpath(
"/html/body/div[2]/div[1]/div[2]/div[1]/div/div[1]/div[2]/div[2]/fieldset/div[20]/div[2]/ul/li[%s]/a" % str(
key)).click()
time.sleep(1)
# 提交
sumbit = browser.find_element_by_xpath("//*[@id=\"submit_button\"]").click()
time.sleep(3)
browser.quit()
except Exception as e:
print('运行异常')
if __name__ == '__main__':
print('*' * 108)
print('(tip:不要一次性填写次数过多,不然后果自负!!!)')
print('*' * 108)
count = input('请输入答卷次数:')
for cou in range(int(count)):
Auto()
print(cou+1)
print('脚本运行结束!!!')