Puppeteer 重点研究
from pyppeteer import launch
async def main():
browser = await launch(headless = False) # headless = False,默认ture,为无头模式
page = await browser.newPage()
await page.goto(‘https://www.baidu.com’)
await page.screenshot({‘path’: ‘example.png’})
await browser.close()
asyncio.run(main())
开启浏览器
await launch()
方法定义pyppeteer.launcher.launch(options: dict = None, **kwargs) → pyppeteer.browser.Browser\
可以看到它处于 launcher 模块中,参数没有在声明中特别指定,返回类型是 browser 模块中的 Browser 对象,另外观察源码发现这是一个 async 修饰的方法,所以调用它的时候需要使用 await。
参数说明
ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的错误,默认是 False。
headless (bool): 是否启用 Headless 模式,即无界面模式,如果 devtools 这个参数是 True 的话,那么该参数就会被设置为 False,否则为 True,即默认是开启无界面模式的。
executablePath (str): 可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium。
slowMo (int|float): 通过传入指定的时间,可以减缓 Pyppeteer 的一些模拟操作。
args (List[str]): 在执行过程中可以传入的额外参数。
ignoreDefaultArgs (bool): 不使用 Pyppeteer 的默认参数,如果使用了这个参数,那么最好通过 args 参数来设定一些参数,否则可能会出现一些意想不到的问题。这个参数相对比较危险,慎用。
handleSIGINT (bool): 是否响应 SIGINT 信号,也就是可以使用 Ctrl + C 来终止浏览器程序,默认是 True。
handleSIGTERM (bool): 是否响应 SIGTERM 信号,一般是 kill 命令,默认是 True。
handleSIGHUP (bool): 是否响应 SIGHUP 信号,即挂起信号,比如终端退出操作,默认是 True。
dumpio (bool): 是否将 Pyppeteer 的输出内容传给 process.stdout 和 process.stderr 对象,默认是 False。
userDataDir (str): 即用户数据文件夹,即可以保留一些个性化配置和操作记录。
env (dict): 环境变量,可以通过字典形式传入。
devtools (bool): 是否为每一个页面自动开启调试工具,默认是 False。如果这个参数设置为 True,那么 headless 参数就会无效,会被强制设置为 False。
logLevel (int|str): 日志级别,默认和 root logger 对象的级别相同。
autoClose (bool): 当一些命令执行完之后,是否自动关闭浏览器,默认是 True。
loop (asyncio.AbstractEventLoop): 时间循环对象。
加载cookie
在启动的时候设置 userDataDir
import asyncio
from pyppeteer import launch
async def main():
browser = await launch(headless=False, userDataDir=’./userdata’, args=[‘–disable-infobars’])
page = await browser.newPage()
await page.goto(‘https://www.taobao.com’)
await asyncio.sleep(100)
asyncio.get_event_loop().run_until_complete(main())
常用Api
page.goto 访问网页
page.screenshot 网页截图保存
page.pdf 网页导出 PDF 保存
page.evaluate 执行 JavaScript 并返回对应数据
实例
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto(‘http://quotes.toscrape.com/js/’)
await page.screenshot(path=’example.png’)
await page.pdf(path=’example.pdf’)
dimensions = await page.evaluate(”'() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
}
}”’)
print(dimensions)
await browser.close()
asyncio.run(main())
元素定位API
1 百度
page.goto 跳转URL
page.type()
page.click
import asyncio
from pyppeteer import launch
async def baidu_search(keyword):
browser = await launch(headless=False)
page = await browser.newPage()
await page.goto(‘https://www.baidu.com/’)
await page.type(‘input#kw.s_ipt’, keyword)
await page.click(‘#su’)
await asyncio.sleep(100)
await browser.close()
if __name__ == ‘__main__’:
keyword = ‘pyppeteer’
asyncio.run(baidu_search(keyword))
2 今日头条
import asyncio
from pyppeteer import launch
async def main():
# headless参数设为False,则变成有头模式
browser = await launch(
# headless=False
)
page = await browser.newPage()
# 设置页面视图大小
await page.setViewport(viewport={‘width’:1280, ‘height’:800})
# 是否启用JS,enabled设为False,则无渲染效果
await page.setJavaScriptEnabled(enabled=True)
await page.goto(‘https://www.toutiao.com/’)
# 打印页面cookies
print(await page.cookies())
# 打印页面文本
print(await page.content())
# 打印当前页标题
print(await page.title())
# 抓取新闻标题
title_elements = await page.xpath(‘//div[@class=”title-box”]/a’)
for item in title_elements:
# 获取文本
title_str = await (await item.getProperty(‘textContent’)).jsonValue()
print(await item.getProperty(‘textContent’))
# 获取链接
title_link = await (await item.getProperty(‘href’)).jsonValue()
print(title_str)
print(title_link)
# 关闭浏览器
await browser.close()
asyncio.main(main())