隔壁寝室刷问卷刷疯了,我们寝室则相反,打游戏的同时问卷份数也在增加,隔壁寝室的人投来羡慕的目光,向我要代码!!

现在正值各校开学之际,本人也已开学,现在的任务就是社会实践,需要发布问卷调查。问卷份数的多少与你的人脉息息相关。对于人脉不是特别多的我来说,用python写一个程序来帮忙填问卷是个不错的选择。

一、前言

注:虽然问卷星中有多选题,但是本博文的程序只会单选,以后应该会更新多选题的代码

以下代码仅供参考哦,应具体问卷具体分析

 这是问卷星的部分问题

二、正文

1.模块

import random
from selenium import webdriver
import time
import schedule as schedule

①该程序通过selenium模拟人的点击操作,类似与别人帮你操作电脑。只不过这里的别人是python代码

②该程序通过random函数,做到随机选择某个选项

③schedule函数表示定时执行该程序,本文是每隔5秒运行程序(程序运行完后过5秒再开始重新运行)

2.注意事项

 

 

通过selenium运行问卷星的网址时,会出现智能验证,虽然只要点击就能进行智能检验,但是尝试后发现只要通过selenium运行,无论是手动还是自动,都会报错,尝试多次仍报错。起初我以为是运行时间没有间隔,导致问卷星把它当作爬虫处理,后来我加大时间间隔,发现仍然不行。

查阅相关资料以及别人的博客,我发现是因为问卷星的网页有反爬机制,它会检查你是不是通过selenium访问网页的。大多数情况下,检测基本原理是检测当前浏览器窗口下的window.navigator对象是否包含webdriver这个属性。因为在正常使用浏览器的情况下,这个属性是undefined,然而一旦我们使用了selenium,selenium会给window.navigator设置webdriver属性。很多网站就通过JS判断如果webdrive 属性存在,那就直接屏蔽。以下代码可以在每次页面加载之前就不会给window.navigator设置webdriver属性,从而能够通过智能检测。

    url = 'https://www.wjx.cn/vm/YD3Xwc3.aspx'
    option = webdriver.ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    option.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=option)
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
    })
    driver.get(url)

3.代码讲解

import random
from selenium import webdriver
import time
import schedule as schedule
def run():
    url = 'https://www.wjx.cn/vm/YD3Xwc3.aspx'
    # 躲避智能检测
    option = webdriver.ChromeOptions()
    option.add_experimental_option('excludeSwitches', ['enable-automation'])
    option.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=option)
    driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
    })
    driver.get(url)
    # 总共有13个题目
    i = 1
    while i <= 13:
        base_xpath1 = '//*[@id="div{}"]'.format(i)
        base_xpath3 = base_xpath1 + '/div[2]/div'
        a = driver.find_elements_by_xpath(base_xpath3)
        # print(len(a))
        # 在选项个数范围内,随机生成一个数字 如有四个选项,随机生成数字3
        b = random.randint(1, len(a))
        # print(b)
        # 通过随机数字,点击该数字的选项
        driver.find_element_by_css_selector('#div{} > div.ui-controlgroup > div:nth-child({})'.format(i, b)).click()
        time.sleep(1)
        # 当第六个问题回答第四个选项(其他)时,需要填写
        if i == 6 and b == 4:
            time.sleep(1)
            # 这里你可以每隔一段时间更改send_keys中的内容,也可以将答案写出来,然后随机选择哪个选项
            driver.find_element_by_css_selector('#tqq6_4').send_keys('QQ群和微信群')

        # 当第三个问题答案是是时,跳到5
        if i == 3 and b == 1:
            i = 5
        else:
            i += 1
    # 点击提交按钮
    time.sleep(0.5)
    driver.find_element_by_xpath('//*[@id="ctlNext"]').click()
    # 出现点击验证码验证
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="alert_box"]/div[2]/div[2]/button').click()
    time.sleep(0.5)
    driver.find_element_by_xpath('//*[@id="rectMask"]').click()
    time.sleep(4)
    # 关闭页面
    handles = driver.window_handles
    driver.switch_to.window(handles[0])
    time.sleep(1)
    # 刷新页面(可能不需要)
    driver.refresh()
    # 关闭当前页面,如果只有一个页面,则也关闭浏览器
    driver.close()
schedule.every(5).seconds.do(run)

while True:
    schedule.run_pending()

①以上代码定位元素最好copy selector,因为之前在浏览器copy xpath的时候有时候会报错。

②当第三题的答案为否时,才弹出第四题,当第三题的答案为是时,跳过第四题。

③两个if函数不能调换,否则i += 1运行时会找不到第六题其他选项的文本输入而报错。

④len(a)表示选项的个数,b表示随机选择一个数字(不会超出选项的个数)

import schedule as schedule
def run():
    pass


schedule.every(5).seconds.do(run)

while True:
    schedule.run_pending()

以上代码表示每隔5秒运行一次程序的模板,以后可以套用,隔的时间可以自己更改

4.运行视频

三、结论

运行该程序后,刷60份问卷左右,程序将会出现滑块验证码,大家感兴趣的可以试着去破解一下,该滑动验证码为从左滑到最右边。大家也可以用你室友的电脑运行一下这个程序。更重要的是,出现验证码后,过一个小时以后(具体时间不清楚),滑块验证码就又消失了,程序又能刷问卷了,本人由于份数刷够了,就没有接下去进行试验,大家感兴趣的可以去记录一下,看是否有规律。

猜你喜欢

转载自blog.csdn.net/knighthood2001/article/details/120098145