| 本方法可能已被問卷星破解
 引言原準備用python+selenium完成對問卷星的自動填寫,但在填寫完成后出現(xiàn)智能驗證提示(可能是問卷星升級了,加強了對爬蟲的監(jiān)視叭!)
  emm,這個問題還不難解決,最大的問題在于在點擊智能驗證按鈕后卻顯示驗證失敗…
 
  在網(wǎng)上查找一翻資料后找到了用pyppeteer解決反爬的方法,過程如下
 
 準備安裝python第三方庫asyncio、pyppeteer和pyppeteer_stealth
 完整代碼 
 說明:本代碼可實現(xiàn)利用pyppeteer自動問卷星填寫填空題,填空題,日期選擇題,地址(手動輸入) import asyncio
from pyppeteer import launch
from pyppeteer_stealth import stealth    # 反爬蟲第三方庫
async def main():
    # launch方法會新建一個browser對象,然后賦值給browser
    browser = await launch({
        # 路徑就是你的谷歌瀏覽器的安裝路徑
        'executablePath': 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
        # Pyppeteer 默認使用的是無頭瀏覽器,所以要顯示需要給False
        'headless': False,
        # 設置Windows-size和Viewport大小來實現(xiàn)網(wǎng)頁完整顯示
        'args': ['--no-sandbox', '--window-size=1366,850']
    })
    # 調(diào)用 newPage 方法相當于瀏覽器中新建了一個選項卡,同時新建了一個Page對象
    page = await browser.newPage()
    await page.setViewport({'width':1366,'height':768})
    # 防止頁面識別出腳本(反爬蟲關鍵語句)
    await stealth(page)
    # 調(diào)用了Page對象的goto方法就相當于在瀏覽器中輸入問卷的網(wǎng)址,瀏覽器跳轉到了對應的頁面進行加載
    await page.goto('網(wǎng)址')
    # 填空題:page.type(selector,text),在指定selector的元素上填寫text
    await page.type('#q1', '姓名')
    await page.type('#q2', '學號')
    await page.type('#divquestion5 > table > tbody > tr:nth-child(1) > td > div > textarea', '體溫')
    
    # 單選題:先用page.querySelector(selector)找到指定的元素,再調(diào)用元素的click()方法
    button = await page.querySelector("#divquestion3 > ul > li:nth-child(8)")
    await button.click()
   
   	# 地址題:先點擊手動填寫地址,再在地址框內(nèi)填寫相應地址
    address = await page.querySelector("#divquestion7 > ul > li:nth-child(1) > label")
    await address.click()
    await page.type('#q9', '地址')
    
    # 日期選擇題:先點擊日期選擇框,在出現(xiàn)的iframe尋找元素并調(diào)用click()方法
    date1 = await page.querySelector("#q4")
    await date1.click()
    
    frame = page.frames
    date2 = await frame[1].querySelector('#selectTodayButton')
    await date2.click()
    # 找到提交按鈕提交
    submit = await page.querySelector('#submit_button')
    # await submit.click()
    await asyncio.sleep(2)                 # 頁面延遲2s看是否提交成功
    await browser.close()
    
asyncio.get_event_loop().run_until_complete(main())
 注:如何尋找網(wǎng)頁元素的selector請自行百度
 |