編程學習網 > 編程語言 > Python > Python Pyppeteer自動化入門教程
2023
09-19

Python Pyppeteer自動化入門教程

說到Pyppeteer得先說下Puppeteer,Puppeteer 是谷歌官方出品的一個通過 DevTools 協議控制 headless Chrome 的 NodeJS 庫。那Python版本就是Pyppeteer

不過需要注意的是:pyppeteer這個項目是非官方的。
雖然最新的提交代碼是2020年5月8日,也不維護了,但是對于使用python的朋友們,還是可以嘗試下。
功能:

?基礎功能
?生成頁面的截圖和 PDF
?自動提交表單,UI 測試,鍵盤輸入

?高級功能
?JS 注入
?模擬操作
?異步執行
?用戶偽裝

2.安裝方法
版本要求:Pyppeteer requires Python >= 3.6

python3 -m pip install pyppeteer
安裝這個第三方庫,會自動下載Chromium瀏覽器。

3. 官方小demo
import asyncio
from pyppeteer import launch

async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('http://example.com')
    await page.screenshot({'path': 'example.png'})
    await browser.close()

asyncio.get_event_loop().run_until_complete(main())
做了如下動作:

打開Chromium瀏覽器,訪問網站URL,截圖保存為圖片,關閉瀏覽器。

4. 實際會遇到的問題
?問題1:打開瀏覽器窗口很大,內容顯示很小
?問題2:不想顯示正在打開瀏覽器做啥操作
?問題3:存儲用戶的數據怎么配置在指定路徑。
?問題4:不想顯示Chrome正受自動測試軟件的控制。
?問題5:某些網站需要訪問proxy才可以打開,如何設置proxy?
?問題6:如何暫停一會?
?問題7:如何在文本框輸入,并回車
?等等...

實際例子:

#!/usr/bin/python
# coding=utf-8

__author__ = 'testerzhang'

from loguru import logger

import asyncio
from pyppeteer import launch

logger.add('logs/record.log')
USER_DATA = './userdata'


def screen_size():
    """使用tkinter獲取屏幕大小"""
    # import tkinter
    # tk = tkinter.Tk()
    # width = tk.winfo_screenwidth()
    # height = tk.winfo_screenheight()
    # tk.quit()

    width, height = 2048, 2048
    return width, height


async def main():
    width, height = screen_size()

    browser = await launch(
        {
            'headless': True,
            'userDataDir': USER_DATA,
            'args': ['--disable-infobars', f'--window-size={width},{height}'],
        }
    )
    page = await browser.newPage()
    await page.setViewport({'width': width, 'height': height})
    await page.goto('https://www.baidu.com')
    
    dimensions = await page.evaluate('''() => {
            return {
                width: document.documentElement.clientWidth,
                height: document.documentElement.clientHeight,
                deviceScaleFactor: window.devicePixelRatio,
            }
        }''')

        # {'width': 2048, 'height': 2048, 'deviceScaleFactor': 1}
    logger.debug(dimensions)
    
    await page.waitForSelector('input')

    await page.type('input#kw.s_ipt', f'python')
    # 點擊提交按鈕 click 通過selector點擊指定的元素
    # await page.click('input#su')
    # 點擊提交按鈕 通過回車方式
    await page.keyboard.press('Enter')
    # 等待N秒顯示結果
    await asyncio.sleep(2)

    # title_elements = await page.xpath('//h3[contains(@class,"t")]/a')
    # for item in title_elements:
    #     title_str = await (await item.getProperty('textContent')).jsonValue()
    #     print(title_str)

    content_elements = await page.xpath('//div[@class="c-container"]')
    for item in content_elements:
        content_str = await (await item.getProperty('textContent')).jsonValue()
        logger.debug(f"內容={content_str}")

    await page.screenshot({'path': 'pic/baidu_search.png'})

    await browser.close()


asyncio.get_event_loop().run_until_complete(main())
5. 可能會有檢測機制
比如你可以訪問https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html

如果沒調整代碼,該網站會識別你是自動化軟件。


可以稍微改下,比如增加特性:

await page.setUserAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5")

await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
                                       '{ webdriver:{ get: () => false } }) }')

當我們不會爬蟲加密模擬,也可以使用它操作瀏覽器做一些事情。

以上就是Python Pyppeteer自動化入門教程的詳細內容,想要了解更多Python教程歡迎持續關注編程學習網。

掃碼二維碼 獲取免費視頻學習資料

Python編程學習

查 看2022高級編程視頻教程免費獲取