美文网首页框架Python
爬虫:selenium、pyppeteer、playwright

爬虫:selenium、pyppeteer、playwright

作者: dex0423 | 来源:发表于2021-06-18 20:13 被阅读0次

    1. Selenium

    1.1. Selenium 简介
    • Selenium是最广泛使用的开源Web UI(用户界面)自动化测试套件之一。它最初由杰森·哈金斯(Jason Huggins)于2004年开发,作为Thought Works的内部工具。Selenium支持跨不同浏览器,平台和编程语言的自动化。

    • Selenium可以轻松部署在Windows,Linux,Solaris和Macintosh等平台上。此外,它支持IOS(IOS,Windows Mobile和Android)等移动应用程序的OS(操作系统)。

    • Selenium通过使用特定于每种语言的驱动程序支持各种编程语言。Selenium支持的语言包括C#,Java,Perl,PHP,Python和Ruby。目前,Selenium Web驱动程序最受Python和C#欢迎。

    • Selenium测试脚本可以使用任何支持的编程语言进行编码,并且可以直接在大多数现代Web浏览器中运行。 Selenium支持的浏览器包括Internet Explorer,Mozilla Firefox,Google Chrome和Safari。

    1.2. Selenium 优缺点:
    • selenium 支持多款主流浏览器,提供了功能丰富的API 接口,经常被我们用作爬虫工具来使用;
    • 但是 selenium 缺点也很明显,比如速度太慢、对版本配置要求严苛,最麻烦是经常要更新对应的驱动。
    • 还有些网页是可以检测到是否是使用了selenium ;
    • 并且selenium 所谓的保护机制不允许跨域 cookies 保存,登录的时候必须先打开网页然后后加载 cookies 再刷新的方式很不友好。
    1.3. Selenium 使用实践

    2. Pyppeteer

    2.1. Pyppeteer 简介
    • Pyppeteer 是一款非常高效的 web 自动化测试工具,是 Puppeteer 的 Python 版本,pyppeteer 只是在 puppeteer之上稍微包装了下而已;
    • Puppeteer 是 Google 基于 Node.js 开发的一个工具,主要是用来操纵 Chrome 浏览器的 API,通过 Javascript 代码来操纵 Chrome 浏览器的一些操作,用作网络爬虫完成数据爬取、Web 程序自动测试等任务,其 API 极其完善,功能非常强大。
    • Pyppeteer 可以实现的功能包括:
      -- 生成页面截图或 PDF;
      -- 抓取 SPA 并生成预渲染内容(SSR);
      -- 自动化表单提交、UI 测试,键盘输入 等;
      -- 创建最新的自动化测试环境,使用最新的 JavaScript 和浏览器功能直接在最新版本的 Chrome 中运行测试;
      -- 捕获站点的时间线跟踪,以帮助诊断性能问题;
      -- 测试 Chrome 扩展程序。
    2.2. Pyppeteer 优缺点
    • Pyppeteer 虽然支持的浏览器比较单一,但在安装配置的便利性和运行效率方面都要远胜 selenium;
    • Pyppeteer 的 web 自动化是基于 chromium 来实现的,由于 chromium 中某些特性的关系,Pyppeteer 的安装配置非常简单;
    • Pyppeteer 支持 asyncio 异步协程,对于并发比较友好
    • 但是,Pyppeteer 是第三方的,好久没有更新了,bug 也不少;
    • Pyppeteer 所依赖的 Puppeteer 的原生 JS 版本,本身就很不稳定;
    2.3. 使用实践
    # _*_coding:utf-8 _*_
    # @Software: PyCharm
    # @FileName: pyppteer.py
    # @Time    : 2021/6/18 19:54
    # @Desc    :
    
    import os
    import time
    from urllib.parse import urlsplit
    import asyncio
    import pyppeteer
    
    BASE_DIR = os.path.dirname(__file__)
    
    
    """
    intercept_request和intercept_response相当于是注册的两个回调函数,
    在浏览器发出请求和获取到请求之前指向这两个函数。
    """
    
    
    async def intercept_request(req):
        """请求过滤"""
        if req.resourceType in ['image', 'media', 'eventsource', 'websocket']:
            await req.abort()
        else:
            await req.continue_()
    
    
    async def intercept_response(res):
        """返回过滤"""
        resource_type = res.request.resourceType
        if resource_type in ['xhr', 'fetch']:
            resp = await res.text()
    
            url = res.url
            tokens = urlsplit(url)
    
            folder = BASE_DIR + '/' + 'data/' + tokens.netloc + tokens.path + "/"
            if not os.path.exists(folder):
                os.makedirs(folder, exist_ok=True)
            filename = os.path.join(folder, str(int(time.time())) + '.json')
            with open(filename, 'w', encoding='utf-8') as f:
                f.write(resp)
    
    
    async def main():
        browser = await pyppeteer.launch({
            # 'headless': False,
            # 'devtools': True
            'executablePath': '/Users/changjiang/apps/Chromium.app/Contents/MacOS/Chromium',
            'args': [
                '--disable-extensions',
                '--hide-scrollbars',
                '--disable-bundled-ppapi-flash',
                '--mute-audio',
                '--no-sandbox',
                '--disable-setuid-sandbox',
                '--disable-gpu',
            ],
            'dumpio': True,
        })
        page = await browser.newPage()
    
        await page.setRequestInterception(True)
        page.on('request', intercept_request)
        page.on('response', intercept_response)
    
        await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                                '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299')
        await page.setViewport({'width': 1080, 'height': 960})
        await page.goto('http://yangkeduo.com')
        await page.evaluate("""
                () =>{
                       Object.defineProperties(navigator,{
                         webdriver:{
                           get: () => false
                         }
                       })
                }
            """)
    
        await page.addScriptTag(path="path_to_your_js_file")        # 加载一个 js 文件
    
        await page.evaluate("你的那一段页面自动下拉 js 脚本")
    
        await browser.close()
    
    
    if __name__ == '__main__':
        asyncio.run(main())
    
    

    3. Playwright

    3.1. Playwright 简介
    • playwright-python,是一款基于python的自动化测试工具,可以通过录制功能自动生成测试脚本;
    • Playwright是一个强大的Python库,仅用一个API即可自动执行Chromium、Firefox、WebKit(Safari )等主流浏览器自动化操作,并同时支持以无头模式、有头模式运行;
    3.2. Playwright 优缺点
    • Playwright 具有以下优点:
    • 跨浏览器,支持Chrome、Firefox、WebKit;
    • 跨系统,支持Windows、Mac、Linux;
    • 跨语言,支持Python、Java、JS;
    • 可用于移动端。
    3.3.
    选项:
      -V, --version                          输出版本号
      -b, --browser <browserType>            浏览器类型
      --color-scheme <scheme>                更改主题 取值 "light" 或 "dark"
      --device <deviceName>                  模拟设备,例如  "iPhone 11"
      --geolocation <coordinates>            指定地理位置 例如 "37.819722,-122.478611"
      --lang <language>                      指定语言区域 "en-GB"
      --save-storage <filename>          保存浏览器状态到指定文件
      --load-storage <filename>              载入指定文件浏览器状态
      --proxy-server <proxy>                 指定代理服务器 例如 "http://myproxy:3128" 或 "socks5://myproxy:8080"
      --timezone <time zone>                 失去设置 例如 "Europe/Rome"
      --timeout <timeout>                    超时设置,单位毫秒 (default: "10000")
      --user-agent <ua string>               指定UA
      --viewport-size <size>                 指定浏览器像素 "1280, 720"
    命令:
      open [url]                             打开URL或用-b, --browser指定浏览器
      cr [url]                               打开URL用Chromium
      ff [url]                               打开URL用Firefox
      wk [url]                               打开URL用WebKit
      codegen [options] [url]                打开页面生成代码
      screenshot [options] <url> <filename>  页面截图
      pdf [options] <url> <filename>         保存页面为pdf
      install                                确保安装必要的浏览器驱动
      help [command]                         帮助
    

    相关文章

      网友评论

        本文标题:爬虫:selenium、pyppeteer、playwright

        本文链接:https://www.haomeiwen.com/subject/qtwykltx.html