Python AWS 上的网络抓取脚本在 1.5 hours/fetching 10,000 个 xml 后一直失败

Python webscraping script on AWS keeps failing after 1.5 hours/fetching 10,000 xmls

我编写了一个 Python 脚本,该脚本 运行 从 AWS 实例中获取 xml 文件并从 S3 服务器中提取文件以放置在实例上的文件夹中。该脚本工作正常,除了在大约一个半小时后,或者大约在获取 10,000-15,000 xmls 所需的时间之后,我收到以下错误:

HTTP Error 500: Internal Server Error

出现此错误后,我被告知无法找到我告诉脚本放置获取的 xml 的文件夹,即

[Errno 2] No such file or directory:

我已经尝试 运行从 ssh、使用屏幕和使用 nohup 连接这个脚本,但我每次都遇到同样的问题。因为我有大约 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('..')

我不知道关于 python 的第一件事,但问题似乎很明显,都是一样的。

当发生 S3 错误时,您 continue 会跳过最近循环中的其余指令,并从循环顶部继续下一个值...这会跳过 os.chdir('..') 在循环结束时,所以你当前的工作目录仍然是 irs990s。在下一次迭代中,os.chdir("irs990s") 当然会失败,因为它试图在当时的目录 中找到一个名为 irs990s 的目录,该目录是当然已经 irs990s,所以那当然会失败。

这里有几节课。

不要使用 os.chdir('..') 不断地进出目录——这是非常糟糕的形式,容易出现细微的错误。举个例子,见上文。使用绝对路径。如果你真的想要相对路径,那很好,但不要这样做。在启动时捕获工作目录或配置一个基本工作目录,并使用它来完全限定你的 chdir 路径。

设计您的代码以预测来自 S3 或来自任何提供商的任何 Web 服务的偶然错误,并在短暂的递增延迟后重试 5XX 错误 -- exponential backoff