Почему у меня не работает urllib2? - PullRequest
4 голосов
/ 22 октября 2010

Я установил 3 разных скрипта Python на 32-битную машину Ubuntu 10.04 с Python 2.6.5.

Все они используют urllib2, и я всегда получаю эту ошибку:

urllib2.URLError: <urlopen error [Errno 110] Connection timed out>

Почему?

Примеры:

>>> import urllib2
>>> response = urllib2.urlopen("http://www.google.com")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 110] Connection timed out>



>>> response = urllib2.urlopen("http://search.twitter.com/search.atom?q=hello&rpp=10&page=1")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 110] Connection timed out>

UPDATE:

$ ping google.com
PING google.com (72.14.234.104) 56(84) bytes of data.
64 bytes from google.com (72.14.234.104): icmp_seq=1 ttl=54 time=25.3 ms
64 bytes from google.com (72.14.234.104): icmp_seq=2 ttl=54 time=24.6 ms
64 bytes from google.com (72.14.234.104): icmp_seq=3 ttl=54 time=25.1 ms
64 bytes from google.com (72.14.234.104): icmp_seq=4 ttl=54 time=25.0 ms
64 bytes from google.com (72.14.234.104): icmp_seq=5 ttl=54 time=23.9 ms
^C
--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4003ms
rtt min/avg/max/mdev = 23.959/24.832/25.365/0.535 ms


$ w3m http://www.google.com
w3m: Can't load http://www.google.com.

$ telnet google.com 80
Trying 1.0.0.0...
telnet: Unable to connect to remote host: Connection timed out

ОБНОВЛЕНИЕ 2:

Я дома и использую маршрутизатор и точку доступа: -. Однако я только что заметил, что Firefox не работает для меня. Но Chrome, Synaptic и другие браузеры, такие как Midori, Epiphany и т. Д. Работают.

ОБНОВЛЕНИЕ 3:

>>> useragent = 'Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Ubuntu/10.04 Chromium/6.0.472.62 Chrome/6.0.472.62 Safari/534.3)'
>>> request = urllib2.Request('http://www.google.com/')
>>> request.add_header('User-agent', useragent )
>>> urllib2.urlopen(request)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 110] Connection timed out>

ОБНОВЛЕНИЕ 4:

>>> socket.setdefaulttimeout(50)
>>> urllib2.urlopen('http://www.google.com')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/usr/lib/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 110] Connection timed out>

ОБНОВЛЕНИЕ 5:

Результаты Wireshark (анализатор пакетов):

Firefox: http://bit.ly/chtynm

Хром: http://bit.ly/9ZjILK

Мидори: http://bit.ly/cKilC4

midori - другой браузер, который работает для меня. Только Firefox не работает.

Ответы [ 8 ]

4 голосов
/ 22 октября 2010

Как было предложено, сначала устраните неполадки в настройке сети.

Сначала убедитесь, что вы можете пропинговать хост, к которому пытаетесь подключиться:

$ ping www.google.com

Затем попробуйте установить HTTP-соединение, используянапример w3m:

$ w3m http://www.google.com
3 голосов
/ 22 октября 2010

я могу думать только в одном лице прямо сейчас, XRobot, они вам не доверяют.

да они? они :) 1003 *

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

Прежде всего вы должны знать, что какой-то фильтр веб-сервера, который они содержат для вредоносных программ, таких как робот (может, они знают, что вы робот, хммм XRobot :)), как они это делают? Существует множество способов фильтрации: например, использование капчи на веб-странице, фильтрация по User-Agent ...

И поскольку ваш ICMP-пинг работает, браузер chrome работает, но не w3m, я предлагаю вам сменить User-Agent следующим образом:

user_agent = 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.10) Gecko/20100915\
              Ubuntu/10.04 (lucid) Firefox/3.6.10'

request = urllib2.Request('http://www.google.com/')
request.add_header('User-agent', user_agent )

opener.open(request)

возможно, у меня здесь паранойя, но, надеюсь, это поможет вам:)

1 голос
/ 22 октября 2010

Похоже, что Chrome и Synaptic могут использовать HTTP-прокси. В хроме зайдите в Настройки / Под капотом / Изменить настройки прокси. Проверьте настройки прокси-сервера gnome:

$ gconftool-2 -R /system/proxy
1 голос
/ 22 октября 2010

К какому URL вы пытаетесь подключиться? Причин этой ошибки может быть несколько, большинство из них связано с неверным именем или IP-адресом или с проблемой вашей ссылки на удаленный хост.

0 голосов
/ 29 января 2012

Я думаю, что есть некоторые проблемы с разрешениями. У меня была такая же проблема на моем Ubuntu 11.10. Звонок на python с помощью sudo помог мне. Дайте ему попытку;

jeffisabelle:~ $ python
Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> import urllib2
>>> response = urllib2.urlopen("http://www.google.com")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 394, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 412, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 372, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1201, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1171, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 110] Connection timed out>


jeffisabelle:~ $ sudo python
Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib2
>>> response = urllib2.urlopen("http://www.google.com")
>>> 
0 голосов
/ 15 апреля 2011

Я испытывал подобное поведение. В конце концов я вспомнил, что раньше запускал скрипт, который устанавливал прокси. Удаление прокси с urllib2 решило мою проблему. Это не объясняет ваших тайн telnet или w3m, но может помочь кому-то с частью urllib2.

Эта страница помогла мне понять, как удалить прокси.

http://www.decalage.info/en/python/urllib2noproxy

Вот код:

proxy_handler = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
0 голосов
/ 22 октября 2010

Выполните эти шаги по одному -

  1. Проверьте, подключены ли вы и работает ли он.ping google.com
  2. Если все хорошо, и ваше интернет-соединение просто медленное, то сделайте это -

    import socket
    socket.setdefaulttimeout(300) #in seconds.

Это увеличит время ожидания вашего сокета.

0 голосов
/ 22 октября 2010

Вы проверили ваше сетевое соединение? Что-то на другом конце не отвечает из-за разрыва соединения или отказа в соединении.

Кроме того, опубликуйте версию Python, которую вы используете.

UPDATE:

Это почти наверняка проблема сети. У меня также есть машина Ubuntu 10.04 (32-разрядная версия) с Python 2.6.5, которая является почти нетронутой установкой, и я не могу воспроизвести проблему.

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib2
>>> response = urllib2.urlopen("http://www.google.com")
>>> print response.read(100)
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><
...