pyppeteer实现问卷星自动填写

环境安装

第三方库下载:pip install pyppeteer

驱动下载:我使用的是淘宝镜像中的chromium,进入这个网址 chromium,下载后解压到一个文件夹

了解pyppeteer

Pyppeteer 是一款非常高效的 web 自动化测试工具,由于 Pyppeteer 是基于 asyncio 构建的,它的所有属性和方法几乎都是 coroutine (协程) 对象,因此在构建异步程序的时候非常方便,天生就支持异步运行。

程序构建的基本思路是新建 一个 browser 浏览器 和 一个 页面 page。

问卷星练手

目标网站:https://www.wjx.cn/jq/78696684.aspx

要求:1. 将所有的单选题随机选择
2. 所有的多选题随机选择两个
3. 填空题随便填入一句话
4. 点击提交按钮之前,进行选择是否提交

着手:当我们打开目标后,发现它屏蔽了右键,此时我们可以按F12,或者Fn+F12
我们就可以很快找到题目以及选项以匹配,并且发现16题被隐藏了
pyppeteer实现问卷星自动填写_第1张图片
思路就是先找出单选题、多选题和填空题(这些也可以通过代码判断得知);其次获取29个题目,单选题随机选取,多选题随机选两个。详情请看代码:

import asyncio
from pyppeteer import launch
import random


async def main():
    # launch 方法会新建一个 Browser 对象,然后赋值给 browser
    browser = await launch({
        # 路径就是你刚才解压的驱动的位置
        'executablePath': 'F:\\BaiduNetdiskDownload\\chrome-win\\chrome.exe',
        # Pyppeteer 默认使用的是无头浏览器,所以要显示需要给False
        'headless': False
    })
    # 调用 newPage 方法相当于浏览器中新建了一个选项卡,同时新建了一个 Page 对象
    page = await browser.newPage()
    # 设置页面视图大小
    await page.setViewport(viewport={'width': 1280, 'height': 800})
    # Page 对象调用了 goto 方法就相当于在浏览器中输入了这个 URL,浏览器跳转到了对应的页面进行加载,加载完成之后再调用 content 方法,返回当前浏览器页面的源代码
    await page.goto('https://www.wjx.cn/jq/78696684.aspx')
    # 单选题随机选取
    for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 22, 28]:
        simple_sel = await page.querySelectorAll(f'#divquestion{i} ul li label')
        await random.choice(simple_sel).click()
        await asyncio.sleep(1)
    # 多选题随机选取两个
    for j in [12, 17, 18, 19, 20, 21, 23, 24, 25, 26, 27]:
        multiple_sel = await page.querySelectorAll(f'#divquestion{j} ul li label')
        # 这里使用sample而不用choice,因为要避免choice的重复
        lis = random.sample(multiple_sel, k=2)
        for li in lis:
            await li.click()
    # 填空题
    await page.type('#divquestion29 textarea', 'hello world')
    c = input('请输入1或0(1表示提交,其他表示不提交):')
    if c == 1:
        # 找到提交按钮提交
        await page.querySelectorAll('submit_table')
    else:
        await page.close()

asyncio.get_event_loop().run_until_complete(main())

你可能感兴趣的:(笔记)