我正在尝试使用python 3中的urllib
将pandas列中的短网址转换为实际网址。可能存在无法在浏览器中打开的无效网址。在这种情况下,我想跳过它们并继续其余的。
我试图使用lambda
,但它抛出了像bad gateway
,no 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,那将会很好。
你可以看看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可能更容易处理。