每个地址的(Python)socket.gaierror ...除了http://www.reddit.com?

时间:2008-11-19 23:00:58

标签: python http sockets

我只是在玩,我正试图从网站上获取信息。不幸的是,使用以下代码:

import sys
import socket
import re
from urlparse import urlsplit

url = urlsplit(sys.argv[1])


sock = socket.socket()
sock.connect((url[0] + '://' + url[1],80))
path = url[2]
if not path:
    path = '/'

print path
sock.send('GET ' + path + ' HTTP/1.1\r\n'
    + 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/0.3.154.9 Safari/525.19\r\n'
    + 'Accept: */*\r\n'
    + 'Accept-Language: en-US,en\r\n'
    + 'Accept-Charset: ISO-8859-1,*,utf-8\r\n'
    + 'Host: 68.33.143.182\r\n'
    + 'Connection: Keep-alive\r\n'
    + '\r\n')

我收到以下错误:

  

追踪(最近的呼叫最后):
  文件   “d:\开发\ Python的\ PyCrawler \ PyCrawler.py”   第10行,在       sock.connect((url [0] +'://'+ url [1],80))文件“”,第1行,   在connect socket.gaierror中:(11001,   'getaddrinfo失败')

我唯一没有收到错误的是,如果传递的网址是http://www.reddit.com。我尝试过的每个其他网址都会出现socket.gaierror。有谁能解释一下?并可能提供解决方案?

5 个答案:

答案 0 :(得分:3)

sock.connect((url[0] + '://' + url[1],80))

不要这样做,而是这样做:

sock.connect((url[1], 80))

connect需要主机名,而不是网址。

实际上,您应该使用比套接字更高级别的东西来执行HTTP。也许是httplib

答案 1 :(得分:3)

请请请请不要这样做。

urllib和urllib2是你的朋友。

如果您遇到问题,请阅读the "missing" urllib2 manual

答案 2 :(得分:2)

你有没有改变过Hosts file?如果它有一个Reddit的条目,但没有其他的,这可能解释了该网站的独特结果。

答案 3 :(得分:1)

您忘记解析主机名:

addr = socket.gethostbyname(url[1])
...
sock.connect((addr,80))

答案 4 :(得分:0)

使用urllib2。或BeautifulSoup