使用Selenium/Puppeter优化高速浏览器交互

2024-05-19 03:06:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望创建一个脚本,可以与任何网页互动,尽可能少的延迟,除了网络延迟。这将用于套利交易,因此欢迎在这方面提供任何提示

我目前的方法是将Selenium与Python结合使用,因为我是web抓取的初学者。然而,我调查了一些方法,从我的发现来看,硒似乎有相当大的延迟(见下面的基准测试结果)我在这个问题中提到了除此之外的其他事情,但重点是硒

一般来说,我需要向目前与我合作的任何经纪人发送买入或卖出请求。通过使用web浏览器客户端,我找到了几种方法:

1. Actually clicking the button  
    a. Use Selenium to Click the button with the corresponding request      
    b. Use Puppeteer to Click  
    c. Use Pynput or other direct mouse input manipulation

2. Reverse-engineering the request and sending it directly without clicking any buttons

现在,需要尽可能减少发送此请求的延迟。网络延迟超出了我们对优化的控制范围。 我已经用标准的方式打开了一个页面,用木偶和selenium打开一个页面,然后等待几秒钟,以此作为1.方法的基准。脚本等待时,我向浏览器中注入了以下代码:
$x('//*[@id="id_demo_webfront"]/iframe')[0].contentDocument.body.addEventListener('click', (data => console.log(new Date().getTime())), true);
此代码的目的是在浏览器注册单击的当前时间登录console。 然后,在发出单击之前,我在当前时间登录我的python(Selenium, pynput)/javascript(Puppeteer脚本。我运行的是Ubunutu 18.04而不是Windows,因此我的系统时钟应该具有良好的分辨率。关于这个herehere的附加阅读

实际结果是,所有这些都在同一网页上运行了多次,每次运行大约10次点击:
1. a. ~80ms
1. b. ~10-30ms
1. c. ~5-10ms

对于2.,我还没有可靠地测试延迟。这种方法背后的思想是注入一个函数,该函数在被激发时将发送一个与单击按钮时发送的请求完全相似的请求。我还没有测试发出命令来运行这样一个注入函数和它实际运行之间的延迟,但是我希望这种方法会更快,基本上创建我自己的客户机,与代理在后端拥有的任何API进行交互

从结果来看,很明显,发出鼠标命令似乎是最快的,但对我来说也是最难可靠实现的。另外,我似乎发现《木偶演员》在所有方面都运行得更快,但为了便于开发,我更喜欢python中的selenium,我想知道是否有任何技巧和想法可以加快我所经历的延迟

总结:

为什么使用Python的Selenium在发出命令时会有如此大的延迟,并且可以改进吗?
为什么木偶演员在与同一个浏览器交互时,延迟似乎较低

我的方法的一些代码片段:

class DMMPageInterface:

    # These are part of the interface script, self.page is the webpage after initialization
    def __init__(self, config):
        self.bid_price = self.page.get_element('xpath goes here')
        ...

    # Mostly only the speed of this operation matters, sending the trade request
    def bid_click(self):
        logger.debug("Clicking bid")
        if USE_MOUSE:
            mouse.position = (720,390)
            mouse.click(Button.left, 1)
        else:
            self.bid_price.click()

Tags: the方法函数代码self脚本hereuse
1条回答
网友
1楼 · 发布于 2024-05-19 03:06:10

有很多问题

“为什么使用Python的Selenium会延迟发出命令”

我没有任何直接的可参考的证据,但是selenium的延迟可能取决于它需要做的工作量。它是为测试而创建的,不是为了性能。不同之处在于,测试最有价值的部分是必须可靠地运行,如果测试速度较慢,并且要进行更多的检查,以使其更可靠。与手动测试相比,您仍然可以获得巨大的性能提升,而这正是我们正在取代的

这就是你需要可靠性的地方——我看到你在你的问题中也提到了这种需要。如果您有一个可以在<;中完成操作的交易脚本,那就太好了;1s-但如果5%的时间失败怎么办?这会造成多少问题

然后,Selenium还需要呈现GUI,这取决于您识别对象的方式,它需要扫描整个DOM以获得所需的内容。一般定位器在逻辑上需要更长的时间

Selenium更强大的功能是简单性和提供的同步功能。关于webdriverwait(这对于页内脚本同步非常有用)的许多SO文章中都有很多讨论,但是对于页面加载等待时间也有很好的认识。i、 e.在加载所有源之前按下按钮没有意义

“为什么木偶演员在与同一个浏览器交互时似乎延迟较低?”Puppeteer works with chrome devtools-selenium使用DOM。因此,两者以不同的方式相互作用。显然,Puppeter仅适用于chrome,但selenium几乎可以应用于任何浏览器。如果您不关心跨浏览器功能,这对您来说可能不是问题

然而,它真的快了多少

在执行计时中,您可能还希望将您的目标纳入整个生命周期中,即包括:浏览器加载时间和页面呈现时间。根据你的故事,你想买或卖东西。因此,您开始编写脚本-从按下GO键到最终结果需要多长时间。你们很可能需要同步,而这正是木偶演员可能不够强壮的地方(或者需要你们更长的时间来掌握)

你说你想“以尽可能少的延迟与任何网页交互”,但你必须首先进入该网页并使其处于正确的状态。我不关心每个动作的毫秒数。踢开chrome本身并不是最快的动作,您的总毫秒测试变得>;几秒钟到几分钟

当您有一个完整的selenium脚本需要65秒,而一个木偶演员脚本需要64秒时,总体考虑会发生变化:-)

如果您确实需要速度,请考虑其他一些选项:

  • 尝试运行selenium headless-无gui,资源更少,运行更快。(谷歌it):-)
  • 尝试其他浏览器
  • 如果你只关心速度,那就完全放弃GUICreate an API script或开始研究性能脚本的使用(例如jmeter或loadrunner)
  • 另一个不是硒或木偶演员的选择是javascript directly in the browser
  • 使用其他免费web工具(如cypressMicrosoft's playwright)进行速度测试-它们直接与浏览器中的JS交互,并吹嘘一些优秀的内置稳定性特性

如果是我,它是关于一个性能操作的——我的第一个调用端口将在API级别执行它。有大量的资源和实践网站可以帮助您开始,而且没有浏览器可供渲染,除了网络延迟之外几乎没有其他东西。这才是将其保持为亚秒脚本的真正方法

最后一个想法是,当你问“是否可以改进它””:如果你有一些代码,可能还有其他方法可以让它更快。到目前为止,请分享您的脚本,我相信大家都会很乐意为如何简化脚本投入2美分:-)

相关问题 更多 >

    热门问题