#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-адреса и сохранить результаты для следующей обработки, чтобы сэкономить некоторое время. Тем не менее, стоит изучить многопроцессорную обработку. Спасибо!