サイクリングやマルチスレッド+セレンについて
例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の数が同じ、各スレッドを作成