Как попробовать N раз, а затем передать ошибки при использовании urllib в лямбда-функции в Python? - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь преобразовать короткие URL-адреса в столбце панд в реальные 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 Ответ

1 голос
/ 29 марта 2019

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

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

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

...