我只是在玩,我正试图从网站上获取信息。不幸的是,使用以下代码:
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。有谁能解释一下?并可能提供解决方案?
答案 0 :(得分:3)
sock.connect((url[0] + '://' + url[1],80))
不要这样做,而是这样做:
sock.connect((url[1], 80))
connect
需要主机名,而不是网址。
实际上,您应该使用比套接字更高级别的东西来执行HTTP。也许是httplib。
答案 1 :(得分:3)
答案 2 :(得分:2)
你有没有改变过Hosts file?如果它有一个Reddit的条目,但没有其他的,这可能解释了该网站的独特结果。
答案 3 :(得分:1)
您忘记解析主机名:
addr = socket.gethostbyname(url[1])
...
sock.connect((addr,80))
答案 4 :(得分:0)
使用urllib2。或BeautifulSoup。