2016-08-17 3 views
1

AWSインスタンスから実行され、S3サーバーからXMLファイルをフェッチしてインスタンスのフォルダに配置するPythonスクリプトを作成しました。私は、このエラーに続いAWSのPython webscrapingスクリプトは、1.5時間後に失敗し続けます/ 10,000 XMLをフェッチする

HTTP Error 500: Internal Server Error 

:スクリプト約1時間半後に、またはそれが10,000〜15,000 XMLSを取得するのにかかる時間について、私は次のエラーを取得するという事実を除いて、正常に動作します私はすなわち

[Errno 2] No such file or directory: 

、見つけることができないでフェッチされたXMLを配置するスクリプトを教えフォルダが、私はnohupを、SSHの両方から、このスクリプトを実行している画面を使用し、使用して試してみましたが、私は同じ問題を得ることを告げました毎回。フェッチするために約200,000のXMLがあるので、私はこのスクリプトを一度実行し、実行する必要がある20時間以上何か他のことをやりたいと思います。

import os 

import feather 

df = feather.read_dataframe('avail.feather') 

import xmltodict 

urls = df['URL'] 

import urllib.request 
import time 
import requests 

ticker=0 
start = time.time() 
for u in urls[ticker:len(urls)]: 
    #os.chdir('/home/stan/Documents/Dissertation Idea Box/IRS_Data') 
    ticker += 1 
    print("Starting URL",ticker, "of", len(urls),"........." ,(ticker/len(urls))*100, "percent done") 
    if u is None: 
     print("NO FILING") 
     end = time.time() 
     m, s = divmod(end-start, 60) 
     h, m = divmod(m, 60) 
     print("Elapsed Time:","%02d:%02d:%02d" % (h, m, s))   
     continue 

    u = u.replace('https','http') 
    r = requests.get(u)  
    doc = xmltodict.parse(r.content) 
    try: 
     os.chdir("irs990s") 
     urllib.request.urlretrieve(u, u.replace('http://s3.amazonaws.com/irs-form-990/','')) 
     print("FETCHED!","..........",u) 
    except Exception as e: 
     print("ERROR!!!","..........",u) 
     print(e) 
     end = time.time() 
     m, s = divmod(end-start, 60) 
     h, m = divmod(m, 60) 
     print("Elapsed Time:","%02d:%02d:%02d" % (h, m, s)) 
     continue 
    end = time.time() 
    m, s = divmod(end-start, 60) 
    h, m = divmod(m, 60) 
    print("Elapsed Time:","%02d:%02d:%02d" % (h, m, s)) 
    os.chdir('..') 

答えて

2

私のpythonについての最初の事を知らないが、問題はすべて同じ、十分に明白なようだ:

は参考のために、私が書いたスクリプトは以下の通りです。

S3エラーが発生すると、最も近いループ内の命令の残りの部分をスキップし、ループの先頭から次の値に進みます。これにより、最後にos.chdir('..')がスキップされます。ループするので、あなたの現在の作業ディレクトリはまだirs990sです。もちろん、すでにirs990sであるので、その次の反復では、もちろんos.chdir("irs990s")は、irs990sの中にあるというディレクトリを見つけようとしているので、失敗するでしょう。

ここにはいくつかのレッスンがあります。

os.chdir('..')を使用してディレクトリの切り替えを維持しないでください。これは非常に悪いフォームであり、微妙なバグになりやすいです。ケースインポイント、上記を参照してください。絶対パスを使用します。あなたが本当に相対的なパスを望むなら、それは問題ありませんが、このようにしないでください。起動時に作業ディレクトリを取得するか、基本作業ディレクトリを設定し、それを使ってchdirでパスを完全修飾します。

S3または任意のWebサービスからの任意のプロバイダのエラーを予期するようにコードを設計し、短く、増分する遅延の後に5XXエラーを再試行します(exponential backoff)。

+0

このアドバイスはお金の上にあります。私は今朝コードを再作成しましたが、問題なく過去7時間稼働しています。ありがとうございました! – StanO

関連する問題