国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Selenium】提高測(cè)試&爬蟲效率:Selenium與多線程的完美結(jié)合

這篇具有很好參考價(jià)值的文章主要介紹了【Selenium】提高測(cè)試&爬蟲效率:Selenium與多線程的完美結(jié)合。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【Selenium】提高測(cè)試&爬蟲效率:Selenium與多線程的完美結(jié)合

前言

使用Selenium 創(chuàng)建多個(gè)瀏覽器,這在自動(dòng)化操作中非常常見。

而在Python中,使用 Selenium + threading Selenium + ThreadPoolExecutor 都是很好的實(shí)現(xiàn)方法。

應(yīng)用場(chǎng)景:

  • 創(chuàng)建多個(gè)瀏覽器用于測(cè)試或者數(shù)據(jù)采集;
  • 使用Selenium 控制本地安裝的 chrome瀏覽器 去做一些操作

文章提供了 Selenium + threading Selenium + ThreadPoolExecutor 結(jié)合的代碼模板,拿來(lái)即用。



知識(shí)點(diǎn)????

作用 鏈接
threading用于實(shí)現(xiàn)多線程 https://docs.python.org/zh-cn/3/library/threading.html
concurrent.futures.ThreadPoolExecutor 使用線程池來(lái)異步執(zhí)行調(diào)用 https://docs.python.org/zh-cn/3/library/concurrent.futures.html

上面兩個(gè)都是 Python 內(nèi)置模塊,無(wú)需手動(dòng)安裝~


導(dǎo)入模塊

import threading
from concurrent.futures import ThreadPoolExecutor, as_completed



多線程還是線程池?

Selenium中,使用 多線程 或者是 線程池,差別并不大。主要都是網(wǎng)絡(luò)I/O的操作。

在使用 ThreadPoolExecutor 的情況下,任務(wù)將被分配到不同的線程中執(zhí)行,從而提高并發(fā)處理能力。與使用 threading 模塊相比,使用 ThreadPoolExecutor 有以下優(yōu)勢(shì):

  1. 更高的并發(fā)處理能力:線程池 可以動(dòng)態(tài)地調(diào)整線程數(shù)量,以適應(yīng)任務(wù)的數(shù)量和處理要求,從而提高并發(fā)處理能力。
  2. 更好的性能:線程池 可以根據(jù)任務(wù)的類型和大小動(dòng)態(tài)地調(diào)整線程數(shù)量,從而提高性能和效率。

總之,使用 線程池 可以提高并發(fā)處理能力,更易于管理,并且可以提供更好的性能和效率。

但是選擇多線程,效果也不差。

所以使用哪個(gè)都不必糾結(jié),哪個(gè)代碼量更少就選哪個(gè)自然是最好的。


多個(gè)瀏覽器?

Selenium自動(dòng)化中需要多個(gè)瀏覽器,屬于是非常常見的操作了。
不管是用于自動(dòng)化測(cè)試、還是爬蟲數(shù)據(jù)采集,這都是個(gè)可行的方法。

這里示例的代碼中,線程池的運(yùn)行時(shí)候只有 多線程 的一半?。。?/p>

多線程與 多 瀏覽器??

這份代碼的應(yīng)用場(chǎng)景會(huì)廣一些,后續(xù)復(fù)用修改一下 browser_thread 函數(shù)的邏輯就可以了。

這里模擬相對(duì)復(fù)雜的操作,在創(chuàng)建的瀏覽器中新打開一個(gè)標(biāo)簽頁(yè),用于訪問(wèn)指定的網(wǎng)站。
然后切換到新打開的標(biāo)簽頁(yè),進(jìn)行截圖。



代碼釋義:

  • 定義一個(gè)名為 start_browser 的函數(shù),用于創(chuàng)建 webdriver.Chrome 對(duì)象。
  • 定義一個(gè)名為 browser_thread 的函數(shù),接受一個(gè) webdriver.Chrome 對(duì)象和一個(gè)整數(shù)作為參數(shù),用于打開指定網(wǎng)頁(yè)并截圖。 切換到最后一個(gè)窗口,然后截圖。
  • main函數(shù)創(chuàng)建了5個(gè)瀏覽器,5個(gè)線程,執(zhí)行上面的操作,然后等待所有線程執(zhí)行完畢。
# -*- coding: utf-8 -*-
# Name:         multi_thread.py
# Author:       小菜
# Date:         2023/6/1 20:00
# Description:


import threading
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService

from webdriver_manager.chrome import ChromeDriverManager


def start_browser():
    service = ChromeService(ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    return driver


def browser_thread(driver: webdriver.Chrome, idx: int):
    url_list = ['https://www.csdn.net/', 'https://www.baidu.com',
                'https://music.163.com/', 'https://y.qq.com/', 'https://cn.vuejs.org/']

    try:
        driver.execute_script(f"window.open('{url_list[idx]}')")
        driver.switch_to.window(driver.window_handles[-1])
        driver.save_screenshot(f'{idx}.png')
        return True
    except Exception:
        return False


def main():
    for idx in range(5):
        driver = start_browser()
        threading.Thread(target=browser_thread, args=(driver, idx)).start()

    # 等待所有線程執(zhí)行完畢
    for thread in threading.enumerate():
        if thread is not threading.current_thread():
            thread.join()


if __name__ == "__main__":
    main()

運(yùn)行結(jié)果

  • 運(yùn)行時(shí)長(zhǎng)在9.28秒(速度與網(wǎng)絡(luò)環(huán)境有很大關(guān)系,木桶效應(yīng),取決于最后運(yùn)行完成的瀏覽器
  • 看到程序運(yùn)行完成后,多出了5張截圖。

【Selenium】提高測(cè)試&爬蟲效率:Selenium與多線程的完美結(jié)合

線程池與 多 瀏覽器??

這份代碼與 多線程與 多瀏覽器 的操作基本一致。速度上卻比多線程節(jié)省了一半。

# -*- coding: utf-8 -*-
# Name:         demo2.py
# Author:       小菜
# Date:         2023/6/1 20:00
# Description:


from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from concurrent.futures import ThreadPoolExecutor, as_completed

MAX_WORKERS = 5
service = ChromeService(ChromeDriverManager().install())


def start_browser():
    driver = webdriver.Chrome(service=service)
    return driver


def browser_task(driver: webdriver.Chrome, idx: int):
    url_list = ['https://www.csdn.net/', 'https://www.baidu.com',
                'https://music.163.com/', 'https://y.qq.com/', 'https://cn.vuejs.org/']

    try:
        driver.execute_script(f"window.open('{url_list[idx]}')")
        driver.switch_to.window(driver.window_handles[-1])
        driver.save_screenshot(f'{idx}.png')
        return True
    except Exception:
        return False


def main():
    executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)
    ths = list()
    for idx in range(5):
        driver = start_browser()
        th = executor.submit(browser_task, driver, idx=idx)
        ths.append(th)

    # 獲取結(jié)果
    for future in as_completed(ths):
        print(future.result())


if __name__ == "__main__":
    main()

運(yùn)行結(jié)果

  • 運(yùn)行時(shí)長(zhǎng)在4.5秒(運(yùn)行效果圖不是很匹配,但確實(shí)是比多線程快很多。
  • 看到程序運(yùn)行完成后,多出了5張截圖。【Selenium】提高測(cè)試&爬蟲效率:Selenium與多線程的完美結(jié)合

多個(gè)標(biāo)簽頁(yè)

這個(gè)的應(yīng)用場(chǎng)景有點(diǎn)意思。

這里的操作與上面的 多個(gè)瀏覽器其實(shí)是差不多的。
區(qū)別在于:上面打開多個(gè)瀏覽器,這里打開多個(gè)標(biāo)簽頁(yè)。

所以這個(gè)需要考量一個(gè)問(wèn)題:資源爭(zhēng)奪。與是這里用上了 threading.Lock 鎖,用以保護(hù)資源線程安全。

多線程與 多 標(biāo)簽頁(yè)??

代碼釋義:

  • 與上面差不多,不解釋了。
# -*- coding: utf-8 -*-
# Name:         demo2.py
# Author:       小菜
# Date:         2023/6/1 20:00
# Description:

import threading
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService

from webdriver_manager.chrome import ChromeDriverManager

service = ChromeService(ChromeDriverManager().install())
lock = threading.Lock()


def start_browser():
    driver = webdriver.Chrome(service=service)
    return driver


def browser_thread(driver: webdriver.Chrome, idx: int):
    url_list = ['https://www.csdn.net/', 'https://www.baidu.com',
                'https://music.163.com/', 'https://y.qq.com/', 'https://cn.vuejs.org/']
    try:
        lock.acquire()
        driver.execute_script(f"window.open('{url_list[idx]}')")
        driver.switch_to.window(driver.window_handles[idx + 1])
        driver.save_screenshot(f'{idx}.png')
        return True
    except Exception:
        return False
    finally:
        lock.release()


def main():
    driver = start_browser()
    for idx in range(5):
        threading.Thread(target=browser_thread, args=(driver, idx)).start()

    # 等待所有線程執(zhí)行完畢
    for thread in threading.enumerate():
        if thread is not threading.current_thread():
            thread.join()


if __name__ == "__main__":
    main()

運(yùn)行結(jié)果

【Selenium】提高測(cè)試&爬蟲效率:Selenium與多線程的完美結(jié)合

線程池與 多 標(biāo)簽頁(yè)??

這里不展示運(yùn)行結(jié)果了,因?yàn)樾Чc 多線程與 多 標(biāo)簽頁(yè) 一致。

# -*- coding: utf-8 -*-
# Name:         thread_pool.py
# Author:       小菜
# Date:         2023/6/1 20:00
# Description:

import time
import threading

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from concurrent.futures import ThreadPoolExecutor, as_completed

MAX_WORKERS = 5
service = ChromeService(ChromeDriverManager().install())
lock = threading.Lock()


def start_browser():
    driver = webdriver.Chrome(service=service)
    return driver


def browser_task(driver: webdriver.Chrome, idx: int):
    url_list = ['https://www.csdn.net/', 'https://www.baidu.com',
                'https://music.163.com/', 'https://y.qq.com/', 'https://cn.vuejs.org/']

    try:
        lock.acquire()
        driver.execute_script(f"window.open('{url_list[idx]}')")
        driver.switch_to.window(driver.window_handles[idx + 1])
        driver.save_screenshot(f'{idx}.png')
        return True
    except Exception:
        return False
    finally:
        lock.release()


def main():
    driver = start_browser()
    executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)
    ths = list()
    for idx in range(5):
        th = executor.submit(browser_task, driver, idx=idx)
        ths.append(th)

    # 獲取結(jié)果
    for future in as_completed(ths):
        print(future.result())


if __name__ == "__main__":
    st = time.time()
    main()
    et = time.time()
    print(et - st)

總結(jié)??

本文章介紹了 Selenium + threading Selenium + ThreadPoolExecutor 來(lái)創(chuàng)建多個(gè)瀏覽器或多個(gè)標(biāo)簽頁(yè)的操作。

文中示例的代碼比較簡(jiǎn)單,所以 線程池多線程 運(yùn)行的更加快。
但在實(shí)際的使用過(guò)程中,可以根據(jù)自己的喜好去選擇 線程池 還是 多線程 。

后話

本次分享到此結(jié)束,

see you~??????????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-495221.html

到了這里,關(guān)于【Selenium】提高測(cè)試&爬蟲效率:Selenium與多線程的完美結(jié)合的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 利用生成式AI的產(chǎn)研流程:創(chuàng)新與效率的完美結(jié)合

    利用生成式AI的產(chǎn)研流程:創(chuàng)新與效率的完美結(jié)合

    生成式AI(Generative AI)是一類人工智能技術(shù),旨在生成新的、原創(chuàng)的數(shù)據(jù)、圖像、音頻、視頻或其他形式的內(nèi)容。它通過(guò)機(jī)器學(xué)習(xí)算法來(lái)學(xué)習(xí)和模擬現(xiàn)實(shí)世界中的數(shù)據(jù)分布,然后使用這些模型來(lái)生成新的、具有相似特征的數(shù)據(jù)。比如,在軟件開發(fā)領(lǐng)域,生成式AI可以自動(dòng)化代

    2024年02月05日
    瀏覽(21)
  • 利用優(yōu)化算法提高爬蟲任務(wù)調(diào)度效率

    利用優(yōu)化算法提高爬蟲任務(wù)調(diào)度效率

    在大規(guī)模數(shù)據(jù)采集的場(chǎng)景中,高效的任務(wù)調(diào)度是關(guān)鍵之一。通過(guò)利用優(yōu)化算法,我們可以提高爬蟲任務(wù)的調(diào)度效率,加快數(shù)據(jù)采集速度,并有效利用資源。本文將為您介紹如何利用優(yōu)化算法來(lái)優(yōu)化爬蟲任務(wù)調(diào)度,實(shí)現(xiàn)高效的批量采集。 一、任務(wù)調(diào)度優(yōu)化的重要性 在批量采集

    2024年02月09日
    瀏覽(23)
  • 工業(yè)廠房地面混凝土破損快速修復(fù)案例:安全與效率的完美結(jié)合

    引言 在工業(yè)領(lǐng)域中,廠房地面的完好性直接關(guān)系到生產(chǎn)線的穩(wěn)定運(yùn)行和工人的作業(yè)安全。然而,隨著時(shí)間的推移,地面混凝土往往會(huì)出現(xiàn)破損、開裂等問(wèn)題,給企業(yè)的生產(chǎn)帶來(lái)諸多不便。因此,選擇一家專業(yè)、高效的混凝土修補(bǔ)公司顯得尤為重要。在眾多修補(bǔ)公司中,清兆混

    2024年04月17日
    瀏覽(13)
  • 跨境電商與隱擎fox指紋瀏覽器:保障安全與效率的完美結(jié)合

    ? ? ? 隨著全球化的發(fā)展,跨境電商已成為各國(guó)貿(mào)易的重要組成部分。然而,隨之而來(lái)的風(fēng)險(xiǎn)和挑戰(zhàn)也日益增多,其中之一就是關(guān)聯(lián)瀏覽器和多開瀏覽器可能帶來(lái)的安全隱患。為了確??缇畴娚痰捻樌\(yùn)營(yíng)和數(shù)據(jù)安全,隱擎fox指紋瀏覽器作為一種防關(guān)聯(lián)瀏覽器和多開瀏覽器的

    2024年02月14日
    瀏覽(26)
  • 使用多線程或異步技術(shù)提高圖片抓取效率

    使用多線程或異步技術(shù)提高圖片抓取效率

    圖片抓取是爬蟲技術(shù)中常見的需求,但是圖片抓取的效率受到很多因素的影響,比如網(wǎng)速、網(wǎng)站反爬機(jī)制、圖片數(shù)量和大小等。本文將介紹如何使用多線程或異步技術(shù)來(lái)提高圖片抓取的效率,以及如何使用爬蟲代理IP來(lái)避免被網(wǎng)站封禁。 多線程和異步技術(shù)都是利用計(jì)算機(jī)的并

    2024年02月09日
    瀏覽(16)
  • Java并發(fā)(二)----初次使用多線程并行提高效率

    并行代表充分利用多核 cpu 的優(yōu)勢(shì),提高運(yùn)行效率。 想象下面的場(chǎng)景,執(zhí)行 3 個(gè)計(jì)算,最后將計(jì)算結(jié)果匯總。 如果是串行執(zhí)行,那么總共花費(fèi)的時(shí)間是 10 + 11 + 9 + 1 = 31ms 但如果是四核 cpu,各個(gè)核心分別使用線程 1 執(zhí)行計(jì)算 1,線程 2 執(zhí)行計(jì)算 2,線程 3 執(zhí)行計(jì)算 3,那么 3 個(gè)

    2023年04月13日
    瀏覽(26)
  • 軟件測(cè)試/測(cè)試開發(fā)丨Selenium 網(wǎng)頁(yè)frame與多窗口處理

    本文為霍格沃茲測(cè)試開發(fā)學(xué)社學(xué)員學(xué)習(xí)筆記分享 原文鏈接:https://ceshiren.com/t/topic/27048 點(diǎn)擊某些鏈接,會(huì)重新打開?個(gè)窗?,對(duì)于這種情況,想在新頁(yè)?上操作,就 得先切換窗?了。 獲取窗?的唯?標(biāo)識(shí)?句柄表?,所以只需要切換句柄,就可以在多個(gè)頁(yè)?靈 活操作了 先獲

    2024年02月10日
    瀏覽(23)
  • 【PyQt5實(shí)現(xiàn)多線程更新UI】- 提高程序效率,優(yōu)化用戶體驗(yàn)

    【PyQt5實(shí)現(xiàn)多線程更新UI】- 提高程序效率,優(yōu)化用戶體驗(yàn) 在PyQt5應(yīng)用程序的開發(fā)中,當(dāng)程序需要處理大量數(shù)據(jù)或進(jìn)行復(fù)雜的計(jì)算時(shí),如果僅使用主線程,會(huì)導(dǎo)致GUI界面失去響應(yīng),用戶體驗(yàn)較差。為了解決這個(gè)問(wèn)題,通常需要使用多線程技術(shù)。 而在使用多線程時(shí),往往需要更新

    2024年02月07日
    瀏覽(16)
  • 計(jì)算機(jī)視覺---flask框架封裝目標(biāo)檢測(cè),應(yīng)用線程提高程序運(yùn)行效率

    計(jì)算機(jī)視覺---flask框架封裝目標(biāo)檢測(cè),應(yīng)用線程提高程序運(yùn)行效率

    1.前言 上一篇文章flask部署 目標(biāo)檢測(cè)算法中講到可以將檢測(cè)算法封裝到flask框架中進(jìn)行web端展示,但在實(shí)際應(yīng)用中發(fā)現(xiàn)一些問(wèn)題并進(jìn)行了解決,在本文中進(jìn)行補(bǔ)充。 2.利用線程,提高flask程序運(yùn)行效率 flask web端訪問(wèn)時(shí),每次都會(huì)從頭加載程序,導(dǎo)致每次訪問(wèn)頁(yè)面刷新率很低或

    2024年02月16日
    瀏覽(27)
  • Python爬蟲的應(yīng)用場(chǎng)景與技術(shù)難點(diǎn):如何提高數(shù)據(jù)抓取的效率與準(zhǔn)確性

    Python爬蟲的應(yīng)用場(chǎng)景與技術(shù)難點(diǎn):如何提高數(shù)據(jù)抓取的效率與準(zhǔn)確性

    作為專業(yè)爬蟲程序員,我們?cè)跀?shù)據(jù)抓取過(guò)程中常常面臨效率低下和準(zhǔn)確性不高的問(wèn)題。但不用擔(dān)心!本文將與大家分享Python爬蟲的應(yīng)用場(chǎng)景與技術(shù)難點(diǎn),并提供一些實(shí)際操作價(jià)值的解決方案。讓我們一起來(lái)探索如何提高數(shù)據(jù)抓取的效率與準(zhǔn)確性吧! 爬蟲應(yīng)用場(chǎng)景: 爬蟲在各

    2024年02月12日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包