0 votes

(Python) socket.gaierror sur toutes les adresses...sauf http://www.reddit.com ?

Je suis juste en train de jouer et j'essaie d'attraper des informations sur des sites web. Malheureusement, avec le code suivant :

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

Je reçois l'erreur suivante :

Traceback (dernier appel le plus récent) :
Fichier " D:\Development\Python\PyCrawler\PyCrawler.py ", ligne 10, dans sock.connect((url[0] + '://' + url[1],80)) Fichier "", ligne 1, in connect socket.gaierror : (11001, 'getaddrinfo failed')

La seule fois où je n'obtiens pas d'erreur est si l'url passée est http://www.reddit.com . Toutes les autres url que j'ai essayées donnent lieu à une erreur de type socket.gaierror. Quelqu'un peut-il expliquer cela ? Et éventuellement donner une solution ?

3voto

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

Ne faites pas cela, faites plutôt ceci :

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

connect s'attend à un nom d'hôte, pas à une URL.

En fait, vous devriez probablement utiliser quelque chose de plus haut niveau que les sockets pour faire du HTTP. Peut-être httplib .

3voto

Ali Afshar Points 22836

S'il vous plaît, s'il vous plaît, s'il vous plaît, s'il vous plaît, ne faites pas ça.

urllib et urllib2 sont vos amis.

Lire le manuel "manquant" d'urllib2 si vous avez des problèmes avec elle.

2voto

Avez-vous déjà modifié votre Fichier d'hôtes ? S'il y a une entrée pour Reddit mais pas grand-chose d'autre, cela pourrait expliquer le résultat unique de ce site.

1voto

Piotr Lesnicki Points 4169

Vous avez oublié de résoudre le nom d'hôte :

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

0voto

Utilisez urllib2. Ou BelleSoupe .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X