urllib2.URLError: <urlopen error [Errno 111] Connection refused>
OO~
posted @ 2013年3月15日 15:28
in python
, 25541 阅读
在说道这个问题之前,我想先说下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的相关资料,猜测可能是该库在具体的实现上有代理起优先的算法把?--------有待解决!!
2013年3月15日 15:29
如果有牛人知道我活命不太理解之处的话,我会很感激的~~
2013年3月15日 15:31
打错了,囧,应该是“我上面提出的”
linux的拼音输入法总是要求太苛刻
2013年3月15日 16:23
不贴代码就想解决问题……
我猜你设置了 http_proxy 环境变量给 Python?urllib2.py 464 行,默认的 opener 是会读取指示代理服务器的环境变量的。
2013年3月16日 11:07
这个,代码就是平常的抓取程序!在设置goagent之前,我以前写的抓取程序是可以运行的,但是设置之后,以前那些程序也运行不了了,所以没代码!
至于您说的,我设置了http_proxy环境变量给python,我没有进行这样的设置!肯定+确定
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".
2013年3月16日 17:42
@OO~: 你这每个错误的意义都不一样。我觉得你应当检查下你的网络是否通畅。或者是你设置 goagent 的时候把网络设置弄坏了。——所以,你的 goagent 是怎么设置的?
2013年3月16日 22:39
我检查了的,网络绝对通畅,你说的后者可能会是的!我的是ubuntu系统,具体就是下载代码,运行,在chrome下设置了代理,firefox下没设置!每次翻墙的的时候,运行python prox.y!
2013年3月16日 23:05
@OO~: Chrome 的图形界面的网络设置?那个是设置系统全局的代理用的。
2013年3月17日 21:34
恩,在chrome下用了一个插件swithcyproxy进行了自动设置!这个是全局的???将系统也进行了设置????囧!
2013年3月17日 22:08
@OO~: 那个应该不是全局的。
2013年3月18日 09:56
那,经历这样一个循环之后,回到原点,这个问题到底是怎么回事呢?
2013年3月18日 12:51
@OO~: 代码呢?env 的输出呢?
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>
跪求解答了!
2013年3月19日 17:19
再贴在相同终端执行 env 命令的输出。
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/
上面给出了部分,感觉好像是被修改了额!!汗
我该如何该过来呢?
2013年3月19日 22:09
@OO~: 在执行命令前执行 unset http_proxy
不过你最好还是弄清楚为什么会有这个环境变量。
2013年3月20日 14:13
enen