如何在并行处理期间重用硒驱动程序实例?

2024-01-07

为了抓取 URL 池,我使用 joblib 并行处理 selenium。在此背景下,我面临两个挑战:

  • 挑战 1 是加快这一进程。目前,我的代码为每个 URL 打开和关闭一个驱动程序实例(理想情况下每个进程都有一个驱动程序实例)
  • 挑战 2 是摆脱我认为需要的 CPU 密集型 while 循环continue空结果(我知道这很可能是错误的)

伪代码:

URL_list = [URL1, URL2, URL3, ..., URL100000]                 # List of URLs to be scraped

def scrape(URL):
  while True:                                                 # Loop needed to use continue
          try:                                                # Try scraping
             driver = webdriver.Firefox(executable_path=path) # Set up driver
             website = driver.get(URL)                        # Get URL
             results = do_something(website)                  # Get results from URL content                                                
             driver.close()                                   # Close worker
             if len(results) == 0:                            # If do_something() failed:                                                                  
                continue                                      # THEN Worker to skip URL                          
             else:                                            # If do_something() worked:
                safe_results("results.csv")                   # THEN Save results               
                break                                         # Go to next worker/URL
          except Exception as e:                              # If something weird happens:  
                save_exception(URL, e)                        # THEN Save error message
                break                                         # Go to next worker/URL

Parallel(n_jobs = 40)(delayed(scrape)(URL) for URL in URL_list))) # Run in 40 processes

我的理解是,为了在迭代中重用驱动程序实例,# Set up driver-线需要放在外面scrape(URL)。然而,外面的一切scrape(URL)找不到通往 joblib 的路Parallel(n_jobs = 40)。这意味着您在使用 joblib 进行抓取时无法重用驱动程序实例,但事实并非如此。

Q1:上例中并行处理时如何重用驱动程序实例?

Q2:如何在保持上述示例中的功能的同时摆脱 while 循环?

注意:Flash 和图像加载在firefox_profile(代码未显示)


1)您应该首先创建一堆驱动程序:每个进程一个。并将一个实例传递给工人。我不知道如何将驱动程序传递给 Prallel 对象,但您可以使用threading.current_thread().name识别驱动程序的关键。为此,请使用backend="threading"。所以现在每个线程都有自己的驱动程序。

2)你根本不需要循环。并行对象本身迭代您的所有网址(我希望我真的理解您使用循环的意图)

import threading
from joblib import Parallel, delayed
from selenium import webdriver

def scrape(URL):
    try:
        driver = drivers[threading.current_thread().name]
    except KeyError:
        drivers[threading.current_thread().name] = webdriver.Firefox()
        driver = drivers[threading.current_thread().name]
    driver.get(URL)
    results = do_something(driver)
    if results:
        safe_results("results.csv")

drivers = {}
Parallel(n_jobs=-1, backend="threading")(delayed(scrape)(URL) for URL in URL_list)
for driver in drivers.values():
    driver.quit()

但我真的不认为使用 n_job 比使用 CPU 更能获得利润。所以n_jobs=-1是最好的(当然我可能是错的,试试吧)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在并行处理期间重用硒驱动程序实例? 的相关文章

  • 单元测试 python 代码,其中 configparser 从配置文件中读取

    我是 python 单元测试的新手 我学习并进行了示例单元测试 其中方法接受输入并返回输出 但对于下面提到的代码 我有一些疑问 如何在unittest中模拟init方法的configparser 路径 config program cfg
  • lxml 中的通配符命名空间

    如何使用 xpath 忽略 xml 命名空间进行查询 我正在使用 python lxml 库 我尝试了以下解决方案this https stackoverflow com questions 13463871 xpath selecting
  • Python - 重写 print()

    我正在使用 mod wsgi 想知道是否可以覆盖 print 命令 因为它没用 这样做是行不通的 print myPrintFunction 因为这是一个语法错误 Print 不是 Python 2 x 中的函数 因此这不能直接实现 但是
  • 将 unique_ptr 与 boost python 结合使用 - boost::shared_ptr 有效,但 unique_ptr 无效

    这可能与以下问题相同 Boost Python 没有 to python for std unique ptr https stackoverflow com questions 20590205 boost python no to py
  • 在 matplotlib 中查看然后自动关闭图形?

    我必须检查我的参数设置是否正确 因此我需要绘制许多图 为了绘制这些图 我选择使用 matplotlib 每次检查后 我需要单击左上角的关闭按钮 这很微不足道 那么有没有什么方法可以让剧情在3 5秒左右显示并且无需点击就自动关闭呢 我知道关于
  • 冻结(.exe)一个traitsUI程序,现实可行吗?

    我正在尝试使用 cx freeze 或 pyInstaller 冻结一个 TraitsUI 程序 该程序利用 Chaco Traits TraitsUI 以及较小程度的 mayavi 实际上可以取出 我需要它在 mac linux ubun
  • 使用多索引列对多列求和

    我有一个从数据透视表创建的数据框 看起来类似于 import pandas as pd d company1 False Negative April 2012 112 0 April 2013 370 0 April 2014 499 0
  • 当有效的 django 表单保存在数据库中时如何触发自定义 python 代码

    Django 新手 我创建了一个简单的表单如下this https www youtube com watch v 3XOS UpJirU教程 我的表单正确地将数据保存在我的 Postgres 连接的本地数据库中 我想知道 每当将有效表单保
  • Flask 无法识别两个 URL 参数

    我正在尝试将两个参数发送到使用 Flask 路由的 URL If I do curl i http 127 0 0 1 5000 api journeys count startStationName Hansard 20Mews 20Sh
  • 在pycharm中使用多处理时如何调试

    我正在 pycharm 社区版中使用 anaconda2 调试多进程程序 它有几个后台工作进程 工作进程将检查输入队列以检索任务 而不会休眠 直到收到任务 事实上 我只对主要流程感兴趣 但是pycharm调试器总是单步进入子进程 看起来主进
  • 将 csv 写入谷歌云存储

    我试图了解如何将多行 csv 文件写入谷歌云存储 我只是没有遵循文档 https googlecloudplatform github io google cloud python stable storage blobs html hig
  • Pytest 插件:覆盖 pytest_runtest_call 和朋友

    我正在为我的一个项目使用 pytest 开发一个测试套件 由于项目的性质 我需要创建一个 Pytest 插件来控制测试的运行方式 它们不是在本地运行 而是发送到不同的进程来运行 我知道关于xdist但我认为这并不能解决我的问题 我一直在通过
  • python 中打印变量和字符串

    好吧 我知道如何打印变量和字符串 但是我如何打印类似 我的字符串 card price 的内容 它是我的变量 我的意思是 这是我的代码 print I have and here I would like to print my varia
  • 为什么 Python 的 argparse 对 SystemExit 使用错误代码 2?

    当我给 Python 的 argparse 输入它不喜欢的输入时 它会引发一个代码为 2 的 SystemExit 其中似乎意味着 没有这样的文件或目录 https docs python org 2 library errno html
  • matplotlib 轴标签偏移量的因素和变化

    在 matplotlib 中的轴刻度标签上 有两种可能的偏移量 factors and shifts 在右下角 1e 8 是一个 因子 1 441249698e1 是一个 移位 这里有很多答案展示了如何操纵两个都 matplotlib 将轴
  • 在基于 AngularJS 的 Web 应用程序中使用 Selenium

    我逐渐知道 Selenium 是 UI 测试之父 现在我的问题是为什么 Angular 团队开发了 Protractor 对于基于 AngularJS 的 Web 应用程序 Selenium 不能完成同样的工作 Protractor 所做的
  • 如何按分层类别结构中的值对 pandas 中的数据框进行排序

    我有一个 pandas 数据框 pd DataFrame category Transport Transport Car Transport Train Household Household Utilities Household Ut
  • mpld3图,注释问题

    我正在使用 mpld3 在 Intranet 网站上显示图形 我正在使用将图形保存到字典并使用 mpld3 js 在客户端渲染它的选项 除非我想使用注释 否则该图呈现良好 这些显然是抵消的 我不明白为什么 因为即使我将偏移量设置为 0 0
  • Python二进制数据读取

    urllib2 请求接收二进制响应 如下所示 00 00 00 01 00 04 41 4D 54 44 00 00 00 00 02 41 97 33 33 41 99 5C 29 41 90 3D 71 41 91 D7 0A 47 0
  • 无法比较类型“ndarray(dtype=int64)”和“str”

    Example of data that I want to replace 数据具有以下属性 购买 V 高 高 中 低 维持 V 高 高 中 低 门 2 3 4 5 更多 2 4人以上 lug boot 小 中 大 安全性低 中高 这就是

随机推荐

  • Java 中的“快速”整数幂

    简短回答 糟糕的基准测试方法 你可能认为我现在已经明白了 该问题被表述为 找到一种快速计算x y的方法 其中x和y是正整数 典型的 快速 算法如下所示 public long fastPower int x int y Replaced m
  • 并发修改异常[重复]

    这个问题在这里已经有答案了 我有一小段代码 它给了我并发修改异常 我无法理解为什么我不断收到它 即使我没有看到任何并发修改正在进行 import java util public class SomeClass public static
  • SQL Server 和 Firebase/PouchDB 同步

    我正在构建一个 Web 应用程序 客户端需要在离线状态下通过浏览器访问数据存储 我正在考虑使用 Firebase 或 PouchDB 数据库在应用程序内实现此目的 但是 对于后端 我使用 SQL Server 我可以将 Firebase P
  • HTML 或 CSS 中的“父级”是什么?

    我被介绍到以下代码 div Here is span a span element span which is blue as span elements are set to be div div class extra style co
  • 如何在打字稿中将 array.map 与元组一起使用?

    每当我使用array map对于元组 Typescript 将其推断为通用数组 例如 以下是简单 3x3 数独游戏的一些片段 const a Blank type Blank typeof type Cell number Blank ty
  • 当扩展复杂类型时混合继承吗?

    我的架构中有以下内容
  • 迭代日期范围(scala 方式)

    给定开始日期和结束日期 我想使用 foreach map 或类似函数按天迭代它 就像是 DateTime now to DateTime now 5 day by 1 day foreach println 我在用https github
  • 放置新的零会占用内存吗?

    我有以下代码 struct foo void bar foo d new d foo d 是否表达new d foo d 留下指向的对象d不变 更具体地说 如果类foo并且其中递归包含的所有对象都只有简单的复制构造函数 那么new d fo
  • SQL 条件求和

    我目前有一个大型 SQL 语句 我将以下行添加到其中 以便获取每个交易 ID 的总现金 这是唯一的 select sum cash from Table a where a branch p branch and a transID p t
  • 视频流和 Android

    今天 对于我的一个应用程序 Android 2 1 我想从 URL 流式传输视频 就我探索的 Android SDK 而言 它非常好 我很喜欢almost它的每一个部分 但现在谈到视频流 我有点迷失了 如果您需要有关 Android SDK
  • Java 将 JFrame 附加到正在运行的应用程序窗口?

    如何将右上角的 JFrame 连接到另一个应用程序打开的窗口并在调整大小时保持不变 是否可以 这是我想要完成的任务的图表 谢谢您的帮助 如果这不可能 有其他选择吗 获取窗口大小 位置并相应设置我自己的 jframe 的方法 您要求 Java
  • 在具有不同 x-y 轴的面中绘制多个矩阵

    我从一组在线论坛收集了数据 并想使用 ggplot 和facets 每个论坛一个facet 绘制代表用户 A 回复用户 B 次数的矩阵 这是加载玩具示例的代码 library ggplot2 library dplyr df edges l
  • 互斥量在繁忙时被破坏

    EventHandler类有一个单例对象来接收来自主线程的事件 它将输入注册到向量 并创建一个运行 lambda 函数的线程 该函数在从向量中删除输入之前等待一段时间 以防止在一段时间内重复执行该输入的事件 但我在繁忙错误时遇到互斥体被破坏
  • 使用 MATLAB 进行数字图像处理,使用 3 种技术

    我有 MATLAB 作业 我必须使用 3 种图像处理技术 所以我应该制定一个任务 然后使用 3 种技术来解决它 例如 阈值处理 分割 形态学 恢复 直方图均衡 噪声消除 我需要一些想法以及如何解决它 你能帮助我吗 谢谢 版本中 我在某本书中
  • wsdl 中的“any”是什么以及如何使用 php 调用 wsdl 函数?

    这段代码是我的 wsdl 的一小部分 这里我没看懂
  • Pandas - 计算和旋转以获得前两年的收入

    我有一个如下所示的数据框 df pd DataFrame stud id 101 101 101 101 101 102 102 102 sub code CSE01 CSE01 CSE01 CSE01 CSE02 CSE02 CSE02
  • Ansible 剧本,在提升模式下使用特定(域)用户运行 powershell 脚本的正确语法是什么?

    在离线环境中运行 Ansible 2 4 2 使用 kerberos 进行身份验证 通过 ansible playbook 在提升模式下使用特定 域 用户 DOMAIN someuser 运行 powershell 脚本的正确语法是什么 我
  • 如何使用 HtmlUnit 搜索 YouTube

    我想知道 YouTube 是否可以搜索HtmlUnit http htmlunit sourceforge net 我开始写代码 如下 import java io IOException import java net Malformed
  • 从多次渲染的同一组件收集数据到数组中以发送到服务器

    我有一个创建页面 我要求用户一次又一次地填写相同的表单 次数不限 一旦用户认为他们已完成填写表单 他们可以单击提交按钮和所有数据表单中的内容将被发送到服务器 我尝试在父组件上创建一个方法 并从同一表单组件收集数据并将其发送回父组件 但我无法
  • 如何在并行处理期间重用硒驱动程序实例?

    为了抓取 URL 池 我使用 joblib 并行处理 selenium 在此背景下 我面临两个挑战 挑战 1 是加快这一进程 目前 我的代码为每个 URL 打开和关闭一个驱动程序实例 理想情况下每个进程都有一个驱动程序实例 挑战 2 是摆脱