как попробовать n раз, а затем передать ошибки при использовании urllib в лямбда-функции в python?

#python #lambda #try-catch #urllib

#python #лямбда #попробуйте-поймайте #urllib

Вопрос:

Я пытаюсь преобразовать короткие URL-адреса в столбце pandas в реальные URL-адреса, используя urllib в python 3. Могут быть недопустимые URL-адреса, которые нельзя открыть в браузере. В этом случае я хочу пропустить их и продолжить с остальными.

Я пытался использовать 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
  

Было бы хорошо, если бы скрипты могли пропускать ошибки (повторите попытку, если возможно) и завершить обработку 10 тысяч строк URL-адресов менее чем за 1 минуту.

Ответ №1:

Вы можете взглянуть на https://pypi.org/project/retrying /, это библиотека Python для обработки «попыток». Это довольно легко интегрировать в существующий проект.

Учитывая ваше второе желание («завершить обработку 10 тысяч строк URL-адресов менее чем за 1 минуту»), это, вероятно, неосуществимо, потому что для каждой попытки требуется по крайней мере один HTTP-запрос, а 10 тысяч запросов менее чем за 1 минуту — это слишком оптимистично. Тем не менее, вы, вероятно, можете быть немного быстрее, распараллелив попытки, но это другой вопрос.

Взгляните на https://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.Очередь. Поместите все URL-адреса в очередь, затем создайте рабочие адреса, которые будут использовать эти URL-адреса, чтобы проверить, действительны они или нет. Если «новые URL» не предоставлены, пока вы обрабатываете существующие, тоhttps://docs.python.org/3.7/library/multiprocessing.html#multiprocessing.pool.С пулом могло бы быть проще справиться.

Комментарии:

1. Теперь я знаю, почему это заняло так много времени. Я решил дедуплицировать URL-адреса и сохранить результаты для следующей обработки, чтобы сэкономить некоторое время. Тем не менее, стоит изучить многопроцессорную обработку. Спасибо!