访问网站
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())