首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化与Selenium/Puppeteer的高速浏览器交互

优化与Selenium/Puppeteer的高速浏览器交互
EN

Stack Overflow用户
提问于 2020-08-05 08:36:31
回答 1查看 516关注 0票数 1

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

我目前的方法是在Python中使用Selenium,因为我是web抓取的初学者。但是,我已经研究了一些方法,根据我的发现,Selenium似乎有一个相当延迟的(参见下面的基准结果)--我在这个问题中除了提到它之外,还提到了其他事情,但重点是Selenium。

一般来说,我需要发送一个买卖请求给任何我目前正在工作的经纪人。通过使用web浏览器客户端,我找到了几种方法来做到这一点:

代码语言:javascript
复制
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

现在,发送此请求的延迟需要尽可能减少。为了达到优化的目的,网络延迟是我们无法控制的。我已经对1.的方法进行了基准测试,以标准的方式打开页面,要么用木偶师,要么用selenium,然后等待几秒钟。当脚本等待时,我在浏览器中注入了以下代码:

$x('//*[@id="id_demo_webfront"]/iframe')[0].contentDocument.body.addEventListener('click', (data => console.log(new Date().getTime())), true);

此代码的目的是在浏览器注册单击的当前时间登录控制台。然后,在发出单击之前,我在当前时间登录我的python(**Selenium, pynput**)/javascript(**Puppeteer**)脚本。我在Ubunut18.04上运行,而不是Windows,所以我的系统时钟应该有很好的分辨率。关于这个这里这里的更多阅读。

实际结果是,所有操作都在同一网页上多次运行,每次运行大约点击10次:

1. a. ~80ms

1. b. ~10-30ms

1. c. ~5-10ms

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

从结果来看,很明显,发出鼠标命令似乎是最快的,但它也是我最难可靠地实现的。此外,我似乎发现傀儡手的运行速度更快,但为了便于开发,我更喜欢python中的selenium,我想知道是否有什么建议和想法来加速我正在经历的那些延迟。

摘要:

为什么会有这样一个延迟来发出命令,并且可以改进它呢?

为什么在与同一个浏览器交互时,Puppeteer的延迟似乎更低?

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

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-05 10:39:37

问了不少问题!

“为什么Selenium会延迟发出命令”

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

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

Selenium还需要呈现GUI,这取决于您如何识别对象,它需要扫描整个DOM以确定您想要的内容。通用定位器在逻辑上将花费更长的时间。

硒更大的力量在于简单性和提供的能力同步。很多关于webdriverwait (这对于页面内脚本同步很好)的文章中有很多讨论,但是页面加载等待时间也有很好的识别能力。也就是说,在加载所有源之前,没有点按按钮。

“为什么在与同一个浏览器交互时Puppeteer的延迟似乎更低?” 木偶技师与铬手套一起工作 - selenium与DOM一起工作。所以两者以不同的方式相互作用。显然,傀儡游戏只适用于铬,但selenium几乎可以访问任何浏览器。如果您不关心跨浏览器功能,这对您来说可能不是一个问题。

然而-它到底有多快?

在您的执行时间中,您还可能希望在整个生命周期中考虑到您所要做的事情--即包括:浏览器加载时间和页面呈现时间。从你的故事来看,你想买或卖些东西。因此,您启动脚本-从按住GO到最终结果需要多长时间。你很可能需要同步,在那里木偶师可能不那么强壮(或者你需要更长的时间来处理)。

你说你想“以尽可能少的延迟与任何网页互动”,但你必须先到达页面,并使它处于正确的状态。我不会担心每一个动作的毫秒。踢开铬本身并不是最快的动作,你的整个毫秒测试就会变成>秒到分钟。

当完整selenium脚本花费65秒,木偶师脚本花费64秒时,总的考虑因素会发生变化:-)

如果您真的需要速度,还需要考虑其他一些选项:

  • 尝试运行硒无头-没有gui,更少的资源,运行更快。(google it) :-)
  • 尝试其他浏览器
  • 如果你对速度感兴趣,那么就完全放弃GUI吧。创建API脚本或开始研究性能脚本的使用(例如for或loadrunner)。
  • 另一种不是硒或傀儡的选择是直接在浏览器中使用javascript
  • 尝试使用其他免费的web工具(如柏树微软剧作家 )进行速度测试--它们在浏览器中直接与JS交互,并吹嘘一些优秀的内置稳定性特性。

如果是我的话,那是关于一个单一的执行动作--我的第一个调用端口将在API级别上这样做。有很多资源和实践网站可以帮助你开始工作,而且没有浏览器可供渲染,除了网络延迟什么都没有。这才是让它成为亚秒级脚本的真正方法。

最后,当您问“可以改进”时:如果您有一些代码,可能还有其他方法使它更快。到目前为止,分享您的脚本,我相信大家都会喜欢在如何精简它上花2美分:-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63261362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档