Python笔记(二)--Python3.7通过selenium和geckodriver实现问卷星自动填写提交

Python笔记(二)–Python3.7通过selenium和geckodriver实现问卷星自动填写提交


前段时间,学校布置了一个调查问卷作业,emmmmm…然而到准备结束了,只有收集了二十几三十份的问卷,受人启发就尝试写了这个脚本。仅供研究,请勿滥用!!!


先做好自动化运行的环境

  1. 这里用到selenium自动化模块,用pip安装selenium
pip install selenium
  1. 火狐浏览器的xPath Finder插件
    Python笔记(二)--Python3.7通过selenium和geckodriver实现问卷星自动填写提交_第1张图片安装好插件后,浏览器右上角工具栏中出现了xPath Finder,点击它开启
    在这里插入图片描述
    点击选项框后,左下角出现了该选项框的xpath数值(一般都是有规律的)
    Python笔记(二)--Python3.7通过selenium和geckodriver实现问卷星自动填写提交_第2张图片

  2. 我用的是火狐浏览器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('脚本运行结束!!!')

你可能感兴趣的:(Python3)