@Mindless_kiev

Как максимально быстро пройтись по списку из URL-ов, получить код (200 ОК или...) и записать в файл результат вида URL — 200 OK?

Есть задача: максимально быстро пройтись по списку из URL-ов, получить код ( 200 ОК или...) и записать в файл результат вида URL - 200 OK.
Скрипт уже написан на python 3.3 с использованием urllib, но работает неприемлемо долго.
Собственно вопрос: можно ли средствами python сделать это гораздо быстрей?

Заранее спасибо.
  • Вопрос задан
  • 3678 просмотров
Пригласить эксперта
Ответы на вопрос 8
avalak
@avalak
0. Не закрывать соединение после каждого запроса (зависит от того как у вас реализованно сейчас и что вы опрашиваете)
1. Использовать HEAD request
2. Использовать потоки (распараллелить)
3. Использовать gevent (с поддержкой python3 всё сложно). Тем не менее оно отлично дружит с requests, а на нём реализовать это не проблема вообще
4. Использовать шикарную библиотеку requests
Ответ написан
Комментировать
HTTP HEAD Request

Очевидно нужно просто отправить HEAD запрос ресурсу.
Примеров довольно много
Ответ написан
Комментировать
@IamG
основное время уходит на ожидание сетевого ответа. можно конечно распараллелить через треды, но
сложность кода возрастёт.
рекомендую сделать на twisted, он на такого рода задачи рассчитан.
не более экрана строк займёт, правда он только с python 2.x работает.
Ответ написан
Комментировать
IlyaEvseev
@IlyaEvseev
Opensource geek
Самый быстрый способ - через асинхронный фреймворк, без потоков и тем более процессов.
Главный асинхронный фреймворк для Питона сейчас Твистед.
Вот ссылки на документацию и примеры:
stackoverflow.com/questions/2147148/twisted-http-client
Ответ написан
Комментировать
seriyPS
@seriyPS
Если обязательно использовать Python, то я бы взял gevent и urllib2. Вместо использования HEAD (который многие серверы не понимают) советую просто не скачивать тело ответа.

Вот тут пример есть https://github.com/surfly/gevent/blob/master/examp... но он совсем уж простой - на практике лучше иметь пул из ограниченного числа гринлетов.

Ну и строчку
data = urllib2.urlopen(url).read()
нужно заменить на
resp = urllib2.urlopen(url)
print resp.getcode()
resp.close()
Чтоб только заголовки качать, без тела.

Насчёт keep-alive лучше не заморачивайтесь, это экономия на спичках (если только у вас не все запросы к одному серверу)

Twisted лучше не смотрите - это безперспективняк =)
Ответ написан
Комментировать
justabaka
@justabaka
Если скрипт не должен быть только на питоне, можно попробовать вызывать curl в несколько потоков :)

А вообще, уже было на SO безо всякого питона: stackoverflow.com/questions/6136022/script-to-get-...
Ответ написан
Комментировать
dbihbka
@dbihbka
Для распараллеливания urllib2 очень удобно использовать monkey_patch из gevent
Ответ написан
Комментировать
@Mindless_kiev Автор вопроса
Спасибо всем откликнувшимся.
Жаль, что для python3.x некоторые решения не подходят.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы