爬虫框架 Selenium Pyppeteer Playwright Luna对比

这篇具有很好参考价值的文章主要介绍了爬虫框架 Selenium Pyppeteer Playwright Luna对比。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

爬虫框架 Selenium Pyppeteer Playwright Luna对比

1. Selenium

经典且落后、特征明显、特别容易被检测出来。

2. Pyppeteer:轻量级工具,功能稍强。

nice、但是一样容易被检测、但是稍微好一点点。

3. Playwright:强大且全面的自动化框架。

可以说还行、各方面比较不错,无论多语言环境、还是多平台环境、还是更新、各个都不错、但是你如果用的久了就发现,一些细节上还是很难满足自己的需求,特别是大规模使用的稳定性,和突防能力。

说白了还是能轻易识别出来你是爬虫,我指的不是那种换换ip就行的那种盾。

还有就是细节上,太不稳定,因为基于事件模型,就这样没办法。

4. Luna:新兴的自动化框架,专注于抗指纹。

Luna 这个缺点就是目前比较新,且仅支持golang语言,但是突防能力、和全面能力、和速度都比较有优势,比较适合大型、或者较为难一点的盾,和稳定性要求比较高的点。

  • 模拟浏览器指纹信息: Luna 可以模拟大部分浏览器指纹信息,使自动化操作更接近真实用户。
  • 视觉方式自动化操作: 它可以通过截图来操作浏览器,实现更快的自动化。
  • 鼠标移动轨迹模拟: Luna 支持模拟鼠标移动轨迹,使操作更自然。
  • 代理IP支持: 它支持多种代理IP类型,包括HTTP、HTTPS和SOCKS5。
  • 网络功能完善: Luna的网络功能相对完善,有助于更高效的自动化操作。

需要注意的是,Luna 是一个新框架,可能需要一些时间来发展和壮大。它可能是面向那些需要抗指纹功能的用户的理想选择。

结论

最终选择哪个框架取决于您的具体需求和技术栈。无论您是寻找经典的解决方案,还是探索新的前沿技术,都有一个适合您的自动化框架。


我们可以看一下用luna是怎么操作自动化的小例子、如果你看不懂,可以找我学习。

项目原地址:https://github.com/musiclover789/luna

package test_case

import (
    "fmt"
    "github.com/musiclover789/luna/base_devtools/input"
    "github.com/musiclover789/luna/base_devtools/page"
    "github.com/musiclover789/luna/base_devtools/runtime"
    "github.com/musiclover789/luna/devtools"
    "github.com/musiclover789/luna/luna_utils"
    "github.com/musiclover789/luna/protocol"
    "github.com/musiclover789/luna/script"
    "testing"
    "time"
)

func TestBaidu(t *testing.T) {
    luna_utils.KillProcess()
    /********************************/
    //chromiumPath := "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
    chromiumPath := "C:\\src\\chromedev\\chromium\\src\\out\\Default/chrome.exe"
    browserObj := devtools.NewBrowser(chromiumPath, &devtools.BrowserOptions{
       CachePath: luna_utils.CreateCacheDirInSubDir("C:\\workspace\\tempcatch"),
       ImgPath:   "C:\\workspace\\v2\\v2\\luna/test_img/baidu_img",
       Headless:  false,
       //ProxyStr:  "https://API1M5TV:9BFF49220D11@42.179.160.60:39349",
       //Fingerprint: []string{"fingerprint1", "fingerprint2"},
       WindowSize: &devtools.WindowSize{
          Width:  1496,
          Height: 967,
       },
    })
    //&{2 1496 967 1496 858}
    fmt.Println()
    browserObj.DevToolsConn.ShowLog(false)

    err, itemPage := browserObj.OpenPageAndListen("https://www.baidu.com", func(devToolsConn *protocol.DevToolsConn) {
       //第一个处理
       devToolsConn.ShowLog(true)
       page.PageEnable(devToolsConn)
       devToolsConn.SubscribeOneTimeEvent("Page.loadEventFired", func(param interface{}) {
          runtime.Evaluate(devToolsConn, script.ShowMousePosition())
       })
       devToolsConn.SubscribeOneTimeEvent("Page.windowOpen", func(param interface{}) {
          runtime.Evaluate(devToolsConn, script.ShowMousePosition())
       })
    })
    fmt.Println(itemPage.RunJSSync(" function aa(){ return navigator.languages;} aa();", time.Minute))
    if err == nil {
       itemPage.RunJS(script.ShowMousePosition())
       itemPage.DevToolsConn.ReduceSpeed(10)
       err, ok := itemPage.WaitForMatchOnPageSync("home.png", 0.5, time.Hour)
       if err == nil && ok {
          fmt.Println("说明、页面已经成功打开")
          //time.Sleep(time.Hour)
          err, imageCoordinates := itemPage.SimilarityWithMargin("home.png", 50, 200, 10, 10, time.Minute)
          if err == nil && imageCoordinates.MatchScore > 0.5 {
             targetX, targetY := imageCoordinates.RandomX, imageCoordinates.RandomY
             itemPage.SimulateMouseMoveOnPage(luna_utils.RandomInRange(-1, devtools.BrowserGlobal.ScreenAvailWidth), -1, targetX, targetY)
             itemPage.SimulateMouseClickOnPage(targetX, targetY)
             itemPage.SimulateKeyboardInputOnPage("随便")

             //点击按钮
             err, imageCoordinates := itemPage.ImageSimilarity("button_01.png", time.Minute)
             if err == nil && imageCoordinates.MatchScore > 0.5 {
                itemPage.SimulateMouseMoveOnPage(targetX, targetY, imageCoordinates.RandomX, imageCoordinates.RandomY)
                itemPage.SimulateMouseClickOnPage(imageCoordinates.RandomX, imageCoordinates.RandomY)
             }
             time.Sleep(5 * time.Second)
             //滚动到页面底部
             fmt.Println("~~~~~~~~~~>==============<~~~~~~~~~~~~~~")
             err, ok := itemPage.ScrollToTargetImagePosition(imageCoordinates.RandomX, imageCoordinates.RandomY, input.DOWN, "bottom.png", 0.5, time.Minute)
             fmt.Println(ok, err)

             itemPage.Close()
             browserObj.Close()
          }

       }
       fmt.Println("~~~~~~~~~~>==============<~~~~~~~~~~~~~~")
    } else {
       fmt.Println(err, "错误了")
    }
    /********************************/
    time.Sleep(1 * time.Minute)
}

而且可以模拟大部分重要指纹信息、这对于反爬虫、和过盾、是相对比较完美的方案。而且他基于视觉、速度非常快,无需等待事件触发。文章来源地址https://www.toymoban.com/news/detail-753730.html

package test_case

import (
    "fmt"
    "github.com/musiclover789/luna/devtools"
    "github.com/musiclover789/luna/luna_utils"
    "testing"
    "time"
)

//Found several packages [main, time] in '/usr/local/go/src/time;/usr/local/go/src/time'
/***
这个例子是一个入门例子,其目的是希望你可以通过这个例子,成功的打开浏览器、并且成功的访问一个网址仅此而已.
//测试我们是否被发觉出来的https://undetectable.io/zh-cn/blog/post/browser-fingerprinting-test-services
https://uutool.cn/browser/
*/

// 如果对这种写法不熟悉,可以直接用main函数替代,也就是把里面的代码全部粘贴到main函数里面是一样的.
func TestFingerprint(t *testing.T) {
    //代码开始

    //第一步
    //杀死之前你可能测试过的chromium进程;
    //启动前先杀死其他的chromium进程;为了防止程序以及停止但是依然在内存中贮存;
    //其目的是为了反复测试的时候不会产生过多的内存驻留进程、实际使用时候请根据实际情况选择使用;
    //他会根据你的系统不同,使用命令行的命令进行杀死其他chromium进程
    luna_utils.KillProcess()

    //第二步
    //设置自己需要的指纹
    args := []string{
       /***
       a、luna_user_agent 这个参数目前仅会使得 navigator.userAgent 的值发生变化;也就是说http、http2、等协议层 仍然不会被替换;如果需要替换往下看。
       b、headless 模式下、navigator.userAgent 也是会被替换;并不会显示任何headless 的userAgent;
       */
       "--luna_user_agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
       /***
       a、navigator.platform 值被替换
       */
       "--luna_platform=win64",
       /***
       a、timeZone 经过测试、时区均会被替换成指定的时区
       b、timeZone 的时区偏移量也是自动计算的
       c、测试js :
             const date = new Date();
             const timeZone = date.getTimezoneOffset();
             const timeZoneOffset = -timeZone / 60;
             console.log("Time Zone: " + Intl.DateTimeFormat().resolvedOptions().timeZone);
             console.log("Time Zone Offset: " + timeZoneOffset);
       */
       "--luna_timezone=Europe/London",
       /***
       languages: 以下均会生效
       a、navigator.language
       b、new Intl.DateTimeFormat().resolvedOptions().locale
       说明:理论上、无论是国际API、还是navigator 均生效。

       */
       "--luna_languages=en-GB",
       /***
          navigator.userAgentData:
          值示例:Google Chrome:92-luna-Chromium:92-luna-Not-A.Brand:24-luna-platform:win32-luna-mobile:false-luna-platform_version:6.1-luna-ua_full_version:92.0.4515.186-luna-model:PC-luna-architecture:x86_64
          格式、-luna- 为每组的分隔符
             : 为key、value分隔符
          举例说明:
             1:Google Chrome:92-luna-Chromium:92 分别为2组 Google Chrome:92 和 Chromium:92
             每组的值key、value分别是: 组1 key 是 Google Chrome value是 92 ,组2 Chromium:92 key是Chromium value是 92
             2:他们分别代表什么呢?代表执行"navigator.userAgentData" 后的、brands的值;你自己浏览器测试以下就知道了。
             3:以下几个分别是特别值、分别代表执行"navigator.userAgentData" 后参数值
                 mobile:false //是否是手机
                 ua_full_version:92.0.4515.186 //浏览器版本
               model:PC //设备的型号信息
                 architecture:x86_64 //芯片类型、比如 arm
             注:这4个特殊值反而要特别注意、因为你可能看不到他的具体值、但是第三方的指纹测试是可以看到他的值的
               如:https://abrahamjuliot.github.io/creepjs/ 测试,你可以看以下
       */
       "--luna_userAgentData=Google Chrome:92-luna-Chromium:92-luna-Not-A.Brand:24-luna-platform:win32-luna-mobile:false-luna-platform_version:6.1-luna-ua_full_version:92.0.4515.186-luna-model:PC-luna-architecture:x86_64",
       /***
          luna_header_1:这个是为了替换http请求时候的数据包里面的header参数的;
          key 格式:--luna_header_1
             --luna_header_2
             ...
             --luna_header_11
             取值范围[1-11]
             也就是说,你最多可以替换11个、为什么这么设计呢?因为太多了影响效率;个人感觉1-11够用了
          value 格式:
                key -lunareplace- value //代表将左侧匹配到的key、替换成右侧的value
                key -lunaremove- value //代表将左侧匹配到的key、删除这个header参数项
                key --lunaadd-- value //增加这个key、value header项
             注意格式中没有空格,这里只是方便看、正常应该是:key-lunareplace-value
          使用场景:
             1、为了配合navigator.userAgent变化而协议层没有变
             2、为了删除协议层暴露的隐私数据
             3、增加你想增加的请求头数据
       */
       "--luna_header_1=User-Agent-lunareplace-Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
       "--luna_header_2=sec-ch-ua-arch-lunaremove-",
       "--luna_header_3=sec-ch-ua-platform-lunaremove-",
       "--luna_header_4=accept-language-lunareplace-en;q=0.9",
       /***
       deviceMemory 内存
          取值范围建议:[0.25, 0.5, 1, 2, 4, 8]
          表示设备的内存大小,以 GB 为单位。
       对应js的navigator.deviceMemory
       */
       "--luna_deviceMemory=8", //[0.25, 0.5, 1, 2, 4, 8]
       /***
       deviceMemory 内存
          属性是一个数字,表示设备的逻辑处理器核心数。
       对应js的\navigator.hardwareConcurrency
       */
       "--luna_hardwareConcurrency=16",
       /***
       显卡信息: 这些是与 WebGL 相关的属性和扩展名称,用于提供关于 WebGL 上下文和渲染器的信息:
       UNMASKED_VENDOR_WEBGL:表示 WebGL 上下文所使用的图形硬件的供应商。它通常返回一个字符串,表示硬件供应商的名称。
       UNMASKED_RENDERER_WEBGL:表示 WebGL 上下文所使用的图形硬件的渲染器。它通常返回一个字符串,表示图形渲染器的名称。
       GL_VERSION:表示 WebGL 上下文支持的 OpenGL 版本。它通常返回一个字符串,表示支持的 OpenGL 版本号。
       SupportedExtensions:表示 WebGL 上下文支持的扩展列表。它是一个数组,包含了当前 WebGL 上下文支持的各种扩展名称。
       GL_VENDOR:表示 WebGL 上下文所使用的图形硬件供应商的名称。它通常返回一个字符串,表示图形硬件供应商的名称。//默认值:WebKit,意思是我观察到chromium源代码中是写死到这个值,没特殊情况无需修改
       GL_RENDERER:表示 WebGL 上下文所使用的图形渲染器的名称。它通常返回一个字符串,表示图形渲染器的名称。//默认值:WebKit WebGL,意思是我观察到chromium源代码中是写死到这个值,没特殊情况无需修改
       GL_SHADING_LANGUAGE_VERSION:表示 WebGL 上下文支持的着色语言版本。它通常返回一个字符串,表示支持的着色语言版本号。
       对应的js、代码太长了我就不写了你可以观察下面的代码 runtime.Evaluate(conn, luna_script.TestWebDriver()) 里面基本上都测试了。
       */
       "--luna_UNMASKED_VENDOR_WEBGL=Intel Corporation",           //Google Inc. (Apple)
       "--luna_UNMASKED_RENDERER_WEBGL=Intel(R) UHD Graphics 620", //ANGLE (Apple, Apple M1 Pro, OpenGL 4.2)
       "--luna_GL_VERSION=WebGL 1.0 (OpenGL ES 3.0 Intel(R) UHD Graphics 620)",
       `--luna_GL_SupportedExtensions=["ANGLE_instanced_arrays", "EXT_blend_minmax", "EXT_color_buffer_half_float", "EXT_disjoint_timer_query", "EXT_float_blend", "EXT_frag_depth", "EXT_shader_texture_lod", "EXT_texture_compression_rgtc", "EXT_texture_filter_anisotropic", "WEBKIT_EXT_texture_filter_anisotropic", "EXT_sRGB", "KHR_parallel_shader_compile", "OES_element_index_uint", "OES_fbo_render_mipmap", "OES_standard_derivatives", "OES_texture_float", "OES_texture_float_linear", "OES_texture_half_float", "OES_texture_half_float_linear", "OES_vertex_array_object", "WEBGL_color_buffer_float", "WEBGL_compressed_texture_s3tc", "WEBKIT_WEBGL_compressed_texture_s3tc", "WEBGL_compressed_texture_s3tc_srgb", "WEBGL_debug_renderer_info", "WEBGL_debug_shaders", "WEBGL_depth_texture", "WEBKIT_WEBGL_depth_texture", "WEBGL_draw_buffers", "WEBGL_lose_context", "WEBKIT_WEBGL_lose_context", "WEBGL_multi_draw"]`,
       "--luna_GL_VENDOR=WebKit",         //默认值 WebKit
       "--luna_GL_RENDERER=WebKit WebGL", //默认值WebKit WebGL
       "--luna_GL_SHADING_LANGUAGE_VERSION=WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)", //测试值 WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)
       /***
          cavans指纹:
             区别:
                luna_cavans_random_str
                luna_cavans_random_int
             a:首先这两个你只可以2选1,不能同时写,因为同时写基本上等同于只设置了luna_cavans_random_str、从而让luna_cavans_random_int变得时区作用了
             b:luna_cavans_random_str他只是在toDataURl的时候加入了随机字符串;这个字符串你需要自己传入,至于值 只要是字符串 剩下随便。
                 这有什么用呢?
                   这样会使得整个浏览器、无论是标签页、窗口、隐藏窗口探测cavans指纹时、均报纸一致;
                   而且你已经传入了随机字符串、所以他的指纹就变得随机了
                    这样的缺点是、因为是随机了结果值、导致很假,但是假的范围大。
             c:luna_cavans_random_int 
                这样有什么用呢?
                1、优点是比较真实、并不会影响任何结果
                2、缺点是你的取值范围只有[0-9]指纹数量有限、chromium源代码每个版本默认值可能会不太一样.我测试的版本是默认值是:3、我也观察到有些版本默认是4
       */
       //"--luna_cavans_random_str=B3B4",
       "--luna_cavans_random_int=1", //取值0-9 默认值3

       /***
          screen: 对象是一个表示用户屏幕信息的全局对象。下面是对 screen 对象中常见属性的解释:
             height:表示屏幕的总高度(以像素为单位)。
             width:表示屏幕的总宽度(以像素为单位)。
             availHeight:表示可用的屏幕高度,即减去操作系统任务栏或其他系统UI的高度后剩余的屏幕高度。
             availWidth:表示可用的屏幕宽度,即减去操作系统任务栏或其他系统UI的宽度后剩余的屏幕宽度。
             availLeft:表示可用屏幕的左边界相对于整个屏幕的左边界的偏移量。在多显示器设置中,这个属性可以用来确定屏幕的位置。
             availTop:表示可用屏幕的顶部边界相对于整个屏幕的顶部边界的偏移量。在多显示器设置中,这个属性可以用来确定屏幕的位置。
             internal:表示屏幕是否是内部显示器。如果屏幕是内部显示器,则返回 true,否则返回 false。//我个人理解、如果如果你是笔记本电脑买来就自带屏幕就是true、如果主机自己接入的外置显示器就是false
             primary:表示屏幕是否是主要显示器。如果屏幕是主要显示器,则返回 true,否则返回 false。
             top:表示屏幕的顶部边界相对于整个屏幕的顶部边界的偏移量。在多显示器设置中,这个属性可以用来确定屏幕的位置。
             left:表示屏幕的左边界相对于整个屏幕的左边界的偏移量。在多显示器设置中,这个属性可以用来确定屏幕的位置。
             scaleFactor:表示屏幕的缩放因子。如果操作系统设置了缩放级别,则返回缩放因子;否则,返回 1。
          //总之 如果没有必要、这个值我建议不要轻易修改、因为我这个框架是基于视觉的、如果你使用视觉点击、可能会受到影响。
             还有这个参数的意义也并不大。
          格式:
             举例:height:800,width:978
             逗号","分隔每组
             冒号":"分隔key、value
             如果你不傻、应该可以看懂,我就不仔细说了。
       */
       //"--luna_screen=height:800,width:978,availHeight:1024,availWidth:934,availLeft:0,availTop:28,internal=true,primary=true,top:34,left:34,scaleFactor=2",
       //"--luna_screen=height:1440,width:2560,availHeight:1440,availWidth:2560,availLeft:0,availTop:0,internal=true,primary=true,scaleFactor=2",
       "--luna_key=WERWER234234WERWEr345345",
       /***
          最后:
             1、这些均是常见的硬件信息、但是并不能代表所有、比如声卡、比如字体、比如每个版本的css特性、比如 语音合成器等
                 这完全取决于你面对的挑战到底有多大、(but、一般也够用了)
             2、从学术角度、我个人建议、要用真实值
             3、从使用的角度、如果你不许要修改某些指纹、你就不用写他,
                  对于里面的key、value 也是一样、如果你不需要可以不用写,
                  你不写他自己就是默认值,该是什么样就是什么样。
             4、你也不要以为你改了几个参数、他就认不出来你了,真实的情况是,这个是很有技巧的搭配指纹组,而且大数据统计的识别方式还是很可怕的,透肉看骨一般的
              并将已经默认做了特征剔除。
       */
    }

    //初始化浏览器对象
    //chromiumPath := "C:\\src\\chromedev\\chromium\\src\\out\\Default/chrome.exe"
    chromiumPath := "/Users/xxxxx/Documents/workspace/golang/Chromium.app/Contents/MacOS/Chromium"
    browserObj := devtools.NewBrowser(chromiumPath, &devtools.BrowserOptions{
       //设置缓存目录,
       CachePath: luna_utils.CreateCacheDirInSubDir("/Users/xxxx/Documents/workspace/golang/cache"),
       //设置你认为需要的指纹信息
       Fingerprint: args,
       //设置非隐身模式
       Headless: false,
    })

    //打开一个tap
    browserObj.OpenPage("https://www.baidu.com")

    fmt.Println("如果你可以成功的运行这个代码,那么恭喜你,已经基本上知道如何设置基本的指纹信息了.至少看起来很专业的样子了")
    time.Sleep(1 * time.Hour)
    //代码结束
}

/*

./Chromium.app/Contents/MacOS/Chromium

设置canvas随机字符串
--luna_cavans_random_str="A3B4"
原理就是把产生的toDataURL拼接个随机字符串


设置user-agent;
--luna_user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/91.0.864.48 Safari/537.36"

设置Platform;
--luna_platform="Win32"
--Linux armv81  MacIntel  Win32 "" Linux x86_64 iPhone Unsupported platform


设置时区;
--luna_timezone=""
   "Pacific/Midway",
   "Pacific/Honolulu",
   "America/Anchorage",
   "America/Los_Angeles",
   "America/Vancouver",
   "America/Tijuana",
   "America/Phoenix",
   "America/Chihuahua",
   "America/Denver",
   "America/Edmonton",
   "America/Mazatlan",
   "America/Regina",
   "America/Costa_Rica",
   "America/Chicago",
   "America/Mexico_City",
   "America/Tegucigalpa",
   "America/Winnipeg",
   "Pacific/Easter",
   "America/Bogota",
   "America/Lima",
   "America/New_York",
   "America/Toronto",
   "America/Caracas",
   "America/Barbados",
   "America/Halifax",
   "America/Manaus",
   "America/Santiago",
   "America/St_Johns",
   "America/Araguaina",
   "America/Argentina/Buenos_Aires",
   "America/Argentina/San_Luis",
   "America/Montevideo",
   "America/Santiago",
   "America/Sao_Paulo",
   "America/Godthab",
   "Atlantic/South_Georgia",
   "Atlantic/Cape_Verde",
   "Atlantic/Azores",
   "Atlantic/Reykjavik",
   "Atlantic/St_Helena",
   "Africa/Casablanca",
   "Atlantic/Faroe",
   "Europe/Dublin",
   "Europe/Lisbon",
   "Europe/London",
   "Europe/Amsterdam",
   "Europe/Belgrade",
   "Europe/Berlin",
   "Europe/Bratislava",
   "Europe/Brussels",
   "Europe/Budapest",
   "Europe/Copenhagen",
   "Europe/Ljubljana",
   "Europe/Madrid",
   "Europe/Malta",
   "Europe/Oslo",
   "Europe/Paris",
   "Europe/Prague",
   "Europe/Rome",
   "Europe/Stockholm",
   "Europe/Sarajevo",
   "Europe/Tirane",
   "Europe/Vaduz",
   "Europe/Vienna",
   "Europe/Warsaw",
   "Europe/Zagreb",
   "Europe/Zurich",
   "Africa/Windhoek",
   "Africa/Lagos",
   "Africa/Brazzaville",
   "Africa/Cairo",
   "Africa/Harare",
   "Africa/Maputo",
   "Africa/Johannesburg",
   "Europe/Kaliningrad",
   "Europe/Athens",
   "Europe/Bucharest",
   "Europe/Chisinau",
   "Europe/Helsinki",
   "Europe/Istanbul",
   "Europe/Kiev",
   "Europe/Riga",
   "Europe/Sofia",
   "Europe/Tallinn",
   "Europe/Vilnius",
   "Asia/Amman",
   "Asia/Beirut",
   "Asia/Jerusalem",
   "Africa/Nairobi",
   "Asia/Baghdad",
   "Asia/Riyadh",
   "Asia/Kuwait",
   "Europe/Minsk",
   "Europe/Moscow",
   "Asia/Tehran",
   "Europe/Samara",
   "Asia/Dubai",
   "Asia/Tbilisi",
   "Indian/Mauritius",
   "Asia/Baku",
   "Asia/Yerevan",
   "Asia/Kabul",
   "Asia/Karachi",
   "Asia/Aqtobe",
   "Asia/Ashgabat",
   "Asia/Oral",
   "Asia/Yekaterinburg",
   "Asia/Calcutta",
   "Asia/Colombo",
   "Asia/Katmandu",
   "Asia/Omsk",
   "Asia/Almaty",
   "Asia/Dhaka",
   "Asia/Novosibirsk",
   "Asia/Rangoon",
   "Asia/Bangkok",
   "Asia/Jakarta",
   "Asia/Krasnoyarsk",
   "Asia/Novokuznetsk",
   "Asia/Ho_Chi_Minh",
   "Asia/Phnom_Penh",
   "Asia/Vientiane",
   "Asia/Shanghai",
   "Asia/Hong_Kong",
   "Asia/Kuala_Lumpur",
   "Asia/Singapore",
   "Asia/Manila",
   "Asia/Taipei",
   "Asia/Ulaanbaatar",
   "Asia/Makassar",
   "Asia/Irkutsk",
   "Asia/Yakutsk",
   "Australia/Perth",
   "Australia/Eucla",
   "Asia/Seoul",
   "Asia/Tokyo",
   "Asia/Jayapura",
   "Asia/Sakhalin",
   "Asia/Vladivostok",
   "Asia/Magadan",
   "Australia/Darwin",
   "Australia/Adelaide",
   "Pacific/Guam",
   "Australia/Brisbane",
   "Australia/Hobart",
   "Australia/Sydney",
   "Asia/Anadyr",
   "Pacific/Port_Moresby",
   "Asia/Kamchatka",
   "Pacific/Fiji",
   "Pacific/Majuro",
   "Pacific/Auckland",
   "Pacific/Tongatapu",
   "Pacific/Apia",
   "Pacific/Kiritimati"

设置语言:
--luna_languages="es-AR en-GB"
已经默认修改了 国际化接口 和 navigator了
en 中文
zh-CN 中国中文
en-CA 加拿大英语
en-US 美国英语
en-GB 英国英语
es-AR 西班牙语阿根廷

设置navigator.userAgentData的js值
格式-luna-是每组的分隔符 : 是key和value的分隔符
--luna_userAgentData=Google Chrome:92-luna-Chromium:92-luna-Not-A.Brand:24-luna-platform:win32-luna-mobile:false-luna-platform_version:92

替换http请求时数据包的header
慎重使用,因为会稍微影响性能
luna_header_1
格式:luna_header_<根数组1-11>也就是最多你可以更改11个header
其中-lunaremove-、-lunareplace-、-lunaadd- 是三种分隔符,分别代表 删除这个header、替换这个header、和增加这个header
"--luna_header_1=User-Agent-lunareplace-Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
       "--luna_header_2=sec-ch-ua-arch-lunaremove-",
       "--luna_header_3=sec-ch-ua-platform-lunaremove-",
       "--luna_header_4=accept-language-lunareplace-en;q=0.9",

//无需设置、自动鼠标移动、点击、键盘事件的trusted为true;

内存
--luna_deviceMemory="16"

逻辑核
--luna_hardwareConcurrency="10"



*/

到了这里,关于爬虫框架 Selenium Pyppeteer Playwright Luna对比的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 爬虫问题1:pyppeteer/request/Selenium 您的连接不是私密连接的网站

    在爬虫过程中,自动测试时候遇到 您的连接不是私密连接的网站 这样的问题。 requests : verify参数设置为False selenium : 添加参数:--ignore-certificate-errors pyppeteer: 添加参数:--ignore-certificate-errors 具体使用方式如下: 其他方法: (1) --ignore-certificate-errors --ignore-urlfetcher-cert-requests

    2024年02月09日
    浏览(56)
  • Playwright vs Selenium:最好用的自动化测试框架?

    目录 引言 文心一言:Playwright 极简教程 ChatGPT : Playwright极简教程 Playwright 特性说明 安装 编写测试 运行测试 固定装置(Fixtures) 总结 很长时间以来,Selenium是QA工程师寻求测试自动化解决方案的首选测试框架。它能够测试任何浏览器(这在IE浏览器的统治时期尤其重要)和任

    2023年04月17日
    浏览(40)
  • 几个Web自动化测试框架的比较:Cypress、Selenium和Playwright

    介绍: Web自动化测试框架对于确保Web应用程序的质量和可靠性至关重要。它们帮助开发人员和测试人员自动执行重复性任务,跨多个浏览器和平台执行测试,并在开发早期发现问题。 本文探讨来3种流行的Web自动化测试框架——Cypress、Selenium和Playwright,总结了它们的优点和缺

    2024年02月11日
    浏览(40)
  • 爬虫框架有Scrapy、BeautifulSoup、Selenium

    爬虫框架有Scrapy、BeautifulSoup、Selenium BeautifulSoup比Scrapy相对容易学习。 Scrapy的扩展,支持和社区比BeautifulSoup更大。 Scrapy应被视为蜘蛛,而BeautifulSoup则是Parser。 1.爬虫基础知识 在开始Python爬虫之前,需要先掌握一些基础知识。首先了解一下HTTP协议,掌握常见的请求方法和状

    2024年02月07日
    浏览(42)
  • 网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

    Selenium是一个模拟浏览器浏览网页的工具,主要用于测试网站的自动化测试工具。 Selenium需要安装浏览器驱动,才能调用浏览器进行自动爬取或自动化测试,常见的包括Chrome、Firefox、IE、PhantomJS等浏览器。 注意:驱动下载解压后,置于Python的安装目录下;然后将Python的安装目

    2024年01月18日
    浏览(60)
  • 使用Scrapy框架集成Selenium实现高效爬虫

    在网络爬虫的开发中,有时候我们需要处理一些JavaScript动态生成的内容或进行一些复杂的操作,这时候传统的基于请求和响应的爬虫框架就显得力不从心了。为了解决这个问题,我们可以使用Scrapy框架集成Selenium来实现高效的爬虫。 Scrapy是一个使用Python编写的开源网络爬虫框

    2024年02月09日
    浏览(43)
  • python爬虫框架selenium安装和使用教程

    – Selenium是一个常用的Python爬虫框架,可以模拟浏览器行为,实现一些自动化的操作。本教程将介绍Selenium的基础知识、使用方法,包括导入包、安装、示例、数据保存等方面。 在开始之前,我们需要先导入Selenium相关的包。这里我们用Python3作为演示,所以需要安装对应版本

    2024年02月02日
    浏览(38)
  • selenium爬虫框架爬取某壁纸网站

    基础知识 环境配置 开始爬虫 简单分析目标网站 写函数 获取浏览器对象: 下载每一张图片: 获取每一页的源代码: 运行print_result_every_page python基础语法 面向对象基础 html基础 xpath基础 selenium框架的基本使用 request库 lxml库      3.安装浏览器xpath插件         打开谷歌浏览

    2024年02月05日
    浏览(41)
  • Scrapy爬虫框架集成Selenium来解析动态网页

    当前网站普遍采用了javascript 动态页面,特别是vue与react的普及,使用scrapy框架定位动态网页元素十分困难,而selenium是最流行的浏览器自动化工具,可以模拟浏览器来操作网页,解析元素,执行动作,可以处理动态网页,使用selenium处理1个大型网站,速度很慢,而且非常耗资

    2024年02月15日
    浏览(51)
  • 如何用selenium或pyppeteer来启动多个AdsPower窗口

    前言 本文是该专栏的第57篇,后面会持续分享python爬虫干货知识,记得关注。 关于selenium或pyppeteer来启动打开adspower浏览器的方法,笔者在本专栏前面有详细介绍过,感兴趣的同学可往前翻阅《如何用selenium或pyppeteer来链接并打开指纹浏览器AdsPower》,文章内容包含完整代码与

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包