python爬虫--自动填写问卷

一、前言

  • 本功能主要是模拟浏览器操作,自动填写问卷。
  • 需要手动操作:需要自己下载一下Chrome的驱动,在我前面文章爬虫的模拟浏览器登录有网址

二、代码

import random
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from msedge.selenium_tools import EdgeOptions
from msedge.selenium_tools import Edge


def run(flag):
    # 防止被浏览器识别为脚本
    option = webdriver.ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    option.add_experimental_option('useAutomationExtension', False)
    # 实现无可视化界面的操作
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--disable-gpu")

    bro = webdriver.Chrome(executable_path="./chromedriver.exe",
                           # chrome_options=chrome_options,
                           options=option)

    bro.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
                        {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})
    # 访问当前网址
    bro.get("https://www.wjx.cn/vm/QbxSLgk.aspx")

    min_check = 1  # 多选题最少选择数

    # 生成一个数组
    def get_arr(num):
        arr = []
        for i in range(1, num + 1):
            arr.append(i)
        return arr

    # 从数组中随机获取一个下标的内容
    def get_random(arr):
        num = arr[random.randint(0, len(arr) - 1)]
        arr.remove(num)
        return num

    # 1.年龄[单选题 5]
    num = 5  # 选项个数
    bro.find_element_by_xpath(xpath='//*[@id="div1"]/div[2]/div[' + str(random.randint(1, num)) + ']/span').click()
    # 2.工资[单选题 10]
    num = 10  # 选项个数
    bro.find_element_by_xpath(xpath='//*[@id="div2"]/div[2]/div[' + str(random.randint(1, num)) + ']/span').click()
    # 3.职业[单选题 13]
    num = 13  # 选项个数
    bro.find_element_by_xpath(xpath='//*[@id="div3"]/div[2]/div[' + str(random.randint(1, num)) + ']/span').click()

    # 4.您认为以下哪些说法符合您对于国潮美妆产品的定义? [多选题 5]
    num = 5  # 选项个数
    arr = get_arr(num)
    sum = random.randint(min_check, num)  # 选择数量
    for i in range(0, sum):
        bro.find_element_by_xpath(xpath='//*[@id="div4"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

    # 5.您对以下传统国产美妆品牌了解程度如何? [表格单选 9-5]
    num = 9  # 选项行数
    column = 5  # 选项列数
    for row in range(0, num):
        bro.find_element_by_xpath(
            xpath='//*[@id="drv5_' + str(row + 1) + '"]/td[' + str(random.randint(1, column)) + ']').click()

    # 6.您对以下新锐国产美妆品牌了解程度如何? [表格单选 9-5]
    num = 9  # 选项行数
    column = 5  # 选项列数
    for row in range(0, num):
        bro.find_element_by_xpath(
            xpath='//*[@id="drv6_' + str(row + 1) + '"]/td[' + str(random.randint(1, column)) + ']').click()

    # 7.您主要通过哪些渠道了解到国产美妆产品? [多选题 8(最多选择5项)]
    num = 8  # 选项个数
    arr = get_arr(num)
    sum = random.randint(min_check, 5)  # 选择数量
    for i in range(0, sum):
        bro.find_element_by_xpath(xpath='//*[@id="div7"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

    # 8.您是否购买过国产美妆产品?[单选题 2]
    # is_buy = random.randint(1, 2)  # 1 是   2 否
    is_buy = 1
    bro.find_element_by_xpath(xpath='//*[@id="div8"]/div[2]/div[' + str(is_buy) + ']/span').click()
    if is_buy == 2:
        # 26.您不够买国产美妆产品的原因是? [多选题 7]
        num = 7  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for row in range(0, sum):
            bro.find_element_by_xpath(xpath='//*[@id="div33"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()
    else:
        # 9.您购买过哪些传统国产美妆品牌? [多选题 10]
        num = 10  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(xpath='//*[@id="div9"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

        # 10.您购买过哪些新锐国产美妆品牌? [多选题 10]
        num = 10  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for j in range(0, sum):
            bro.find_element_by_xpath(xpath='//*[@id="div10"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

        # 11.您平常购买套装护肤品(水乳霜精华液)的价格是? [单选题 5]
        num = 5  # 选项个数
        bro.find_element_by_xpath(xpath='//*[@id="div11"]/div[2]/div[' + str(random.randint(1, num)) + ']/span').click()

        # 12.您一年平常购买国产美妆产品的次数是? [单选题 4]
        num = 4  # 选项个数
        bro.find_element_by_xpath(xpath='//*[@id="div12"]/div[2]/div[' + str(random.randint(1, num)) + ']/span').click()

        # 13.您平常一个月脏化妆品上的消费金额? [单选题 6]
        num = 6  # 选项个数
        bro.find_element_by_xpath(xpath='//*[@id="div13"]/div[2]/div[' + str(random.randint(1, num)) + ']/span').click()

        # 14.您主要在哪些渠道购买国产美妆产品? [多选题9 最多选择5项]
        num = 9  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, 5)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(xpath='//*[@id="div14"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

        # 15.问您购买国产美妆产品的原因是什么? [多选题 6]
        num = 6  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(xpath='//*[@id="div15"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

        # 16.以下是关于影响您购买国产美妆产品的因素,根据自身感受, 选择影响程度即可(分值越高, 影响程度越大) [表格单选 16-5]
        num = 16  # 选项行数
        column = 5  # 选项列数
        for row in range(0, num):
            bro.find_element_by_xpath(
                xpath='//*[@id="drv16_' + str(row + 1) + '"]/td[' + str(random.randint(1, column)) + ']').click()
        # 17.以下哪些情况会更吸引您去购买国产美妆产品? [多选题 5]
        num = 5  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(xpath='//*[@id="div17"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

        # 18.以下各款美妆产品包装,您更喜欢哪些风格? [单选题 4]
        num = 4  # 选项个数
        bro.find_element_by_xpath(xpath='//*[@id="div18"]/div[2]/div[' + str(random.randint(1, num)) + ']').click()

        # 19.您更喜爱拥有哪些国潮元素的美妆产品? [多选题 6] 会衍生出其他的选项
        num = 5  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            check_item = str(get_random(arr))
            print("check_item:", check_item)
            bro.find_element_by_xpath(xpath='//*[@id="div19"]/div[2]/div[' + str(check_item) + ']/span').click()
            # 选择衍生选项
            time.sleep(1)
            if check_item == "1":
                # 您更喜欢哪些地域、地理、建筑元素? [多选题 4]
                num_item = 4  # 选项个数
                arr_item = get_arr(num_item)
                sum_item = random.randint(min_check, num_item)  # 选择数量
                for i in range(0, sum_item):
                    bro.find_element_by_xpath(
                        xpath='//*[@id="div20"]/div[2]/div[' + str(get_random(arr_item)) + ']').click()
            elif check_item == "2":
                # 您更喜欢哪些影视、动漫、游戏元素? [多选题 3]
                num_item = 3  # 选项个数
                arr_item = get_arr(num_item)
                sum_item = random.randint(min_check, num_item)  # 选择数量
                for i in range(0, sum_item):
                    bro.find_element_by_xpath(
                        xpath='//*[@id="div21"]/div[2]/div[' + str(get_random(arr_item)) + ']').click()
            elif check_item == "3":
                # 您更喜欢哪些民族传统文化因素? [多选题 5]
                num_item = 5  # 选项个数
                arr_item = get_arr(num_item)
                sum_item = random.randint(min_check, num_item)  # 选择数量
                for i in range(0, sum_item):
                    bro.find_element_by_xpath(
                        xpath='//*[@id="div22"]/div[2]/div[' + str(get_random(arr_item)) + ']').click()
            elif check_item == "4":
                # 您更喜欢哪些朝代、年气、节阳元素? [多选题 4]
                num_item = 4  # 选项个数
                arr_item = get_arr(num_item)
                sum_item = random.randint(min_check, num_item)  # 选择数量
                for i in range(0, sum_item):
                    bro.find_element_by_xpath(
                        xpath='//*[@id="div23"]/div[2]/div[' + str(get_random(arr_item)) + ']').click()
            elif check_item == "5":
                # 您更喜欢哪些科技、奥运元素? [多选题 3]
                num_item = 3  # 选项个数
                arr_item = get_arr(num_item)
                sum_item = random.randint(min_check, num_item)  # 选择数量
                for i in range(0, sum_item):
                    bro.find_element_by_xpath(
                        xpath='//*[@id="div24"]/div[2]/div[' + str(get_random(arr_item)) + ']').click()

        # 20.您更倾向于在购买哪类美妆产品时选择国产美妆品牌? [10 最多选择5项]
        num = 10  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(
                xpath='//*[@id="div25"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

        # 21.对于国产彩妆产品您更关注哪些使用效果? [多选题]
        num = 5  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(
                xpath='//*[@id="div26"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

        # 22.对于国产美妆的护肤品您更关注哪些功效及成分? [多选题 7]
        num = 7  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(
                xpath='//*[@id="div27"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

        # 23.以下是关于国产美妆产品满意度的题目,根据自身感受, 选择满意程度即可 [表格单选 14-5]
        num = 14  # 选项行数
        column = 5  # 选项列数
        for row in range(0, num):
            bro.find_element_by_xpath(
                xpath='//*[@id="drv28_' + str(row + 1) + '"]/td[' + str(random.randint(1, column)) + ']').click()

        # 24.如果现在可以依据您的个人面貌特点好各类场合等因素提供虚拟化妆,您是否愿意尝试? [单选题 2]会衍生出其他的选项
        check_try = random.randint(1, 2)  # 1 是  2 否
        bro.find_element_by_xpath(xpath='//*[@id="div29"]/div[2]/div[' + str(check_try) + ']').click()
        # 衍生选项
        if check_try == 1:
            # 25.在虚拟试妆中,您最想体验的服务是? [单选题 4]
            num = 4  # 选项个数
            bro.find_element_by_xpath(
                xpath='//*[@id="div30"]/div[2]/div[' + str(random.randint(1, num)) + ']/span').click()

        # 26.您认为国潮美妆还存在哪些问题? [多选题 6]
        num = 6  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(
                xpath='//*[@id="div31"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()
        # 27.您认为国产美妆产品在营销传播方面存在哪些问题? [多选题 7]
        num = 7  # 选项个数
        arr = get_arr(num)
        sum = random.randint(min_check, num)  # 选择数量
        for i in range(0, sum):
            bro.find_element_by_xpath(
                xpath='//*[@id="div32"]/div[2]/div[' + str(get_random(arr)) + ']/span').click()

    # 28.您是否会帮助介绍宣传给其他顾客?[单选题 2]
    is_propaganda = random.randint(1, 2)  # 1 是   2 否
    bro.find_element_by_xpath(xpath='//*[@id="div34"]/div[2]/div[' + str(is_propaganda) + ']/span').click()
    if is_propaganda == 1:
        # 您是否会再次购买国产美妆产品? [单选题 2] 会衍生出其他的选项
        check_buy = random.randint(1, 2)  # 1 是  2 否
        bro.find_element_by_xpath(xpath='//*[@id="div35"]/div[2]/div[' + str(check_buy) + ']').click()
        # 衍生选项
        if check_buy == 1:
            # 在产品涨价时您仍会继续购买? [单选题 2]
            num = 2  # 选项个数
            bro.find_element_by_xpath(
                xpath='//*[@id="div36"]/div[2]/div[' + str(random.randint(1, num)) + ']/span').click()

    # # 29.您对未来国潮美妆产品的发展有何建议? [文本框]
    # bro.find_element_by_xpath(xpath='//*[@id="q37"]').send_keys(".")

    # 点击提交按钮
    bro.find_element_by_xpath(xpath='//*[@id="ctlNext"]').click()
    # 处理检测
    if flag == 0:
        # 普通检测
        time.sleep(1)
        bro.find_element_by_xpath(xpath='//*[@id="alert_box"]/div[2]/div[2]/button').click()
        time.sleep(1)
        bro.find_element_by_xpath(xpath='//*[@id="rectMask"]').click()
    else:
        # 加强版检测 (用于多次检测)
        time.sleep(1)
        check_time = 2  # 验证次数
        for i in range(check_time):
            # 点击确定按钮
            bro.find_element_by_xpath(xpath='//*[@id="alert_box"]/div[2]/div[2]/button').click()
            time.sleep(1)
            if i == 0:
                # 点击验证
                bro.find_element_by_xpath(xpath='//*[@id="rectMask"]').click()
                print("点击了验证")
                time.sleep(5)
            # 拖动滑块
            print("滑动")
            action = webdriver.ActionChains(bro)  # 利用行为链,持续按住并拖拽
            span = bro.find_element_by_xpath(xpath='//*[@id="nc_' + str(i + 1) + '_n1z"]')  # 获取滑块
            action.drag_and_drop_by_offset(span, 300, 0).perform()  # 按住并拖动 >250px即可
            action.release()  # 释放
            time.sleep(3)
        # 提交
        bro.find_element_by_xpath(xpath='//*[@id="ctlNext"]').click()
    time.sleep(10)
    bro.quit()


for i in range(200):
    try:
        run(0)
        print("第", i + 1, "次填表完成")
    except Exception as result:
        print(result)
    finally:
        time.sleep(10)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值