Опит за достъп до интернет чрез 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 прокси за използване и когато не може да намери правилния, той просто увисва и в крайна сметка изчаква.

Така че първо трябва да разберете кой прокси трябва да се използва, проверете опциите на вашия браузър (Инструменти -> Интернет опции -> Връзки -> Настройка на LAN... в 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
Това прави същото нещо без отговор за третия ред. Ето грешките, които дава: Проследяване (последното последно извикване): Файл ‹stdin›, ред 1, в ? Файл /usr/lib/python2.4/httplib.py, ред 626, в Connect self.sock.connect(sa) Файл ‹string›, ред 1, в Connect - person Brad Elliott; 06.01.2012
comment
Python 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 сървър, той увисва известно време, докато изтече времето за изчакване. Можете да го съкратите, като подадете параметъра за изчакване на 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