(Python) socket.gaierror на каждом адресе ... кроме http://www.reddit.com? - PullRequest
0 голосов
/ 20 ноября 2008

Я просто играю и пытаюсь получить информацию с веб-сайтов. К сожалению, со следующим кодом:

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')

Я получаю следующую ошибку:

Traceback (последний последний вызов):
файл "D: \ Разработка \ Python \ PyCrawler \ PyCrawler.py", строка 10, в sock.connect ((url [0] + ': //' + url [1], 80)) Файл "", строка 1, in connect socket.gaierror: (11001, 'getaddrinfo fail')

Единственный раз, когда я не получаю сообщение об ошибке, это если переданный URL-адрес равен http://www.reddit.com. Каждый другой URL-адрес, который я пробовал, содержит socket.gaierror. Кто-нибудь может объяснить это? А возможно дать решение?

Ответы [ 5 ]

3 голосов
/ 20 ноября 2008
sock.connect((url[0] + '://' + url[1],80))

Не делайте этого, вместо этого сделайте следующее:

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

connect ожидает имя хоста, а не URL.

На самом деле, вы, вероятно, должны использовать что-то более высокое, чем сокеты, для выполнения HTTP. Может быть httplib .

3 голосов
/ 20 ноября 2008

Пожалуйста, пожалуйста, пожалуйста, пожалуйста, пожалуйста, пожалуйста, не делайте этого.

urllib и urllib2 - ваши друзья.

Прочтите «отсутствующее» руководство urllib2 , если у вас возникли проблемы с ним.

2 голосов
/ 06 марта 2009

Вы когда-нибудь изменяли файл Hosts ? Если в нем есть запись для Reddit, но не больше, это может объяснить уникальный результат этого сайта.

1 голос
/ 20 ноября 2008

вы забыли разрешить имя хоста:

addr = socket.gethostbyname(url[1])
...
sock.connect((addr,80))
0 голосов
/ 06 марта 2009

Используйте urllib2. Или BeautifulSoup .

...