Попытка получить доступ к Интернету с помощью urllib2 в Python

Я пытаюсь написать программу, которая (среди прочего) будет получать текст или исходный код с заранее определенного веб-сайта. Я изучаю Python для этого, и большинство источников говорят мне использовать urllib2. В качестве теста я попробовал этот код:

import urllib2
response = urllib2.urlopen('http://www.python.org')
html = response.read()

Вместо того, чтобы действовать каким-либо ожидаемым образом, оболочка просто сидит, как будто ждет какого-то ввода. Нет даже ">>>"" или "...". Единственный способ выйти из этого состояния - [ctrl]+c. Когда я это делаю, я получаю целую кучу сообщений об ошибках, например

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/m/mls/pkg/ix86-Linux-RHEL5/lib/python2.5/urllib2.py", line 124, in urlopen
    return _opener.open(url, data)
  File "/m/mls/pkg/ix86-Linux-RHEL5/lib/python2.5/urllib2.py", line 381, in open
    response = self._open(req, data)

Буду признателен за любые отзывы. Есть ли инструмент, отличный от urllib2, или вы можете дать совет, как это исправить. Я использую сетевой компьютер на своей работе, и я не совсем уверен, как настроена оболочка или как это может повлиять на что-либо.


person Brad Elliott    schedule 06.01.2012    source источник
comment
Вы получаете трассировку стека, что означает, что было выбрано исключение. Публикация всей трассировки стека облегчит диагностику.   -  person mipadi    schedule 06.01.2012
comment
В моем случае это была проблема с брандмауэром. Мой локальный брандмауэр LuLu блокировал все запросы Python. Удаление этого правила решило эту проблему.   -  person asmaier    schedule 02.10.2019


Ответы (4)


С вероятностью 99,999 % это проблема прокси. Python невероятно плохо определяет правильный HTTP-прокси для использования, и когда он не может найти правильный, он просто зависает и в конечном итоге истекает время ожидания.

Итак, сначала вам нужно выяснить, какой прокси следует использовать, проверить параметры вашего браузера (Инструменты -> Свойства обозревателя -> Подключения -> Настройка локальной сети... в IE и т. д.). Если он использует скрипт для автоматической настройки, вам нужно будет получить скрипт (который должен быть каким-то javascript) и выяснить, куда должен идти ваш запрос. Если сценарий не указан, а опция «автоматически определять» отмечена галочкой, вы можете просто спросить какого-нибудь ИТ-специалиста в вашей компании.

Я предполагаю, что вы используете Python 2.x. Из документов Python на urllib :

# Use http://www.someproxy.com:3128 for http proxying
proxies = {'http': 'http://www.someproxy.com:3128'}
filehandle = urllib.urlopen(some_url, proxies=proxies)

Обратите внимание, что смысл в том, что ProxyHandler вычисляет значения по умолчанию, — это то, что уже происходит, когда вы используете urlopen, поэтому, вероятно, это не сработает.

Если вам действительно нужен urllib2, вам нужно указать ProxyHandler, как в примере в этой страницы. Аутентификация может потребоваться или не потребоваться (обычно это не так).

person Giacomo Lacava    schedule 06.01.2012
comment
Спасибо. Оказывается, это действительно была проблема с прокси. Я решил это, используя proxypassmgr = urllib2.HTTPPasswordMgrWithDefaultRealm() proxypassmgr.add_password(None, 'http://proxyaddress:portnumber', username, password) authinfo = urllib2.ProxyBasicAuthHandler(proxypassmgr) proxy_support = urllib2.ProxyHandler({"http" : "http://cache1.lexmark.com:80"}) opener = urllib2.build_opener(proxy_support, authinfo) urllib2.install_opener(opener) req = urllib2.Request(theurl) - person Brad Elliott; 28.02.2012

Это не очень хороший ответ на вопрос «Как сделать это с помощью urllib2», но позвольте мне предложить python-запросы. Вся причина, по которой он существует, заключается в том, что автор нашел urllib2 громоздким беспорядком. И он, наверное, прав.

person Tom    schedule 06.01.2012

Это очень странно, вы пробовали другой URL?
В противном случае есть HTTPLib, но он сложнее. Вот ваш пример с использованием HTTPLib

import httplib as h
domain = h.HTTPConnection('www.python.org')
domain.connect()
domain.request('GET', '/fish.html')
response = domain.getresponse()
if response.status == h.OK:
    html = response.read()
person ProfSmiles    schedule 06.01.2012
comment
Это делает то же самое без ответа с третьей строкой. Вот ошибки, которые он выдает: Traceback (последний последний вызов): Файл ‹stdin›, строка 1, в ? Файл /usr/lib/python2.4/httplib.py, строка 626, при подключении self.sock.connect(sa) Файл ‹string›, строка 1, при подключении - person Brad Elliott; 06.01.2012
comment
Питон 2.4? Сколько лет вашей установке? - person Has QUIT--Anony-Mousse; 07.01.2012
comment
как я уже сказал, вы пробовали с другого сайта? Потому что просто переход к http://python.org/fish.html в Chrome приводит к ошибке 404, что и является причиной ошибки. - person ProfSmiles; 07.01.2012

Я почти сразу получаю ошибку 404 (без зависаний):

>>> import urllib2
>>> response = urllib2.urlopen('http://www.python.org/fish.html')
Traceback (most recent call last):
  ...
urllib2.HTTPError: HTTP Error 404: Not Found

Если я попытаюсь связаться с адресом, на котором не работает HTTP-сервер, он зависнет на некоторое время, пока не истечет время ожидания. Вы можете сократить его, передав параметр timeout в urlopen:

>>> response = urllib2.urlopen('http://cs.princeton.edu/fish.html', timeout=5)
Traceback (most recent call last):
  ...
urllib2.URLError: <urlopen error timed out>
person jterrace    schedule 06.01.2012
comment
Да, удалите рыбную часть. Такой страницы не существует, и я не знаю, откуда я ее взял. Сейчас я пытаюсь это сделать только с www.python.org, но он все еще не работает. - person Brad Elliott; 06.01.2012