Попытка доступа к Интернету с помощью 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)
</module></stdin>

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

4 ответа

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

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

Я предполагаю, что вы используете 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, как пример в этой странице. Аутентификация может потребоваться или не потребоваться (обычно это не так).


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


Я получаю ошибку 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-сервер, он довольно долго висит, пока не произойдет тайм-аут. Вы можете сократить его, передав параметр таймаута на urlopen:

>>> response = urllib2.urlopen('http://cs.princeton.edu/fish.html', timeout=5)
Traceback (most recent call last):
 ...
urllib2.URLError:


Это очень странно, попробовали ли вы другой 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()

licensed under cc by-sa 3.0 with attribution.