2017-03-10 17 views
0

私はpythonセレンを使用して10,000以上のURLから大量のデータを解析しています。ブラウザはFirefoxです。python selenium、Firefoxが突然空白になり、動作を停止します

Firefoxのブラウザが開き、データの解析が終了すると閉じられ、Firefoxを使用して次のURLを開く前に5秒間待機します。

しかし、最近2回起こった。すべてがうまくいっていた。突然、新しく開かれたブラウザは空白になり、URLはまったく読み込まれない。実生活の経験では、ブラウザを手動で開いて何かを検索しても、それは空白です。

問題が発生したときに、例外が発生した場合でも例外はありませんが、コードを実行するにはnohupコマンドを使用していますが、例外も記録されますが、エラーはまったくありません。そして一度これが起こると、コードはもう実行されず、多くのURLは解析されずに残されます。残りのURLでコードを再実行すると、もう一度正常に動作します。ここで

は私のコード(すべての10,000 URLがcomment_urlsリストである)である:任意の例外が存在することになる場合には、同時に

for comment_url in comment_urls: 
    driver = webdriver.Firefox(executable_path='/Users/devadmin/Documents/geckodriver') 
    driver.get(comment_url) 
    time.sleep(5) 
    try: 
     // here is my data parsing code ..... 
     driver.quit() // the browser will be closed when the data has been parsed 
     time.sleep(5) // and wait 5 secods 

    except: 
     with open(error_comment_reactions, 'a') as error_output: 
      error_output.write(comment_url+"\n") 
     driver.quit() 
     time.sleep(5) 

、そのデータ解析部分で、私のコードも記録されます例外とドライバを閉じ、5秒待ってください。しかし今のところ、エラーは全く記録されていません。

私は同様の問題と解決策をオンラインで見つけようとしましたが、それは役に立ちません。

  1. はあなたが前にこの問題を満たしていると、あなたはそれに対処する方法を知っていますか:

    だから、現在、私は心の中で2つの質問がありますか?それはネットワークの問題やセレンの問題やブラウザの問題ですか?

  2. それとも、FirefoxがURLをロードしていないことを伝えることができ、それを閉じますか?
+1

ハードウェアアクセラレーションを無効にする:https://support.mozilla.org/t5/Procedures-to-diagnose-and-fix/Troubleshoot-extensions-themes-and-hardware-acceleration-issues/ta-p/ 1616#w_turn-off-hardware-acceleration –

+0

私はこのソリューションから始めましたが、コードは最近実行されていましたが、今日は突然終了せずに突然停止しました。良いニュースは、今回はブラウザがクラッシュすることはなくなりましたが、ポップアップウィンドウがあり、セキュリティサービスのマスターパスワードを求めてコードを停止しました。しかし、それはどのセキュリティサービスを伝えていませんでした。だから、私はMacにセキュリティ設定があるかもしれないと思っているのだろうか?それとも、学校の研究室のセキュリティ保護ですか?または他の理由?このマシンには複数のアカウントがあり、私が使用しているアカウントはマスターアカウントではありません。どんな考え? –

+1

そのページとURLのスクリーンショットに依存します。それがなければ何が起こったのかは分かりません。 FirefoxにはFirefoxの同期用の独自のマスターパスワードがありますが、私はあなたがセレンブラウザ(Firefoxドライバ)で同期を使用していないと理解しています。それはウェブサイトやキャンパスに起因する可能性があります。 –

答えて

0

第2の問題点として、URLを解析する作業キューを使用することをお勧めします。 1つのアプリケーションはキュー(redis、rabbit-mq、amazon sqsなど)にすべてを追加してから、2番目のアプリケーションはキューから1つのURLを取得して解析する必要があります。成功する場合は、キューからURLを削除し、キュー内の他のURLに切り替える必要があります。例外の場合、アプリケーションを停止するにはos.exit(1)を実行する必要があります。 2番目のアプリケーションを実行するシェルを使用して、エラーが発生したことを意味する1を返すときは、アプリケーションを再起動します。シェルスクリプトは:Get exit(1) from Python in shell

0

あなたの2つの質問に答えるために:

1)はい、私が発見したセレンは、時には予測不可能であることを。これは、私が私のソリューションで話すことになる初めてブラウザを開くときに通常問題になります。必要がない限り、ブラウザを閉じないでください。

2)はい、あなたがselenium.webdriver.support.wait

にWebDriverWait()クラスを使用することができますので、ちょうどあなたが開いているwebdriverを持つ新しいGET要求を行うあなたはコメントの数千人を解析していると述べました。

は、私は以下のコードで自分のスクレーパーでこれを使用します。

from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 

browser = webdriver.Firefox() 
browser.get("http://someurl.com") 
table = WebDriverWait(browser,60).until(EC.presence_of_element_located((By.TAG_NAME, "table")))` 

変数ブラウザはちょうどwebdriver.Firefox()クラスです。

長いですが、特定のhtmlタグが60秒のタイムアウトでページに存在するのを待っています。

スレッドをロックする独自のtime.sleep()が発生している可能性があります。このようなことを補うために睡眠を使わないでください。

関連する問題