python pyppeteer学习笔记

简介

Pyppeteer是Puppeteer的非官方Python支持,Puppeteer是一个无头JavaScript的基于Chrome/Chromium浏览器自动化库,可以用于对渲染网页的抓取。

优点

  • 免安装chrome。第一次使用时,会自动下载安装chromium(chromium相当于chrome的开发版本)。
    python pyppeteer学习笔记_第1张图片
  • 可直接抓取JavaScript渲染结果

安装

pip install pyppeteer

使用

  • 启动浏览器
browser = await launch(headless=False)

headless默认为True,即无界面启动。

  • 创建页面
page = await browser.newPage()
  • 设置页面大小
page.setViewport({'width': 1200, 'height': 800})

  • 访问url
page.goto(url)
  • 查询所有页面
browser.pages()
  • 返回页面源代码
page.content()
  • 输入字符串
page.type(selector, text)

selector用于确认节点位置。

  • Type selector
    • 语法: eltname
    • 例子: input对应
  • Class selector
    • 语法: .classname
    • 例子: .index对应class=index
  • ID selector
    • 语法: #idname
    • 例子: #index对应id=index
  • Universal selector
    选择所有元素,或者可以限制到特定的名称空间或所有名称空间。
    • 语法: * ns|* *|*
    • 例子: *会匹配到所有元素
  • Attribute selector
    • 语法: [attr] [attr=value] [attr~=value] [attr|=value] [attr^=value] [attr$=value] [attr*=value]
    • 例子: [autoplay]将匹配所有设置了autoplay attr对象的元素(任何值)。
  • 鼠标单击
page.click(selector)
  • 截图
page.screenshot({'path': 'example.png'})

具体用法可参考Puppeteer中文教程。

例子

Pyppeteer 是基于 Python 的新特性 async 实现,里面进行了异步操作,所以需要配合 async/await 关键词来实现。

Pyppeteer访问页面后,使用page.content()获取源代码,用 pyquery 解析获得JavaScript 渲染的结果。

今日头条搜索python并爬取前10条标题。
import asyncio
from pyppeteer import launch
from pyquery import PyQuery as pq


async def main():
    browser = await launch(headless=False)
    page = await browser.newPage()
    await page.setViewport({'width': 1200, 'height': 800})
    await page.goto('https://www.toutiao.com')
    await asyncio.sleep(5)
    # 在搜索框中输入python
    await page.type('input.tt-input__inner', 'python')

    # 点击搜索按钮
    await page.click('button.tt-button')
    await asyncio.sleep(5)

    # print(page.url)
    # 今日头条点击后新开一个页面, 通过打印url可以看出page还停留在原页面
    # 以下用于切换至新页面
    pages = await browser.pages()
    page = pages[-1]
    # print(page.url)

    page_source = await page.content()
    text = pq(page_source)
    await page.goto(url="https://www.toutiao.com/api/search/content/?aid=24&app_name=web_search&offset=60&format=json&keyword=python&autoload=true&count=20&en_qc=1&cur_tab=1&from=search_tab&pd=synthesis×tamp=1555589585193")
    for i in range(1, 10):
        print(text("#J_section_{} > div > div > div.normal.rbox > div > div.title-box > a > span".format(i)).text())

    await browser.close()

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

python pyppeteer学习笔记_第2张图片

参考

  • 别只用 Selenium,新神器 Pyppeteer 绕过淘宝更简单!

  • 使用Pyppeteer抓取渲染网页

微信扫一扫关注公众号

你可能感兴趣的:(Python)