セレンの同時実行

サイクリングやマルチスレッド+セレンについて

例1

forループ

# - * -コーディング:UTF-8 - * - 

"" " 
日時:2019年6月22日
著者:張Yafeiの
説明""" 
インポート時

セレン輸入webdriverをから
selenium.webdriver.chrome.optionsインポートオプションから
同時から。先物はThreadPoolExecutorインポート
インポートfunctoolsの


chrome_options =オプション()
chrome_options.add_argument( " -ヘッドレス")
chrome_options.add_argument( ' - -GPUを無効')


DEFは
    timeit(FUNC):""」
    装饰器:判断函数执行时间
    :PARAM FUNC: リターン""」

    @のfunctools.wraps(FUNC)
    (* argsを、** kwargsから)デフインナー:
        開始= time.time()
        RET = FUNC(*引数、** kwargsから)
        端= time.time() -開始
        端場合60 <:
            プリント(F '花费时间:\ tの{ラウンド(端、2)}秒')
        他:
            分、秒= divmod(端、60)
            印刷(F '花费时间\ T {ラウンド(分)}分\ T {ラウンド(秒、2)}秒')
        を返すRET 

    内部戻り


クラスPolicyUrlDownload(オブジェクト):
    ""」政策数据下载""」

    ます:def __init __(自己、URL、pages_num、output_fileは、a_xpath、ヘッドレス:BOOL =真)
        [範囲内のページ(1、pages_num + 1)のためのurl.format(ページ)] self.url_list = 
        self.output_file = output_fileは
        self.a_xpath = a_xpath 
        ヘッドレスの場合:
            self.driver = webdriver.Chrome(オプション= chrome_options)
        他:
            self.start(ページ+ 1、URL)
            self.driver = webdriver.Chrome()

    :DEF(自己、ページ、URL)を開始する
        (エンコード= 'UTF-8' self.output_file、モード= 'A')ファイルとしてオープンして:
            印刷を(に要求を行う「F {URL}」)
            self.driver.get(URL)
            タイトル= self.driver.find_elements_by_xpath(self.a_xpath)
            タイトルにタイトル:
                HREF = title.get_attribute( 'のhref')
                file.write(F '{ページ} \ T {HREF} \ n 'の)
            プリント(F' '完了{URL}ダウンロード)

    デフ自己(実行):
        ページのため、URL列挙中(self.url_list):
        self.driver.closeは()


@timeit 
設定(DEFメイン):
    POLICY_DATA = PolicyUrlDownload(**設定) 
    policy_data.run()


__name__ == '__main__'の場合:
    time.time =()START_TIME 
    「(印刷#################### ####ダウンロードを開始#########################「) 
複数の構成ページアドレスのダウンロード
    設定= [ 
        { 
            」output_fileは「:」医薬品の供給統合セキュリティ管理の.txt ' 
            'URL ':' http://cdsip.nhfpc.gov.cn/work/0-{}.html'、
            ' pages_num ':8、
            ' a_xpath ':' // divの[上記ID = @ "稼動0"] / UL /リー/ A ' 
        }、
        { 
            'のoutput_file ':'薬物供給セキュリティ包括的な管理の.txt ' 
            ' URL ':' http://cdsip.nhfpc.gov.cn/policy /0-{}-0.html」、
            「pages_num「:9; 
            ' a_xpath ':'// divの[@クラス= "infoContentボックス・ボディ"] / UL /リチウム/ A」 
        } 
    ]

 
    設定で設定する:
        メイン(設定)
        
    を印刷( '正常にダウンロード、費やされた合計時間'、ラウンド( time.time() - START_TIME、2) ' S')

結果

成功をダウンロードして、28.46秒の合計時間を過ごしました

マルチスレッド

# - * -コーディング:UTF-8 - * - 

"" " 
日時:2019年6月22日
著者:張Yafeiの
説明""" 
インポート時

セレン輸入webdriverをから
selenium.webdriver.chrome.optionsインポートオプションから
同時から。先物はThreadPoolExecutorインポート
インポートfunctoolsの


chrome_options =オプション()
chrome_options.add_argument( " -ヘッドレス")
chrome_options.add_argument( ' - -GPUを無効')


DEFは
    timeit(FUNC):""」
    装饰器:判断函数执行时间
    :PARAM FUNC: リターン""」

    @のfunctools.wraps(FUNC)
    (* argsを、** kwargsから)デフインナー:
        開始= time.time()
        RET = FUNC(*引数、** kwargsから)
        端= time.time() -開始
        端場合60 <:
            プリント(F '花费时间:\ tの{ラウンド(端、2)}秒')
        他:
            分、秒= divmod(端、60)
            印刷(F '花费时间\ T {ラウンド(分)}分\ T {ラウンド(秒、2)}秒')
        を返すRET 

    内部戻り


クラスPolicyUrlDownload(オブジェクト):
    ""」政策数据下载""」

    ます:def __init __(自己、URL、pages_num、output_fileは、a_xpath、ヘッドレス:BOOL =真)
        [範囲内のページ(1、pages_num + 1)のためのurl.format(ページ)] self.url_list = 
        self.output_file = output_fileは
        self.a_xpath = a_xpath 
        ヘッドレスの場合: 
            self.driver = webdriver.Chrome(オプション= chrome_options)
        他:
            self.driver = webdriver.Chrome()

    :DEF(自己、ページ、URL)を開始する
        (エンコード= 'UTF-8' self.output_file、モード= 'A')ファイルとしてオープンして:
            印刷を(に要求を行う「F {URL}」)
            self.driver.get(URL)
            タイトル= self.driver.find_elements_by_xpath(self.a_xpath)
            タイトルにタイトル:
                HREF = title.get_attribute( 'のhref')
                file.write(F '{ページ} \ T {HREF} \ n 'の)
            プリント(F' '完了{URL}ダウンロード)

    デフ自己(実行):
        ページのため、URL列挙中(self.url_list):
            self.start(ページ+ 1、URL)
        self.driver.closeは()


@timeit 
設定(DEFメイン):
    POLICY_DATA = PolicyUrlDownload(**設定) 
    policy_data.run()


__name__ == '__main__'の場合:
    time.time =()START_TIME 
    「(印刷#################### ####ダウンロードを開始#########################「) 
複数の構成ページアドレスのダウンロード
    設定= [ 
        { 
            」output_fileは「:」医薬品の供給統合セキュリティ管理の.txt ' 
            'URL ':' http://cdsip.nhfpc.gov.cn/work/0-{}.html'、
            ' pages_num ':8、
            ' a_xpath ':' // divの[上記ID = @ "稼動0"] / UL /リー/ A ' 
        }、
        { 
            'のoutput_file ':'薬物供給セキュリティ包括的な管理の.txt ' 
            ' URL ':' http://cdsip.nhfpc.gov.cn/policy /0-{}-0.html」、
            「pages_num「:9;
            'a_xpath': '// divの[クラス@ = "infoContentボックス・ボディ"] / UL /リチウム/ A' // divの[@クラス= "infoContentボックス・ボディ"] / UL /リチウム/ A」 
        } 
    ]
    ThreadPoolExecutor(と)プールAS:
        pool.map(メイン、[設定])

    を印刷(「成功ダウンロードするには、合計時間を費やし'ラウンド(time.time() - START_TIME、2)、' S')

結果

時間は費やし:18.04秒

例二

オーダー実行

# - * -コーディング:UTF-8 - * - 
インポートのOS 
インポート時
concurrent.futuresからはThreadPoolExecutorをインポート
hashlibインポートMD5から

セレン輸入webdriverをから
selenium.webdriver.chrome.optionsインポートオプションから
selenium.webdriver.chrome.serviceインポートサービスから
NPのようnumpyのインポート


クラスPolicyPageDownload(オブジェクト):
    "" "政策数据下载""" 

    デフ__init __(自己、ファイル、DIR_NAME、url_list):
        self.file =ファイル
        self.dir_name = DIR_NAME 
        self.urls = url_list 
        self.chrome_options =オプション()
        self.chrome_options.add_argument( " -ヘッドレス")
        self.chrome_options.add_argument(」--disable-GPU ')
        self.driver = webdriver.Chrome(オプション= self.chrome_options)
        #self.driver = webdriver.Chrome()

    デフを開始(自己、URL):
        "" " 
        开始下载
        :のparam URL: リターン""" 
        self.driver .get(URL)
        応答= self.driver.page_sourceの
        プリント({URL}にf'make要求')
        FILE_NAME = MD5(バイト(URL、符号化=' UTF-8 '))。hexdigest()+'の.html」
        印刷( '11111111111') オープン(F '{self.dir_name} / {FILE_NAME}'、 'W'、エンコード= 'UTF-8')ファイルとして有する
            file.write(応答)
        プリント(F '{URL}ダウンロード「完成) 

    DEF RUN(自己):
        "" "エントリポイント" ""
        【self.start self.urlsにおけるURLの(URL)] 
        self.driver.quit()


DEF filter_urls(DIR_NAME、のURL):
    "" " 
    过滤URL 
    :PARAMのURL: リターン""" 
    encode_urls = [MD5(バイト(URL、符号化= 'UTF-8'))のURLにURLの。hexdigest()+ 'の.html'] 
    has_file os.listdirにおけるファイルの= [ファイル(DIR_NAME)os.path.getsize(場合はos.path。参加(DIR_NAME、ファイル))> 0] 
    encode_urls =設定(encode_urls) -セット(has_file)
    down_urls =リスト(
        フィルタ(ラムダURL:MD5(バイト(URLエンコード= 'UTF-8'))hexdigest()+ encode_urlsで'の.html'のURL)) 印刷(F '共{LEN(セット(のURL))} \ T已下载{LEN(セット(has_file))} \ T还需下载{LEN(encode_urls)}) 
    戻りdown_urls

RUN DEF(URL_LIST):
    政策= PolicyPageDownload(URL_LIST = URL_LIST、**設定)
    policy.run()

DEFメイン(ファイル、DIR_NAME):
    IFないos.path.exists(DIR_NAME):
        os.mkdir(DIR_NAME)
    inputfileに=オープン(ファイル、 'R&LT'、エンコード= 'UTF-8')
    のURL = [line.strip()。スプリット( '\のT')[1]のインデックスの、列挙ラインで(INPUTFILE)] 
    はos.path IF。 (DIR_NAME)が存在
        するURLの= filter_urls(DIR_NAME、URLの)

    RUN(URLの)

IF __name__ == '__main__':
    START_TIME = time.time()
    設定= { 
        'ファイル': '薬剤供給セキュリティ.txtファイルの統合管理'を、
        「DIR_NAME」:「医薬品供給保障包括的な管理」
        } 
    メイン(**設定)

    印刷( '正常にダウンロード、合計時間は費やし'、ラウンド(time.time() -  START_TIME、2)、 'S')

マルチスレッド

# - * -コーディング:UTF-8 - * - 
インポートのOS 
インポート時
concurrent.futuresからはThreadPoolExecutorをインポート
hashlibインポートMD5から

セレン輸入webdriverをから
selenium.webdriver.chrome.optionsインポートオプションから
selenium.webdriver.chrome.serviceインポートサービスから
NPのようnumpyのインポート


クラスPolicyPageDownload(オブジェクト):
    "" "政策数据下载""" 

    デフ__init __(自己、ファイル、DIR_NAME、url_list):
        self.file =ファイル
        self.dir_name = DIR_NAME 
        self.urls = url_list 
        self.chrome_options =オプション()
        self.chrome_options.add_argument( " -ヘッドレス")
        self.chrome_options.add_argument(」--disable-GPU ')
        self.driver = webdriver.Chrome(オプション= self.chrome_options)
        #self.driver = webdriver.Chrome()

    デフを開始(自己、URL):
        "" " 
        开始下载
        :のparam URL: リターン""" 
        self.driver .get(URL)
        応答= self.driver.page_sourceの
        プリント({URL}にf'make要求')
        FILE_NAME = MD5(バイト(URL、符号化=' UTF-8 '))。hexdigest()+'の.html」
        印刷( '11111111111') オープン(F '{self.dir_name} / {FILE_NAME}'、 'W'、エンコード= 'UTF-8')ファイルとして有する
            file.write(応答)
        プリント(F '{URL}ダウンロード「完成) 

    DEF RUN(自己):
        "" "エントリポイント" ""
        【self.start self.urlsにおけるURLの(URL)] 
        self.driver.quit()


DEF filter_urls(DIR_NAME、のURL):
    "" " 
    过滤URL 
    :PARAMのURL: リターン""" 
    encode_urls = [MD5(バイト(URL、符号化= 'UTF-8'))のURLにURLの。hexdigest()+ 'の.html'] 
    has_file os.listdirにおけるファイルの= [ファイル(DIR_NAME)os.path.getsize(場合はos.path。参加(DIR_NAME、ファイル))> 0] 
    encode_urls =設定(encode_urls) -セット(has_file)
    down_urls =リスト(
        フィルタ(ラムダURL:MD5(バイト(URLエンコード= 'UTF-8'))hexdigest()+ encode_urlsで'の.html'のURL)) 印刷(F '共{LEN(セット(のURL))} \ T已下载{LEN(セット(has_file))} \ T还需下载{LEN(encode_urls)}) 
    戻りdown_urls

デフ実行(url_list):
    政策= PolicyPageDownload(url_list = url_list、**設定)
    policy.run()

DEFメイン(ファイル、DIR_NAME):
    そうでない場合はos.path.exists(DIR_NAME):
        os.mkdir(DIR_NAME)
    inputfileに=オープン(ファイル、R ''、エンコード= 'UTF-8')
    のURLの= [line.strip()。スプリット( '\さt')[1]のインデックスの、列挙内のライン(入力ファイル)] 
    はos.path場合。 (DIR_NAME)が存在
        するURLの=のfilter_urls(DIR_NAME、URLの)

    プールとしてThreadPoolExecutor()を有する:
        pool.map(ラン、np.array_split(URLを、4))


であれば__name__ == '__main__':
    START_TIME = time.time()
    設定= { 
        'ファイル': '药品供应保障综合的管理の.txt'、
        'DIR_NAME': '医薬品供給保障包括的な管理 "
        } 
    メイン(**設定)

    印刷( '正常にダウンロード、合計時間は費やし'、ラウンド(time.time() -  START_TIME、2)、 'S')

業績

循環のための#50:ダウンロードが成功すると、48.62秒の合計時間を費やした
#150のサイクルのために:150.22秒の合計時間は、それが取る
#150スレッド:総支出時間を80.84秒

  • 結論:大きな支出のドライバ、何回も使用し、一度作成しようと、言葉が同時運転を共有することはできません、あなたは再作成する必要があります
  • ヒントの概要:ドライバを作成するために、複数のスレッド、最高の数とCPUの数が同じ、各スレッドを作成

 

  

おすすめ

転載: www.cnblogs.com/zhangyafei/p/11075243.html