2012-01-06 3 views
1

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

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

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

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

+0

Вы получаете трассировку стека, означающую исключение. Проводка всей трассировки стека облегчит диагностику. – mipadi

ответ

3

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

+0

Спасибо. Оказывается, это действительно проблема прокси. Я решил его с помощью 'proxypassmgr = urllib2.HTTPPasswordMgrWithDefaultRealm() proxypassmgr.add_password None ('HTTP: // ProxyAddress: номер_порта', имя пользователя, пароль) 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) ' –

0

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

Это делает то же самое, что и без ответа в третьей строке. Вот ошибки, которые он дает: Traceback (последний последний звонок): Файл «», строка 1, в? Файл «/usr/lib/python2.4/httplib.py», строка 626, в подключении self.sock.connect (sa) Файл «», строка 1, в соединении –

+0

Python 2.4? Сколько вам лет? –

+0

Как я уже сказал, вы пробовали с другим сайтом? Потому что просто переходите к 'http: // python.org/fish.html' в Chrome, вы получите 404, что станет причиной ошибки – ProfSmiles

0

я получаю 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

Да, удалите часть« рыбы ». Эта страница не существует, и я не знаю, где я ее получил. Сейчас я пытаюсь использовать только сайт www.python.org, но он все еще не работает. –

2

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

Смежные вопросы