爬虫:selenium、pyppeteer、playwright 浏览器驱动对比及应用实践

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]                         帮助
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 如果大家对 Python 爬虫有所了解的话,想必你应该听说过 Selenium 这个库,这实际上是一个自动化测试工...
    HelloJames阅读 1,172评论 0 13
  • Selenium是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在...
    FifiZhuang阅读 7,598评论 5 71
  • 如果大家对 Python 爬虫有所了解的话,想必你应该听说过 Selenium 这个库,这实际上是一个自动化测试工...
    g_ices阅读 703评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,534评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,187评论 4 8