urlib2.urlopen через прокси не работает после нескольких звонков - PullRequest
4 голосов
/ 25 февраля 2011

Редактировать: после долгих хлопот, кажется, что urlgrabber преуспевает там, где происходит сбой urllib2, даже если он говорит, что закрывает соединение после каждого файла. Похоже, что-то не так с тем, как urllib2 обрабатывает прокси, или с тем, как я его использую! В любом случае, вот самый простой код для извлечения файлов в цикле:

import urlgrabber

for i in range(1, 100):
    url = "http://www.iana.org/domains/example/"
    urlgrabber.urlgrab(url, proxies={'http':'http://<user>:<password>@<proxy url>:<proxy port>'}, keepalive=1, close_connection=1, throttle=0)

Привет всем!

Я пытаюсь написать очень простой скрипт на python, чтобы получить кучу файлов через urllib2.

Этот сценарий должен работать через прокси на работе (моей проблемы не существует, если захватывать файлы в интрасети, т. Е. Без прокси).

Указанный скрипт завершается ошибкой после пары запросов с «HTTPError: HTTP Error 401: ошибка базовой аутентификации». Есть идеи, почему это может быть? Кажется, прокси-сервер отклоняет мою аутентификацию, но почему? Первая пара запросов urlopen прошла правильно!

Редактировать: добавление 10 секунд ожидания между запросами, чтобы избежать какого-либо регулирования, которое может быть выполнено прокси-сервером, не изменило результаты.

Вот упрощенная версия моего скрипта (с явно удаленной идентифицированной информацией):

import urllib2

passmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
passmgr.add_password(None, '<proxy url>:<proxy port>', '<my user name>', '<my password>')
authinfo = urllib2.ProxyBasicAuthHandler(passmgr)

proxy_support = urllib2.ProxyHandler({"http" : "<proxy http address>"})
opener = urllib2.build_opener(authinfo, proxy_support)
urllib2.install_opener(opener)

for i in range(100):
with open("e:/tmp/images/tst{}.htm".format(i), "w") as outfile:
    f = urllib2.urlopen("http://www.iana.org/domains/example/")
    outfile.write(f.read())

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 04 марта 2011

Вы можете минимизировать количество соединений, используя обработчик keepalive из модуля urlgrabber .

import urllib2
from keepalive import HTTPHandler
keepalive_handler = HTTPHandler()
opener = urllib2.build_opener(keepalive_handler)
urllib2.install_opener(opener)

fo = urllib2.urlopen('http://www.python.org')

Я не уверен, что это будет работать правильно с вашей настройкой прокси. Возможно, вам придется взломать модуль keepalive.

1 голос
/ 26 февраля 2011

Прокси может ограничивать ваши запросы. Полагаю, он думает, что ты выглядишь как бот.

Вы можете добавить тайм-аут и посмотреть, поможет ли это вам.

...