成功する時と、成功しない時があるんだよね。一旦メモリを解放したほうがいいのかな?

成功する場合と成功しない場合があるということは、メモリリークや一時的なリソース不足が原因である可能性があります。ブラウザを再起動する以外にも、メモリの解放を促進するためのいくつかの追加手段を講じることができます。

以下に、Seleniumを使用して一定のページ数ごとにブラウザを再起動し、ガベージコレクションを促進する方法を示します。

python
import gc from selenium import webdriver from selenium.webdriver.chrome.options import Options def create_driver(): options = Options() options.add_argument("--headless") options.add_argument("--disable-gpu") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(options=options) return driver def crawl_pages(total_pages): driver = create_driver() for i in range(total_pages): try: # ページに移動 url = f"http://example.com/page{i}" driver.get(url) # ページの操作 # ここにスクレイピングのコードを追加 print(f"Crawled page {i}") # 一定のページ数ごとにブラウザを再起動 if (i + 1) % 10 == 0: # 10ページごとに再起動 driver.quit() driver = create_driver() gc.collect() # ガベージコレクションを明示的に呼び出す except Exception as e: print(f"Error on page {i}: {e}") driver.quit() driver = create_driver() # エラーが発生した場合も再起動 gc.collect() # ガベージコレクションを明示的に呼び出す driver.quit() if __name__ == "__main__": total_pages = 50 # クロールする総ページ数 crawl_pages(total_pages)

説明

  1. create_driver関数:

    • ChromeDriverを作成し、必要なオプションを設定します。
  2. crawl_pages関数:

    • 指定された総ページ数をクロールします。
    • 10ページごとにブラウザを再起動し、明示的にガベージコレクションを呼び出します(gc.collect())。
    • 各ページのURLにアクセスし、必要なスクレイピング操作を実行します。
    • エラーが発生した場合にもブラウザを再起動し、ガベージコレクションを呼び出します。
  3. mainブロック:

    • クロールする総ページ数を設定し、crawl_pages関数を実行します。

このアプローチでは、Pythonのガベージコレクション機能を利用してメモリを解放し、メモリリークを軽減します。これにより、リソース不足によるクラッシュの可能性が低くなります。また、ブラウザの再起動とガベージコレクションの頻度を調整することで、さらに安定性を向上させることができます。

未分類

Posted by ぼっち