zoukankan      html  css  js  c++  java
  • pyppeteer的使用

    pyppeteer的使用

    安装

    • 属于第三方模块进行安装. pip install pyppeteer

    • 在Linux中,如果权限不够则加上. sudo pip install pyppeteer

    使用

    使用今日头条作为demo

    from pyppeteer import launch
    import asyncio

    async def main(timeout=30):# 设定时间超时, 默认是30秒
       # async 用来申明一个函数是一个异步函数
       browser = await launch(headless=True, args=["--no-sandbox"])
       # 参数说明:
       # headless 参数设为False,变为有头模式
       # Pyppeteer 支持字典和关键字传递参数
       page = await browser.newPage()
       
       # 设置页面大小
       await page.setViewport(viewport={"width":1280, "height":800})
       
       # 是否启用JS, enabled设为False,则无渲染效果
       await page.setJavaScriptEnabled(enabled=True)
       
       # 超时时间设置
       res = await page.goto(url=url, options={"timeout":1000})
       # 响应头
       resp_headers = res.headers
       # 响应状态
       resp_status = res.status
       
       # 等待
       await asynico.sleep(2)
       # 第二种方法
       while not await page.querySelector(".t"):
           pass
       
       # 滚动到页面底部
       await page.evaluate('windows.scrollBy(0,document.body.scrollHeight)')
       
       # 截图报存图片
       await page.screenshot({"path": "toutiao.png"})
       
       # 获取cookie
       print(await page.cookies())  
       
       # 打印页面文本信息
       print(await page.content())
       
       # 在页面上执行js脚本
       dimensions = await page.evaluate(pageFunction='''() => {
              return {
                  document.documentElement.clientWidth, // 页面宽度
                  height: document.documentElement.clientHeight, // 页面高度
                  deviceScaleFactor: window.devicePixelRatio, // 像素比 1.0000000149011612
              }
          }''', force_expr=False)  # force_expr=False 执行的是函数
       print(dimensions)
       # 只获取文本 执行 js 脚本 force_expr 为 True 则执行的是表达式
       content = await page.evaluate(pageFunction='document.body.textContent', force_expr=True)
       print(content)

       # 打印当前页标题
       print(await page.title())
       
       # 抓取其他信息
       """
      1.选择器, Page.querySelector()
      2.选择器, Page.querySelectorAll()
      3.xpath表达式, Page.xpath()
      """
       # 使用querySelector()
       element = await page.querySelector(".feed-infinite-wrapper > ul>li") # 只抓取一个
       print(element)
       
       # 获取所有的文本信息, 执行js代码
       content = await page.querySelectorAll('(element) => element.textContent', element)
       print(content)
       
       # 使用xpath
       # elements = await page.xpath('//div[@class="title-box"]/a')
       # 使用选择器全选
       elements = await page.querySelectorAll(".title-box a")
       for item in elements:
           print(await item.getProperty("textContent"))
           # 获取文本信息
           title = await (await item.getProperty("textContent")).jsonValue()
           # 获取连接
           link = await (await item.getProperty("href")).jsonValue()
           print(title)  
           print(link)
       # 关闭浏览器
       await browser.close()  
    • 如何启动程序

    • 1.创建一个event_loop对象

         loop = asyncio.get_event_loop()
    • 2.启动运行

         loop.run_until_complete(main())

    模拟键盘输入

    # 模拟输入 账号密码  {'delay': rand_int()} 为输入时间
       await page.type('#TPL_username_1', "sadfasdfasdf")
       await page.type('#TPL_password_1', "123456789", )
       
       await page.waitFor(1000)
       await page.click("#J_SubmitStatic")
    使用tkinter获取页面高度宽度
    def screen_size():
       """使用tkinter获取屏幕大小"""
       import tkinter
       tk = tkinter.Tk()
       width = tk.winfo_screenwidth()
       height = tk.winfo_screenheight()
       tk.quit()
       return width, height
    针对iframe操作
    • page.frames获取所有的iframe列表,需要判断操作的是哪一个iframe跟操作page一样

    from pyppeteer import launch
    import asyncio

    async def main(url):
       w = await launch({"headless":False, "args":["--no-sandbox"]})
       page = await w.newPage()
       await page.setViewport({"width":1366, "height":800})
       await page.goto(url)
       try:
           await asyncio.sleep(1)
           frame = page.frames
           print(frame)
           
           title = await frame[1].title()
           print(title)
           
           await asyncio.sleep(1)
           login = await frame[1].querySelector('#switcher_plogin')
           print(login)
           
           await login.click()
           await asyncio.sleep(5)
       except Exception as e:
           print(e)
       for page in await w.pages():
           await page.close()
       await w.close()

    asyncio.get_event_loop().run_until_complete(main("https://i.qq.com/?rd=1"))
    # asyncio.get_event_loop().run_until_complete(main("https://www.gushici.com/"))

    大部分借鉴与别人,目前觉得模拟器爬虫还是比较慢的,静待大家的创新。

  • 相关阅读:
    DataTable、GridView、DataList导出至Word或Excel
    实现字符串转换为图片
    Sina App Engine与Google App Engine区别对比
    C/C++反序输出字符串总结
    NAND flash和NOR flash详解
    [转载]看完《python简明教程》笔记及第一个python程序
    Python写爬虫——抓取网页并解析HTML
    ACM HDU 1004 Let the Balloon Rise
    有向图的强连通分量
    ACM HDU 1005 Number Sequence
  • 原文地址:https://www.cnblogs.com/liudemeng/p/11496175.html
Copyright © 2011-2022 走看看