urllib2.URLError: <urlopen error [Errno 111] Connection refused>

OO~ posted @ 2013年3月15日 15:28 in python , 25411 阅读

    在说道这个问题之前,我想先说下python中的str.find()函数,因为我几次用到这个函数时,都有点出了乱子。

    str.find()查找的是一个长字符串中的子串,看如下一个例子的输出:

  1 #!/usr/bin/python
  2 #coding = utf-8
  3 
  4 import string
  5 import sys
  6 
  7 def main():
  8     s = "Today is Friday, I am so happy!"
  9     print s.find("I")
 10     print s.find("I am")
 11 
 12 if __name__ == '__main__':
 13     main()

    结果都是17,所以要知道,这里find匹配的是最开始的一个独立成的字符!!!这样以来,我们在分析网页的时候就要注意这个问题了!


    下面开始说下我遇到的问题,urllib2.URLError: <urlopen error [Errno 111] Connection refused>。我测试了好久,甚至运行了之前可以运行成功的python代码,但是最后都以失败告终。

    这里要注意,我们通过这个库可以得到网络上的资源(一个url对应的就是一个资源,要区分ping,ip以及url的区别),只是connection有问题,查阅了很多资料,最后发现是我的电脑上安装了一个代理工具goagent。在最后具体解决的时候是每次将代理打开之后再运行python代码,抓取成功了。

    PS:虽然最后成功了,但是我还是不太明白,我的默认浏览器没有设置代理,为什么urllib2在获取网络资源的时候仍然要通过代理呢??我也看了urllib2的相关资料,猜测可能是该库在具体的实现上有代理起优先的算法把?--------有待解决!!

Avatar_small
OO~ 说:
2013年3月15日 15:29

如果有牛人知道我活命不太理解之处的话,我会很感激的~~

Avatar_small
OO~ 说:
2013年3月15日 15:31

打错了,囧,应该是“我上面提出的”
linux的拼音输入法总是要求太苛刻

Avatar_small
依云 说:
2013年3月15日 16:23

不贴代码就想解决问题……

我猜你设置了 http_proxy 环境变量给 Python?urllib2.py 464 行,默认的 opener 是会读取指示代理服务器的环境变量的。

Avatar_small
OO~ 说:
2013年3月16日 11:07

这个,代码就是平常的抓取程序!在设置goagent之前,我以前写的抓取程序是可以运行的,但是设置之后,以前那些程序也运行不了了,所以没代码!

至于您说的,我设置了http_proxy环境变量给python,我没有进行这样的设置!肯定+确定

Avatar_small
OO~ 说:
2013年3月16日 11:10

摘录的一些使用urllib2出错的可能:
If the URL refers to a non-
existent domain, a DNS request will result in error and you will get
an "urllib2.URLError: <urlopen error (-2, 'Name or service not
known')>". If the name resolves but the host is not reachable, the
connect code will timeout (eventually) and result in an
"urllib2.URLError: <urlopen error (113, 'No route to host')>". If the
host exists but does not have a web server running, you will get an
"urllib2.URLError: <urlopen error (111, 'Connection refused')>". If a
webserver is running but the requested page does not exist, you will
get an "urllib2.HTTPError: HTTP Error 404: Not Found".

Avatar_small
依云 说:
2013年3月16日 17:42

@OO~: 你这每个错误的意义都不一样。我觉得你应当检查下你的网络是否通畅。或者是你设置 goagent 的时候把网络设置弄坏了。——所以,你的 goagent 是怎么设置的?

Avatar_small
OO~ 说:
2013年3月16日 22:39

我检查了的,网络绝对通畅,你说的后者可能会是的!我的是ubuntu系统,具体就是下载代码,运行,在chrome下设置了代理,firefox下没设置!每次翻墙的的时候,运行python prox.y!

Avatar_small
依云 说:
2013年3月16日 23:05

@OO~: Chrome 的图形界面的网络设置?那个是设置系统全局的代理用的。

Avatar_small
OO~ 说:
2013年3月17日 21:34

恩,在chrome下用了一个插件swithcyproxy进行了自动设置!这个是全局的???将系统也进行了设置????囧!

Avatar_small
依云 说:
2013年3月17日 22:08

@OO~: 那个应该不是全局的。

Avatar_small
OO~ 说:
2013年3月18日 09:56

那,经历这样一个循环之后,回到原点,这个问题到底是怎么回事呢?

Avatar_small
依云 说:
2013年3月18日 12:51

@OO~: 代码呢?env 的输出呢?

Avatar_small
OO~ 说:
2013年3月19日 08:40

 给你一个代码:

#!/usr/bin/python
#coding = utf-8

import urllib2
import sys
import string
from re import sub

def analysisPage(html, txtfile):
    html = sub(r'[\s]+', '', html)
    news_html = sub(r'^.*"ADcon0">', '', html)
    while news_html.find('newslist') != -1:
        end = news_html.find("</div>")
        news = news_html[:end]
        news_html = news_html[end + 5:]
        info = sub(r'[\s]+', ',', sub(r'<[^<>]*>', ' ', news))
        txtfile.write(info)
    txtfile.write("\n\n")
        print info

def getResult(url):
    txtfile = open("cnbeta.txt", "w")
    html = urllib2.urlopen(url).read()
    html = html.decode('gbk', 'ignore').encode('utf-8')
    #print html
    analysisPage(html, txtfile)
    txtfile.close()

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print "Usage: g_cnbate.py the url you want to grab"
        exit(1)
    getResult(sys.argv[1])

在我开了代理的时候,可以抓取到数据,但是没开代理的情况下,出现这样的错误:

Traceback (most recent call last):
  File "g_cnbet.py", line 37, in <module>
    getResult(sys.argv[1])
  File "g_cnbet.py", line 27, in getResult
    html = urllib2.urlopen(url).read()
  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 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error [Errno 111] Connection refused>
 

跪求解答了!

Avatar_small
依云 说:
2013年3月19日 17:19

再贴在相同终端执行 env 命令的输出。

Avatar_small
OO~ 说:
2013年3月19日 20:39

@依云: LC_PAPER=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
SSH_AGENT_PID=1865
LC_MONETARY=en_US.UTF-8
GPG_AGENT_INFO=/tmp/keyring-oyFsVA/gpg:0:1
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=db25c78d61c8d253e92b6a5d0000000d-1363696493.389138-102798138
WINDOWID=62914566
LC_NUMERIC=en_US.UTF-8
GNOME_KEYRING_CONTROL=/tmp/keyring-oyFsVA
USER=sophia
http_proxy=http://127.0.0.1:8087/

上面给出了部分,感觉好像是被修改了额!!汗
我该如何该过来呢?

Avatar_small
依云 说:
2013年3月19日 22:09

@OO~: 在执行命令前执行 unset http_proxy
不过你最好还是弄清楚为什么会有这个环境变量。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter