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。
我编写了一个 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。