Попытка получить доступ к Интернету с помощью urllib2 в Python - PullRequest
1 голос
/ 06 января 2012

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

Ответы [ 4 ]

4 голосов
/ 07 января 2012

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

2 голосов
/ 06 января 2012

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

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

>>> response = urllib2.urlopen('http://cs.princeton.edu/fish.html', timeout=5)
Traceback (most recent call last):
  ...
urllib2.URLError: <urlopen error timed out>
0 голосов
/ 06 января 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()
...