博客
关于我
基于selenium的分布式爬虫-微浏览器
阅读量:371 次
发布时间:2019-03-05

本文共 2985 字,大约阅读时间需要 9 分钟。

使用Docker搭建分布式Selenium 测试环境

背景

在传统的数据抓取场景中,当无法正常使用接口请求数据时,开发者通常会考虑使用浏览器进行抓取。这种方法虽然可行,但随着项目复杂度的增加,逐一使用浏览器操作变得难以管理。因此,使用自动化测试工具Selenium来处理复杂的网页抓取任务成为了一种更为高效的解决方案。

正常流程

在Windows环境下,使用Selenium工具可以通过定位标签来实现自动化操作。开发者可以在本地环境下完成初步代码测试,并通过Selenium提供的功能执行相应的浏览器操作。整个测试过程是可见的,便于调试和优化。

存在的挑战

随着项目规模的扩大,如何将已经开发好的代码部署到Linux系统中并进行长期运行成为了一个重要课题。此外,Windows环境下开发的代码在Linux系统上是否还能正常运行也是一个需要解决的问题。

  • 代码部署问题:在Linux环境下长期运行代码需要考虑系统资源的稳定性和安全性,同时还需解决分布式处理问题,这在大数据场景下尤为重要。

  • 代码兼容性问题:Windows下开发的代码在Linux系统上运行并不一定能够正常执行,尤其是在处理复杂的网页时可能会遇到问题。由于Linux环境下常用的浏览器(如Phantomjs)存在诸多限制,无法处理复杂的登录框架或多媒体渲染,导致部分功能无法实现。

  • 解决方案

    为了克服上述问题,使用Docker技术来实现Selenium浏览器的虚拟化部署成为了一种理想的解决方案。Docker提供了灵活的环境配置能力,使得我们能够在Linux系统上轻松运行多种浏览器(如Firefox、Chrome等),并支持分布式操作。

    Docker selenium 测试环境的优势

    • 跨平台支持:Docker容器能够在任何支持Linux的系统上运行,无需关心浏览器是有界面还是无界面的问题。
    • 远程控制能力:通过Docker镜像,可以方便地管理多个浏览器实例,并通过远程协议进行操作。
    • 分布式测试:Docker的容器化技术使得分布式测试变得简单,适合处理大规模的数据抓取任务。

    使用样例

    以下是一个使用Docker搭建Selenium 测试环境的示例步骤:

  • 拉取官方镜像

    使用命令拉取Selenium的相关镜像:

    docker pull selenium/standalone-chromedocker pull selenium/hubdocker pull selenium/node-firefox
  • 运行浏览器容器

    启动浏览器容器:

    docker run -d -p 4444:4444 selenium/standalone-chromedocker run -d --link selenium_hub:hub selenium/node-firefox
  • 编写测试脚本

    通过Python脚本与Docker镜像建立连接:

    from selenium import webdriverfrom selenium.webdriver.common.desired_capabilities import DesiredCapabilitiesdef test():    driver = webdriver.Remote(        command_executor="http://127.0.0.1:4444/wd/hub",        desired_capabilities=DesiredCapabilities.CHROME    )    driver.get("http://www.baidu.com")    print(driver.title)    driver.close()if __name__ == '__main__':    import multiprocessing    pool = multiprocessing.Pool(10)    for _ in range(100):        pool.apply_async(test)    pool.close()    pool.join()
  • 运行结果

    运行脚本后,控制台会显示百度首页标题信息,表明抓取任务已成功完成。

  • 如何搭建分布式测试环境

    为了实现分布式测试,我们需要使用Selenium Grid的hub和node镜像。hub作为总控节点负责管理各个浏览器实例,而node则是执行任务的工作节点。

    搭建步骤

  • 拉取镜像

    使用命令拉取必要的镜像:

    docker pull selenium/hubdocker pull selenium/node-chromedocker pull selenium/node-firefox
  • 启动总控节点

    启动Selenium hub容器:

    docker run -p 5555:4444 -d --name selenium_hub selenium/hub
  • 启动浏览器节点

    启动对应浏览器的节点:

    docker run -P -d --link selenium_hub:hub selenium/node-firefox
  • 验证节点注册

    在浏览器中输入http://localhost:5555/wd/hub,可以看到注册成功的火狐节点信息。

  • 测试用例

    编写一个分布式测试脚本:

    from selenium import webdriverfrom selenium.webdriver.remote import Remote# 配置DesiredCapabilitiesfirefox_capabilities = {    "browserName": "firefox",    "version": "50.0",    "platform": "ANY",    "javascriptEnabled": True,    "marionette": True}# 连接到远程的Selenium Hubbrowser = Remote(    "http://192.168.99.100:5555/wd/hub",    desired_capabilities=firefox_capabilities)# 访问百度首页browser.get("http://www.baidu.com")print(browser.title)# 关闭浏览器browser.close()

    运行中的问题

    在实际运行中,可能会遇到以下问题:

    • 阻塞状态:当使用多进程池执行任务时,主进程可能会被阻塞,无法获得hub的远程执行信息。
    • 性能优化:分布式测试通常需要处理大量的请求,对系统资源有一定的压力。

    另外一个思路

    为了简化分布式部署,可以在每个请求中动态分配浏览器实例。这种方式既节省资源,又避免了复杂的分布式管理。

    使用k8s搭建分布式浏览器

    对于更复杂的分布式需求,可以考虑使用容器编排工具Kubernetes(简称k8s)。通过k8s,可以轻松部署和管理多个浏览器实例,实现真正的分布式测试环境。

    通过以上方法,我们可以在Linux系统中轻松构建高效的Selenium 测试环境,解决跨平台的兼容性问题,并实现大规模的分布式数据抓取任务。

    转载地址:http://atywz.baihongyu.com/

    你可能感兴趣的文章
    对PostgreSQL数据库结构的宏观理解
    查看>>
    Postgresql 日期和时间类型
    查看>>
    xmin、xmax、cmin、cmax
    查看>>
    《卸甲笔记》-PostgreSQL和Oracle的数据类型的对比系列五:其它类型
    查看>>
    查询某表格上次进行vacuum的时间
    查看>>
    Failed to execute vcredist_x64.exe
    查看>>
    invalid byte sequence for encoding
    查看>>
    Centos7.0系统上使用yum安装相关包时出现KeyboardInterrupt错误
    查看>>
    Highgo Database故障收集脚本
    查看>>
    PostgreSQL中的隐式连接和显式连接
    查看>>
    failed to initialize the database
    查看>>
    Failed to execute vcredist_x64.exe
    查看>>
    invalid byte sequence for encoding
    查看>>
    银河麒麟系统配置apt网络源
    查看>>
    unity3d-学习笔记13-卡牌游戏制作(部分功能的优化)
    查看>>
    最小生成树——Kruskal
    查看>>
    Linux内核结构粗解及关于 shell 通俗理解
    查看>>
    第七周 4.12-4.18
    查看>>
    程序设计入门14 结构体
    查看>>
    程序设计基础75 tips 广度搜索细节问题
    查看>>