【2019.06.19】Python3 + Puppeteer Api介绍及调用实例、定位(百度首页,今日头条)

demo

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())
--------------------- 
作者:耳森Paulson 
来源:CSDN 
原文:https://blog.csdn.net/qq_38534107/article/details/92833863 
版权声明:本文为博主原创文章,转载请附上博文链接!

开启浏览器

  • 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())
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值