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

标签 python linux amazon-web-services amazon-s3 nohup

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

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 .

关于AWS 上的 Python 网络抓取脚本在 1.5 小时/获取 10,000 个 xml 后一直失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39007827/

相关文章:

amazon-web-services - 如何使 AWS api 网关接受 http 而不是 https

amazon-web-services - AWS SAM 使用可选的 Transform 进行部署

python - 代表数独谜题的正确数据结构?

python - Pandas 中的多键横截面。处理未命中和重复索引

Python 子进程.CalledProcessError : returned non-zero exit status 2

amazon-web-services - AWS Athena 从 GLUE Crawler 输入的表中返回零记录来自 S3

python - 按键合并字典数组

python - 如何在python中旋转 turtle 形状

linux - Bash 权限被拒绝

linux - 如何在linux中创建两个组?