Найти - Пользователи
Полная версия: Проблема при обращении через прокси. urllib
Начало » Network » Проблема при обращении через прокси. urllib
1
buddha
Пробую просто со своего рабочего места обратиться , например, к яндексу.
Пишу на python 3.3. Выдаёт ошибку странную. Нагуглить почти ничего не получилось, кроме как на слова scheme: ‘Negotiate’

Вот код:
from urllib import request
 
 
URL = 'http://www.yandex.ru'
psw_mgr = request.HTTPPasswordMgrWithDefaultRealm()
psw_mgr.add_password(None, URL, 'my_name', 'my_pass')
auth = request.ProxyBasicAuthHandler(psw_mgr)
opener = request.build_opener(auth) # opener уже содержит необходимый адрес\порт прокси. Прописывать не нужно.
request.install_opener(opener)
resp = request.urlopen(URL)
print(resp)

Вот ошибка:
Traceback (most recent call last):
  File "D:/Projects/different/url/ex1.py", line 11, in <module>
    resp = request.urlopen(URL)
  File "C:\Python33\lib\urllib\request.py", line 160, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python33\lib\urllib\request.py", line 479, in open
    response = meth(req, response)
  File "C:\Python33\lib\urllib\request.py", line 591, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python33\lib\urllib\request.py", line 511, in error
    result = self._call_chain(*args)
  File "C:\Python33\lib\urllib\request.py", line 451, in _call_chain
    result = func(*args)
  File "C:\Python33\lib\urllib\request.py", line 985, in http_error_407
    authority, req, headers)
  File "C:\Python33\lib\urllib\request.py", line 935, in http_error_auth_reqed
    scheme)
ValueError: AbstractBasicAuthHandler does not support the following scheme: 'Negotiate'

При всё при том, что через сторонний пакет requests у меня таки получилось получить ответ через прокси, буквально таким кодом:
import requests
 
resp = requests.get('http://www.yandex.ru', proxies={'http': 'http://my_name:my_pass@our.proxy.addr:8080'})
lorien
from urllib import request

URL = 'http://www.yandex.ru'
psw_mgr = request.HTTPPasswordMgrWithDefaultRealm()
psw_mgr.add_password(None, URL, 'my_name', 'my_pass')
auth = request.ProxyBasicAuthHandler(psw_mgr)
opener = request.build_opener(auth) # opener уже содержит необходимый адрес\порт прокси. Прописывать не нужно.
request.install_opener(opener)
resp = request.urlopen(URL)
print(resp)

Не вижу, где в этом коде задаётся адрес и порт прокси.
buddha
Смотри внимательнее…
opener = request.build_opener(auth) # opener уже содержит необходимый адрес\порт прокси. Прописывать не нужно.

Объясняю: если брать urllib, то метод urllib.request.getproxies() возвращает словарь, уже содержащий прокси на ftp, http, https.
lorien
Я грю про следующее. Есть код:

from urllib import request

URL = 'http://www.yandex.ru'
psw_mgr = request.HTTPPasswordMgrWithDefaultRealm()
psw_mgr.add_password(None, URL, 'my_name', 'my_pass')
auth = request.ProxyBasicAuthHandler(psw_mgr)
opener = request.build_opener(auth) # opener уже содержит необходимый адрес\порт прокси. Прописывать не нужно.
request.install_opener(opener)
resp = request.urlopen(URL)
print(resp)

Я не вижу, где здесь задаётся прокся, там написано, мол opener содержит уже адрес и порт прокси. Откуда там взялся адрес и порт прокси?
buddha
Я тоже этого не ожидал. Но видимо питон подцепляет адреса проксей из ОС.

Как я проверял(уже через requests):
import requests
  
resp = requests.get('http://www.google.ru', auth=requests.auth.HTTPProxyAuth('myname', 'mypass'))
print(resp.text)
# <!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head><meta content="Поиск информации в интернете: веб страницы, картинки, видео и многое другое."  ..............

Как видишь, тут я тоже прокси не прописывал…
Еще раз убедиться, что прокси уже подхвачены можно так:
>>> requests.utils.getproxies()
{'https': 'https://our.proxy.addr:8080', 'ftp': 'ftp://our.proxy.addr:8080', 'http': 'http://our.proxy.addr:8080'}
 
# тоже самое, что и выше
>>> from urllib import request
>>> request.getproxies()
{'https': 'https://our.proxy.addr:8080', 'ftp': 'ftp://our.proxy.addr:8080', 'http': 'http://our.proxy.addr:8080'}
lorien
Предлагаю для начала выложить код, который другой участник обсуждения может запустить и получить тот же эффект. Можно задать прокси прямо в коде?
s0rg
buddha
Я тоже этого не ожидал. Но видимо питон подцепляет адреса проксей из ОС.Как я проверял(уже через requests):
OC - Win?
buddha
Верно Windows.
s0rg
buddha
Верно Windows.
Скорее всего, берется системный прокси (тот, который в IE прописан)
ring0za
Negotiate - это один из типов аутентификации для http прокси, как у вас нагуглить неполучилось ума неприложу… можно было просто не передавать user/password. Или условия непозволяют?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB