如何在python中使用lambda函数中的urllib时尝试n次然后传递错误?

问题描述 投票:0回答:1

我正在尝试使用python 3中的urllib将pandas列中的短网址转换为实际网址。可能存在无法在浏览器中打开的无效网址。在这种情况下,我想跳过它们并继续其余的。

我试图使用lambda,但它抛出了像bad gatewayno name found等错误。如果发生任何错误,try-except将只返回任何内容。此外,我尝试了for loop,但它花了超过1小时。

try:
    df['url2'] = df['url'].apply(lambda x: urllib.request.urlopen(x).geturl())
except:
    pass

for i in range(df.shape[0]):
    try:
        df['url2'][i]=urllib.request.urlopen(df['url'][i]).geturl()
    except:
        pass

如果脚本可以跳过错误(如果可能的话重试)并在不到1分钟内完成处理10k行URL,那将会很好。

python lambda try-catch urllib
1个回答
1
投票

你可以看看https://pypi.org/project/retrying/,这是一个处理“重试”的Python库。集成到现有项目中非常容易。

考虑到你的第二个愿望(“在不到1分钟内完成处理10k行网址”),这可能是不可行的,因为每次尝试至少需要一个HTTP请求,并且不到1分钟内的10k请求有点过于乐观。但是,通过并行化尝试,您可能会更快一些,但这是一个不同的问题。

看看https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.Queue。将所有URL放入队列中,然后创建将使用这些URL的工作程序以检查它们是否有效。如果没有提供“新网址”同时你正在处理现有网址,那么https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.pool.Pool可能更容易处理。

© www.soinside.com 2019 - 2024. All rights reserved.