URLのプールをスクラップするには、私はjoblibでセレンを並列処理しています。この文脈で、私は2つの課題に直面しています:並列処理中にセレニウムドライバインスタンスを再利用するには?
- 挑戦1は、このプロセスをスピードアップすることです。現時点では、私のコードは、すべてのURL(理想的にはすべてのプロセスの1つになる)のドライバインスタンスを開き、閉じます。
- 挑戦2はCPU集約的なwhileループを取り除くことですが、空の結果には
continue
私の理解では、反復の間でドライバインスタンスを再利用するためには、# Set up driver
-lineをする必要があるということである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
:擬似コード
(私は、これが最も可能性の高い間違っていることを知っています)外に置いたscrape(URL)
。しかし、scrape(URL)
以外のものは、ジョブライブラリのParallel(n_jobs = 40)
には届きません。これは、trueではないjoblibを使用してスクラップしている間にドライバインスタンスを再利用することができないことを意味します。
1:上記の例の並列処理中にドライバインスタンスを再利用するにはどうすればよいですか?
Q2:上記の例の機能を維持しながらwhileループを取り除くにはどうすればよいですか?
注:フラッシュおよび画像負荷はfirefox_profile
で無効になって
私はそれを試してみましたが、何かがメモリリークを引き起こします。私はこの問題を解決するとすぐにあなたに戻ってきます。 – sudonym
@sudonym、リークを作成していましたか? – suit
リークはphantomJS(Firefoxの代わりに使用しています)が原因です - 'load_images = no argument'はphantomJSインスタンスが再利用されたときにこれを引き起こすことが知られています – sudonym