Python爬虫拓展应用:最新版本问卷星自动刷,包括解决智能验证、滑块等问题

Python爬虫拓展应用: 最新版本问卷星自动刷,包括:解决智能验证、滑块等问题

Python爬虫自动刷“问卷星”网站问卷

基础需求:至少学过一门高级语言,有一定编程的思维,能够查阅理解python的语法。
发现女朋友又要收集几百份问卷数据,看她可怜巴巴的到处找人互助和填写问卷,我便查阅了相关资料,做了这个问卷自动刷。我女朋友是人文专业的,我深知很多文科的同学都需要进行痛苦的问卷收集,他们很需要这样的一款问卷自动刷爬虫,因此,本文将会尽量以通俗易懂的方式来讲解这款爬虫,希望大家能够脱离问卷的折磨,自己动手丰衣足食,加油吧~

爬虫运行准备

人类居住在地球上需要一个居住环境,同理,爬虫运行也需要一个运行环境。所以我们应该需要先下载一个合适的运行环境:

  1. Python集成开发环境 ,开发环境就是程序可以运行的大环境,可以把代码导入到该开发环境中使用。关于开发环境的使用说明网上资料特别齐全,很多命令不需要掌握,你只要知道打开、运行、停止等几个基本命令就行了。开发环境的种类有很多,有兴趣的可以自行寻找进行下载,这里我推荐用pycharm社区版(社区版是免费的)网址链接: pycharm官网.
  2. 运行程序所依赖的库 ,开发环境是爬虫运行的大环境,那么库就是爬虫运行的小环境。不同的软件有属于自己的小环境,相当于咱们每个人也都需要有自己的小房子。我用的是python3.8版本,在拥有了相关的python版本(安装集成开发环境一般自带一款python的版本)后,打开命令行窗口(如何打开命令行窗口见百度)
// 下载第一个依赖的库
pip install selenium;
// 下载第二个依赖的库
pip install pyautogui;
// 下载其他依赖的库
// 如果运行时,开发环境的运行窗口提示你缺少什么库,可以直接用下方命令对缺少的库进行下载
pip install 库名;
  1. 安装Chrome驱动 ,到网址链接: Chrome团队官网下载ChromeDriver驱动,有了这个驱动,你才能通过代码打开网页。但是,这里首先要保证你有谷歌浏览器,并且下载的驱动与谷歌浏览器的版本要对应。至于如何查看自己的版本自行百度。

爬虫运行代码

当你拥有了一个合适的运行环境,也有了相关可以依赖的库,那么现在就可以在开发环境中新建一个项目,然后再里面新建一个python文件,先把代码全部复制到文件中:

from selenium import webdriver
import time
from random import *
import pyautogui
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By


if __name__ == '__main__':
    # 刷问卷的份数。
    for index in range(1, 50):
        print(index, "份正在执行操作......")
        # 给出所需的url和option参数
        url_survey = ("https://www.wjx.cn/vj/YFmcIQw.aspx") # 根据需要填写url,也就是自己的网址
        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_survey)
        time.sleep(2)

        ##开始做题
        # 处理Q1
        # 生成随机数,决定点哪个按钮
        q1 = random()
        if 0 <= q1 <= 0.5:
            # 通过属性定位元素,第x题就是qx,第y个选项就是_y,例如Q1"//a[@rel='q1_1']"中,'q1_1'表示第一题的第一个选项
            # q1_1是Q1的第1个按钮
            driver.find_element_by_xpath("//a[@rel='q1_1']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q1_2']").click()

        # 处理Q2
        # 生成随机数,决定点哪个按钮
        q2 = random()
        if 0 <= q2 <= 0.1:
            driver.find_element_by_xpath("//a[@rel='q2_1']").click()
        elif 0.1 < q2 <= 0.25:
            driver.find_element_by_xpath("//a[@rel='q2_2']").click()
        elif 0.25 < q2 <= 0.5:
            driver.find_element_by_xpath("//a[@rel='q2_3']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q2_4']").click()

        # 处理Q3
        # 生成随机数,决定点哪个按钮
        q3 = random()
        if 0 <= q3 <= 0.25:
            driver.find_element_by_xpath("//a[@rel='q3_1']").click()
        elif 0.25 < q3 <= 0.50:
            driver.find_element_by_xpath("//a[@rel='q3_2']").click()
        elif 0.50 < q3 <= 0.75:
            driver.find_element_by_xpath("//a[@rel='q3_3']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q3_4']").click()

        # 处理Q4
        # 生成随机数,决定点哪个按钮
        q4 = random()
        if 0 <= q4 <= 0.8:
            driver.find_element_by_xpath("//a[@rel='q4_1']").click()
        elif 0.8 < q4 <= 0.9:
            driver.find_element_by_xpath("//a[@rel='q4_2']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q4_3']").click()

        # 处理Q5
        # 生成随机数,决定点哪个按钮
        q5 = random()
        if 0 <= q5 <= 0.25:
            driver.find_element_by_xpath("//a[@rel='q5_1']").click()
        elif 0.25 < q5 <= 0.50:
            driver.find_element_by_xpath("//a[@rel='q5_2']").click()
        elif 0.50 < q5 <= 0.75:
            driver.find_element_by_xpath("//a[@rel='q5_3']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q5_4']").click()

        # 处理Q6
        # 生成随机数,决定点哪个按钮
        q6 = random()
        if 0 <= q6 <= 0.9:
            # 通过属性定位元素
            # q1_1是Q1的第1个按钮
            driver.find_element_by_xpath("//a[@rel='q6_1']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q6_2']").click()

        # Q6如果选择有过,则处理Q7-Q10
        if 0 <= q6 <= 0.9:

            # 处理Q7
            # 生成随机数,决定点哪个按钮
            q7 = random()
            if 0 <= q7 <= 0.15:
                driver.find_element_by_xpath("//a[@rel='q7_1']").click()
                driver.find_element_by_xpath("//a[@rel='q7_4']").click()
            elif 0.15 < q7 <= 0.30:
                driver.find_element_by_xpath("//a[@rel='q7_2']").click()
                driver.find_element_by_xpath("//a[@rel='q7_3']").click()
            elif 0.30 < q7 <= 0.45:
                driver.find_element_by_xpath("//a[@rel='q7_2']").click()
                driver.find_element_by_xpath("//a[@rel='q7_5']").click()
            elif 0.45 < q7 <= 0.60:
                driver.find_element_by_xpath("//a[@rel='q7_4']").click()
                driver.find_element_by_xpath("//a[@rel='q7_5']").click()
            elif 0.45 < q7 <= 0.60:
                driver.find_element_by_xpath("//a[@rel='q7_2']").click()
            else:
                driver.find_element_by_xpath("//a[@rel='q7_1']").click()
                driver.find_element_by_xpath("//a[@rel='q7_2']").click()
                driver.find_element_by_xpath("//a[@rel='q7_5']").click()

            # 处理Q8
            # 生成随机数,决定点哪个按钮
            q8 = random()
            if 0 <= q8 <= 0.6:
                driver.find_element_by_xpath("//a[@rel='q8_1']").click()
            elif 0.6 < q8 <= 0.8:
                driver.find_element_by_xpath("//a[@rel='q8_2']").click()
            else:
                driver.find_element_by_xpath("//a[@rel='q8_3']").click()

            # 处理Q9
            # 生成随机数,决定点哪个按钮
            q9 = random()
            if 0 <= q9 <= 0.15:
                driver.find_element_by_xpath("//a[@rel='q9_1']").click()
                driver.find_element_by_xpath("//a[@rel='q9_4']").click()
            elif 0.15 < q9 <= 0.30:
                driver.find_element_by_xpath("//a[@rel='q9_2']").click()
                driver.find_element_by_xpath("//a[@rel='q9_3']").click()
            elif 0.30 < q9 <= 0.45:
                driver.find_element_by_xpath("//a[@rel='q9_6']").click()
                driver.find_element_by_xpath("//a[@rel='q9_5']").click()
            elif 0.45 < q9 <= 0.60:
                driver.find_element_by_xpath("//a[@rel='q9_7']").click()
                driver.find_element_by_xpath("//a[@rel='q9_8']").click()
                driver.find_element_by_xpath("//a[@rel='q9_10']").click()
            elif 0.45 < q9 <= 0.60:
                driver.find_element_by_xpath("//a[@rel='q9_1']").click()
            else:
                driver.find_element_by_xpath("//a[@rel='q9_1']").click()
                driver.find_element_by_xpath("//a[@rel='q9_2']").click()
                driver.find_element_by_xpath("//a[@rel='q9_5']").click()
                driver.find_element_by_xpath("//a[@rel='q9_9']").click()
                driver.find_element_by_xpath("//a[@rel='q9_7']").click()

            # 处理Q10
            # 生成随机数,决定点哪个按钮
            q10 = random()
            if 0 <= q10 <= 0.2:
                # 通过属性定位元素
                # q10_1是Q10的第1个按钮
                driver.find_element_by_xpath("//a[@rel='q10_1']").click()
            else:
                driver.find_element_by_xpath("//a[@rel='q10_2']").click()

            # Q10如果选择有过,则处理Q11
            if 0 <= q10 <= 0.2:
                # 处理Q11
                # 生成随机数,决定点哪个按钮
                q11 = random()
                if 0 <= q11 <= 0.15:
                    driver.find_element_by_xpath("//a[@rel='q11_1']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_2']").click()
                elif 0.15 < 11 <= 0.30:
                    driver.find_element_by_xpath("//a[@rel='q11_2']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_3']").click()
                elif 0.30 < q11 <= 0.45:
                    driver.find_element_by_xpath("//a[@rel='q11_3']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_4']").click()
                elif 0.45 < q11 <= 0.60:
                    driver.find_element_by_xpath("//a[@rel='q11_4']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_5']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_6']").click()
                elif 0.45 < q11 <= 0.60:
                    driver.find_element_by_xpath("//a[@rel='q11_7']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_8']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_9']").click()
                else:
                    driver.find_element_by_xpath("//a[@rel='q11_1']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_9']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_10']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_11']").click()
                    driver.find_element_by_xpath("//a[@rel='q11_12']").click()

        # 处理Q12
        # 生成随机数,决定点哪个按钮
        q12 = random()
        if 0 <= q12 <= 0.2:
            # 通过属性定位元素
            driver.find_element_by_xpath("//a[@rel='q12_1']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q12_2']").click()

        # Q12如果选择有过,则处理Q13
        if 0 <= q12 <= 0.2:
            # 处理Q13
            # 生成随机数,决定点哪个按钮
            q13 = random()
            if 0 <= q13 <= 0.15:
                driver.find_element_by_xpath("//a[@rel='q13_1']").click()
                driver.find_element_by_xpath("//a[@rel='q13_2']").click()
            elif 0.15 < 13 <= 0.30:
                driver.find_element_by_xpath("//a[@rel='q13_2']").click()
                driver.find_element_by_xpath("//a[@rel='q13_3']").click()
            elif 0.30 < q13 <= 0.45:
                driver.find_element_by_xpath("//a[@rel='q13_3']").click()
                driver.find_element_by_xpath("//a[@rel='q13_4']").click()
            elif 0.45 < q13 <= 0.60:
                driver.find_element_by_xpath("//a[@rel='q13_4']").click()
                driver.find_element_by_xpath("//a[@rel='q13_5']").click()
                driver.find_element_by_xpath("//a[@rel='q13_6']").click()
            elif 0.45 < q13 <= 0.60:
                driver.find_element_by_xpath("//a[@rel='q13_7']").click()
                driver.find_element_by_xpath("//a[@rel='q13_8']").click()
                driver.find_element_by_xpath("//a[@rel='q13_9']").click()
            else:
                driver.find_element_by_xpath("//a[@rel='q13_1']").click()
                driver.find_element_by_xpath("//a[@rel='q13_9']").click()
                driver.find_element_by_xpath("//a[@rel='q13_10']").click()
                driver.find_element_by_xpath("//a[@rel='q13_11']").click()
                driver.find_element_by_xpath("//a[@rel='q13_12']").click()

        # 处理Q14
        # 生成随机数,决定点哪个按钮
        q14 = random()
        if 0 <= q14 <= 0.5:
            # 通过属性定位元素
            # q1_1是Q1的第1个按钮
            driver.find_element_by_xpath("//a[@rel='q14_1']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q14_2']").click()

        # 处理Q15
        # 生成随机数,决定点哪个按钮
        q15 = random()
        if 0 <= q15 <= 0.1:
            # 通过属性定位元素
            # q1_1是Q1的第1个按钮
            driver.find_element_by_xpath("//a[@rel='q15_1']").click()
        elif 0.1 < q15 <= 0.55:
            driver.find_element_by_xpath("//a[@rel='q15_2']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q15_3']").click()

        # Q14如果选择不会,则处理Q16
        if 0.5 < q14 <= 1:
            # 处理Q16
            # 生成随机数,决定点哪个按钮
            q16 = random()
            if 0 <= q16 <= 0.15:
                driver.find_element_by_xpath("//a[@rel='q16_1']").click()
                driver.find_element_by_xpath("//a[@rel='q16_2']").click()
            elif 0.15 < 16 <= 0.30:
                driver.find_element_by_xpath("//a[@rel='q16_2']").click()
                driver.find_element_by_xpath("//a[@rel='q16_3']").click()
            elif 0.30 < q16 <= 0.45:
                driver.find_element_by_xpath("//a[@rel='q16_3']").click()
                ##driver.find_element_by_xpath("//a[@rel='q16_4']").click()
            elif 0.45 < q16 <= 0.60:
                ##driver.find_element_by_xpath("//a[@rel='q16_4']").click()
                driver.find_element_by_xpath("//a[@rel='q16_2']").click()
                driver.find_element_by_xpath("//a[@rel='q16_1']").click()
            elif 0.45 < q16 <= 0.60:
                driver.find_element_by_xpath("//a[@rel='q16_3']").click()
                driver.find_element_by_xpath("//a[@rel='q16_1']").click()
                driver.find_element_by_xpath("//a[@rel='q16_2']").click()
            else:
                driver.find_element_by_xpath("//a[@rel='q16_1']").click()
                driver.find_element_by_xpath("//a[@rel='q16_2']").click()
                driver.find_element_by_xpath("//a[@rel='q16_3']").click()

        # 处理Q17
        # 生成随机数,决定点哪个按钮
        q17 = random()
        if 0 <= q17 <= 0.25:
            # 通过属性定位元素
            # q1_1是Q1的第1个按钮
            driver.find_element_by_xpath("//a[@rel='q17_1']").click()
        elif 0.25 < q17 <= 0.55:
            driver.find_element_by_xpath("//a[@rel='q17_2']").click()
        elif 0.55 < q17 <= 0.75:
            driver.find_element_by_xpath("//a[@rel='q17_2']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q17_3']").click()

        # 处理Q18
        # 生成随机数,决定点哪个按钮
        q18 = random()
        if 0 <= q18 <= 0.15:
            driver.find_element_by_xpath("//a[@rel='q18_1']").click()
            driver.find_element_by_xpath("//a[@rel='q18_4']").click()
        elif 0.15 < q18 <= 0.30:
            driver.find_element_by_xpath("//a[@rel='q18_2']").click()
            driver.find_element_by_xpath("//a[@rel='q18_3']").click()
        elif 0.30 < q18 <= 0.45:
            driver.find_element_by_xpath("//a[@rel='q18_2']").click()
            driver.find_element_by_xpath("//a[@rel='q18_5']").click()
        elif 0.45 < q18 <= 0.60:
            driver.find_element_by_xpath("//a[@rel='q18_4']").click()
            driver.find_element_by_xpath("//a[@rel='q18_5']").click()
        elif 0.45 < q18 <= 0.60:
            driver.find_element_by_xpath("//a[@rel='q18_6']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q18_1']").click()
            driver.find_element_by_xpath("//a[@rel='q18_2']").click()
            driver.find_element_by_xpath("//a[@rel='q18_5']").click()
            driver.find_element_by_xpath("//a[@rel='q18_6']").click()

        # 处理Q19
        # 生成随机数,决定点哪个按钮
        q19 = random()
        if 0 <= q19 <= 0.15:
            driver.find_element_by_xpath("//a[@rel='q19_1']").click()
            driver.find_element_by_xpath("//a[@rel='q19_4']").click()
            driver.find_element_by_xpath("//a[@rel='q19_7']").click()
        elif 0.15 < q19 <= 0.30:
            driver.find_element_by_xpath("//a[@rel='q19_2']").click()
            driver.find_element_by_xpath("//a[@rel='q19_3']").click()
        elif 0.30 < q19 <= 0.45:
            driver.find_element_by_xpath("//a[@rel='q19_2']").click()
            driver.find_element_by_xpath("//a[@rel='q19_5']").click()
        elif 0.45 < q19 <= 0.60:
            driver.find_element_by_xpath("//a[@rel='q19_4']").click()
            driver.find_element_by_xpath("//a[@rel='q19_5']").click()
        elif 0.45 < q19 <= 0.60:
            driver.find_element_by_xpath("//a[@rel='q19_6']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q19_1']").click()
            driver.find_element_by_xpath("//a[@rel='q19_2']").click()
            driver.find_element_by_xpath("//a[@rel='q19_5']").click()
            driver.find_element_by_xpath("//a[@rel='q19_6']").click()

        # 处理Q20
        # 生成随机数,决定点哪个按钮
        q20 = random()
        if 0 <= q20 <= 0.15:
            driver.find_element_by_xpath("//a[@rel='q20_1']").click()
            driver.find_element_by_xpath("//a[@rel='q20_4']").click()
        elif 0.15 < q20 <= 0.30:
            driver.find_element_by_xpath("//a[@rel='q20_2']").click()
            driver.find_element_by_xpath("//a[@rel='q20_3']").click()
        elif 0.30 < q20 <= 0.45:
            driver.find_element_by_xpath("//a[@rel='q20_2']").click()
        elif 0.45 < q20 <= 0.60:
            driver.find_element_by_xpath("//a[@rel='q20_4']").click()
        elif 0.45 < q20 <= 0.60:
            driver.find_element_by_xpath("//a[@rel='q20_4']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q20_1']").click()
            driver.find_element_by_xpath("//a[@rel='q20_2']").click()


        # 模拟点击提交按钮
        driver.find_element_by_xpath("//input[@value='提交']").click()
        time.sleep(0.5)

        # 模拟点击智能验证按钮
        # 先点确认
        driver.find_element_by_xpath("//button[text()='确认']").click()
        # 再点智能验证提示框,进行智能验证
        driver.find_element_by_xpath("//div[@id='captcha']").click()

        # 解决滑块拖动
        pyautogui.keyDown('Enter')
        time.sleep(4)
        cnt = 0
        while True:
            cposition = pyautogui.locateOnScreen('pics/ff5.png')
            if cposition: break
            time.sleep(0.5)
            cnt += 1
            if cnt > 6:
                try:
                    print("无需进行滑块验证")
                    invert_localtor = ("xpath", "//div[@id='ctl01_ContentPlaceHolder1_lbDefault']")
                    time.sleep(2)
                    finished = WebDriverWait(driver, 20).until(
                        EC.presence_of_element_located(invert_localtor)
                    )
                    print('————————第%d页已完成————————' % index)
                    time.sleep(0.5)
                    driver.quit()
                    break
                except:
                    print("元素未等到")
                    print('————————第%d页失败!————————' % index)
                    break

        if cposition:
            print("正在进行滑块验证")
            cc = pyautogui.center(cposition)
            pyautogui.dragRel(256, 0, duration=0.8)
            pyautogui.moveTo(cc[0], cc[1])
            pyautogui.dragRel(320, 0, duration=3)  # duration 也不能太小

            try:
                print("滑块验证成功")
                time.sleep(2)
                finished = WebDriverWait(driver, 20).until(
                    EC.presence_of_element_located('//*[@id=”ctl01_ContentPlaceHolder1_lbDefault”]/div')
                )
                print('————————第%d页已完成————————' % index)
                time.sleep(0.5)
                driver.quit()
            except:
                print("滑块验证成功,但元素未等到")
                print('————————第%d页失败!————————' % index)

        # (By.CSS_SELECTOR, "#tbAward > tbody > tr:nth-child(2) > td:nth-child(2) > a")

这么一大段代码其实就分为三个部分:

  1. 爬虫程序自动打开所爬网页;
  2. 程序将所需要填写的问卷填完;
  3. 程序将所填完的试卷进行提交。一个具有注脚的文本。[^2]

代码解释

1.定位属性元素。通过属性定位元素,第x题就是qx,第y个选项就是_y,例如Q1的"//a[@rel=‘q1_1’]"中,'q1_1’表示第一题的第一个选项,因此,可以通过定位属性元素,来确定某个选项的选择序号。
2.概率确定。利用if、elif等语句确定每个选项的概率,例如:

# 处理Q5
        # 生成随机数,决定点哪个按钮
        q5 = random()
        if 0 <= q5 <= 0.25:
            driver.find_element_by_xpath("//a[@rel='q5_1']").click()
        elif 0.25 < q5 <= 0.50:
            driver.find_element_by_xpath("//a[@rel='q5_2']").click()
        elif 0.50 < q5 <= 0.75:
            driver.find_element_by_xpath("//a[@rel='q5_3']").click()
        else:
            driver.find_element_by_xpath("//a[@rel='q5_4']").click()

这就代表:
随机数q5在0~0.25的时候,选择A选项;
随机数q5在0.25~0.5的时候,选择B选项;
随机数q5在0.5~0.75的时候,选择C选项;
随机数q5在其他时候,选择D选项;
因此,可以通过改变条件语句的判定条件来确定概率。

好了,暂时更这么多…最近导师一直催工作,代码可用,解释有空再续更。

参考博客

  1. Python爬虫拓展应用——Selenium代刷问卷星问卷
  2. Python selenium自动化刷问卷+绕过智能验证
  3. 问卷星全自动填写脚本【详细使用教程】
  4. Python基础之pyautogui模块(详细总结鼠标键盘操作)
  5. 问卷星自动填写,智能验证和滑动块
  6. 问卷星自动填写,智能验证和滑动块
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值