Pyppeteer库之三:Pyppeteer的页面操作(上)

访问网站
goto (url: str, options: dict = None, **kwargs: Any
                   ) -> Optional[Response]

options:

  • timeout(int): 跳转等待时间,单位是毫秒, 默认是30秒, 传 0 表示无限等待。
  • waitUntil(str|List[str]):满足什么条件认为页面跳转完成,默认是 load 事件触发时(页面加载完毕)。其它事件如下:
    domcontentloaded - DOM 树构建完成
    networkidle0 - 不再有网络连接时触发(至少500毫秒后)
    networkidle2 - 只有2个网络连接时触发(至少500毫秒后)

DOM文档的加载步骤为:

解析HTML结构。
加载外部脚本和样式表文件。
解析并执行脚本代码。
DOM树构建完成。//domcontentloaded
加载图片等外部文件。
页面加载完毕。//load


示例:

    await page.goto('https://www.baidu.com/', {
        # 配置项 等待网络状态为空闲的时候才继续执行
        'waitUntil': 'networkidle0'
    })

注:page.goto 要么抛出错误,要么返回主页面的响应。唯一例外是打开空白页 about:blank,返回 null 。



截图

可以全屏截图、元素截图,语法如下:

screenshot (options: dict = None, **kwargs: Any ) 

options:

  • path (str):保存图片的文件路径。截图将从文件扩展名推断类型。
  • fullPage (bool):是否滚动页面。默认为 False。
  • clip (dict):指定页面裁剪区域。此选项需要以下参数:
    x (int) - 剪辑区域左上角的X坐标。
    y (int) - 剪辑区域左上角的Y坐标。
    width (int) - 裁剪区域的宽度。
    height (int) - 剪裁区域的高度。

例子:

import asyncio
from pyppeteer import launch

width, height = 1366, 768


async def main():
    browser = await launch({
        'headless': False,
        'args': [f'--window-size={width},{height}']
    })
    page = await browser.newPage()
    await page.setViewport({'width': width, 'height': height})
    await page.goto('https://www.baidu.com')
    await page.screenshot({'path': 'baidu.png'})  # 页面截图
    element = await page.J('#lg>img')            # 查找元素
    await element.screenshot({'path': 'element.png'})  # 元素级截图
    await asyncio.sleep(3)
    await browser.close()


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

注:如果通过 element.screenshot() 元素截图有偏差,这是跟电脑分辨率设置有关。

解决:在显示设置 - 将电脑缩放改为100%



生成PDF
    await page.emulateMedia('screen')
    await page.pdf({
        'path': 'baidu.pdf',
        'printBackground': True
    })

注:仅支持无头模式。



选择器
  • querySelector(),缩写 J()
  • querySelectorAll(),缩写 JJ()

注:返回的类型 ElementHandle, 表示一个页内的 DOM 元素,其实是执行的document.querySelector,document.querySelectorAll

例子:

    await page.goto('https://www.baidu.com/')
    # 返回单个,如果多个返回第一个,没有返回 null
    el = await page.J('#su')
    print(type(el))
    # 返回多个,如果没有返回空列表 []
    els = await page.JJ('#u1>a')
    print(els)

querySelectorEval(selector, pageFunction[, …args])

此方法在页面内执行 document.querySelector ,然后把匹配到的元素作为第一个参数传给 pageFunction

  • querySelectorEval(),缩写 Jeval()
  • querySelectorAllEval(),缩写 JJeval()

例子:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    # 获取元素本身
    e = await page.Jeval('#u1>a[name="tj_trtieba"]', 'e => e.outerHTML')
    print(e)
    # 获取元素的某个属性值
    link = await page.Jeval('#u1>a[name="tj_trtieba"]', 'el => el.href')
    value = await page.Jeval('#su', 'el => el.value')
    print(link, value)
    # 获取元素中的文本
    text = await page.Jeval('#u1>a[name="tj_trtieba"]', 'el => el.innerText')
    print(text)
    # 获取多个多个链接
    links = await page.JJeval('#u1>a', '(els) => els.map(el => el.href)')
    print(links)
    await browser.close()


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


跳转等待
waitForNavigation( options: dict = None, **kwargs: Any
                                ) -> Optional[Response]

通常与 点击事件 绑定。比如,点击某个链接跳转到新页面,options 与 goto() 相同

例子:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch({'headless': False})
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    await asyncio.sleep(1)
    await asyncio.wait([
        page.click('a[name="tj_trhao123"]'),
        page.waitForNavigation({'waitUntil': 'networkidle0'}),
    ])
    await asyncio.sleep(3)
    await browser.close()


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

或者:

    await asyncio.gather(
        page.click('a[name="tj_trhao123"]'),
        page.waitForNavigation({'waitUntil': 'networkidle0'}),
    )


模拟用户输入
page.type(selector, text[, options])

参数:

  • selector (str):要输入内容的元素选择器。如果有多个匹配的元素,输入到第一个匹配的元素。
  • text (str) :要输入的内容。
  • options :
    delay (number) - 每个字符输入的延迟,单位是毫秒。默认是 0。

例子:
import asyncio
import random
from pyppeteer import launch

width, height = 1366, 768


def input_time_random():
    return random.randint(100, 150)


async def main():
    browser = await launch({
        'headless':False,
        'args': [f'--window-size={width},{height}', '--no-sandbox']
    })
    page = await browser.newPage()
    await page.goto('https://login.taobao.com')
    await page.setViewport({'width': width, 'height': height})
    await page.waitFor(3000)
    await page.click('div.login-links > a.forget-pwd.J_Quick2Static')
    await page.waitFor(2000)
    await page.type('#TPL_username_1', '123456789@qq.com',
                    {'delay': input_time_random() - 30})
    await page.type('#TPL_password_1', '1234567890',
                    {'delay': input_time_random()})
    await page.waitFor(3000)
    await browser.close()


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


cookie操作

例子:

import asyncio
from pyppeteer import launch


async def main():
    browser = await launch()
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    # 打印页面所有cookies
    print(await page.cookies())
    # 删除某个cookie,name为必填
    await page.deleteCookie({'name': 'H_PS_PSSID'})
    # 设置cookie,name,value必填
    await page.setCookie({
        'name': 'BDUSS',
        'value': 'AF1C8DF101157E768824DBFAD465FA31:FG=1'
    })
    print(await page.cookies())
    await browser.close()


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


页面等待

await page.waitFor(selector|xpath|function|timeout)

  • waitForSelector() 等价于 waitFor(selector)
  • waitForXPath() 等价于 waitFor(xpath)
  • waitForFunction() 等价于 waitFor(xpath)

例子:在 10 秒内等待一个不可用的元素

import asyncio
from pyppeteer import launch
import time


async def main():
    browser = await launch({'headless': False})
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    start = time.time()
    try:
        el = await page.waitForFunction(
            '() => document.querySelector("#su12345")',
            timeout=10 * 1000,
        )
        print(type(el))
    except:
        print('errors.TimeoutError')
    finally:
        end = time.time()
        print(end - start)
    await browser.close()


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


页面信息、设置
import asyncio
from pyppeteer import launch
from fake_useragent import UserAgent

ua = UserAgent()


async def main():
    browser = await launch({'headless': False})
    page = await browser.newPage()
    await page.goto('https://www.baidu.com')
    '''获取获取页面信息'''
    # 获取url
    print(page.url)
    # 获取页面的完整渲染的HTML内容
    print(await page.content())
    # 获取页面的所有框架
    print(page.frames)
    # 获取页面的主框架
    print(page.mainFrame)
    # 获取页面的标题
    print(await page.title())
    # 获取视窗大小
    print(page.viewport)
    # 获取页面的所有执行线程
    print(page.workers)
    '''页面设置'''
    # 设置视窗大小
    await page.setViewport({'width': 1366, 'height': 768})
    # 设置随机ua
    await page.setUserAgent(ua.random)
    print(await browser.userAgent())
    # 为每个请求启用/禁用缓存,默认启用
    await page.setCacheEnabled(True)
    # 设置HTTP头部
    await page.setExtraHTTPHeaders({'User-Agent': 'Mozilla/5.0'})
    # 设置最大导航超时时间,默认30秒
    await page.setDefaultNavigationTimeout(30000)
    # 设置 JavaScript 启用/禁用
    await page.setJavaScriptEnabled(True)
    # 启用/禁用请求拦截
    await page.setRequestInterception(False)
    '''页面操作'''
    # 刷新
    await page.reload()
    # 后退
    await page.goBack()
    # 前进
    await page.goForward()

    await browser.close()


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

虫之吻

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值