PYTHON Concaténation URL entraine erreur 400

PYTHON Concaténation URL entraine erreur 400 - Python - Programmation

Marsh Posté le 19-02-2014 à 17:02:30    

Le but, rapido:
j'ai deux fichiers avec des noms et je les mets dans un string http pour faire une requete, sur google,bing, yahoo ou autre mais ça plante invariablement au même endroit
 

Code :
  1. #EVIDEMMENT J'IMPORTE LES LIBRAIRIES ADEQUATES
  2. user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36'
  3. headers = { 'User-Agent' : user_agent }
  4. fichier = open('NOMS1.txt','r')
  5. for a in range (1,100000,1):
  6.     lecture = fichier.readline()
  7.     print lecture
  8.     if nom == "":
  9.         break
  10.    
  11.     fichier2 = open('NOMS2.txt','r')
  12.     for b in range (1,100000,1):
  13.         lecture2 = fichier2.readline()
  14.         if nom2 == "":
  15.             break
  16.         elif nom2 <> "":
  17.             if nom <> nom2:
  18.                 nom = str(nom)
  19.                 nom2 = str(nom2)
  20.                 ADRESSE = "%s%s %s" % ("http://www.bing.com/search?q=",nom,nom2)
  21.                 req = urllib2.Request(ADRESSE, None, headers)
  22.                 response = urllib2.urlopen(req)
  23.                 TXWEB = response.read()


Traceback (most recent call last):
  File "test.py", line 51, in <module> (EN FAIT LA LIGNE 25 DE MON PROJET CI DESSUS)
    response = urllib2.urlopen(req)
  File "C:\Python\lib\urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "C:\Python\lib\urllib2.py", line 410, in open
    response = meth(req, response)
  File "C:\Python\lib\urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python\lib\urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "C:\Python\lib\urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "C:\Python\lib\urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 400: Bad Request

 
PIRE:
Au lieu de

Code :
  1. ADRESSE = "%s%s %s" % ("http://www.bing.com/search?q=",nom,nom2)

j'ai mis

Code :
  1. ADRESSE = "%s%s %s" % ("http://www.bing.com/search?q=","PIF","HERCULE" )


et ça marche...
 
Alors si quelqu'un pouvait me conseiller... (Fred?)
parce que là je m'arrache les cheveux

Reply

Marsh Posté le 19-02-2014 à 17:02:30   

Reply

Marsh Posté le 20-02-2014 à 14:59:57    

En admettant que ton code soit bien indenté, tu te rends compte du nombre de fois que tu ouvres ton fichier NOMS2.txt ?
 
Tu te rends compte du nombre de requêtes que tu fais sur le même serveur en quelques millisecondes?
 
Vérifies aussi les valeurs de nom et nom2 avec des print.
 

Reply

Marsh Posté le 20-02-2014 à 17:46:06    

Argggghhhh
 
Oui, j'ai mis une attente en bout de boucle
J'ai fait des print,  
J'ai demandé à m'afficher la valeur ORD de chaque CHR de nom et nom2 pour voir si aucun CHR bizarre n'était caché
 
Et ça plante


Message édité par erwan83 le 20-02-2014 à 17:46:21
Reply

Marsh Posté le 22-02-2014 à 21:39:47    

Normal, tu envoies "http://www.bing.com/search?q=foo bar", c'est pas valide, tu peux pas avoir un espace dans une URL.
 
1. les valeurs doivent être urlencodées pour remplacer les caractères "spéciaux" par des valeurs échappées (genre espace par %20). urllib.urlencode fait ça
2. `<>` c'est déprécié, utiliser `!=`
3. le step 1 est la valeur par défaut de range
4. d'ailleurs elles servent à quoi tes itérations sur des range là? Pourquoi tu itères pas directement sur les fichiers?
5. utiliser `with` avec une ouverture de fichier pour s'assurer de bien le fermer
 

Citation :

ADRESSE = "%s%s %s" % ("http://www.bing.com/search?q=","PIF","HERCULE" )


Chez moi ça marche pas [:spamafote]

>>> urllib2.urlopen('http://www.bing.com/search?q=PIF HERCULE')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 410, in open
    response = meth(req, response)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 523, in http_response
    'http', request, response, code, msg, hdrs)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 448, in error
    return self._call_chain(*args)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request
>>>  


 

Code :
  1. with open('NOMS1.txt', 'rb') as name1:
  2.    with open('NOMS2.txt', 'rb') as name2:
  3.        for a, b in itertools.product(name1, name2):
  4.            if a == b: continue
  5.            url = 'http://bing.com/search?%s' % urllib.urlencode({'q': name1 + ' ' + name2})
  6.            response = urllib2.urlopen(urllib2.Request(address, None, headers))
  7.            result = response.read()


 
Notes que scraper les pages de cette manière me semble un bon moyen de se faire ipban rapidement. Tu ferais mieux d'utiliser les API adéquates.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 22-02-2014 à 23:23:30    

Merci.
Je ne compte pas me faire bannir, c'est un code vite monté mais je ne veux pas faire 1 000 000 de requetes, j'en aurais pour toute une vie :)
 
Le petit code ci-dessus est-il fonctionnel ?
 
Merci pour les tuyaux en tout cas

Reply

Marsh Posté le 23-02-2014 à 08:07:47    

Il n'est pas testé. Mais il ne devrait pas être loin de ce que j'ai compris du code d'origine: pour chaque paire (mot1, mot2) possible où mot1 != mot2, faire une recherche bing


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed